【问题标题】:If that or that condition not met, do that如果那个或那个条件不满足,那么做
【发布时间】:2019-11-03 14:27:41
【问题描述】:

我在一个表单上有 3 个输入文件。如果文件类型与 jpeg、gif、png、bmp 或 pdf 文件扩展名不匹配,或者文件大小大于 2mb,我想disable 提交。我有两个条件工作。

我的问题描述如下:用户提交带有 rar 的上传,提交被禁用,这有效。同样在下一个输入文件上,用户提交了一个大于 2mb 的文件,提交仍然被禁用,没关系。但是,当用户使用小于 2MB 的文件更改该文件时,提交已启用。但是,第一个输入(带有 rar 文件)没有更新。 它不会再次检查所有三个输入文件!!!

所以,我想以这样一种方式设置条件,即所有输入都必须良好才能启用提交,而不仅仅是其中一个。

我尝试使用if (x || y),但没有奏效。你可以看现场演示here

function ValidateSize(file) {
  var FileSize = file.files[0].size / 1024 / 1024; // in MB
  var fileExtension = ['jpeg', 'jpg', 'png', 'gif', 'pdf', 'bmp'];
  if (FileSize > 2) {
    alert('El archivo excede los 2MB. Prueba a enviarlo con menor tamaño o no podrás enviar la solicitud.');
    // $(file).val(''); //for clearing with Jquery
    $("#submit").attr("disabled", true);
  } else {
    $("#submit").attr("disabled", false);
  }
  if ($.inArray($(file).val().split('.').pop().toLowerCase(), fileExtension) == -1) {
    alert("Solo estos formatos son soportados");
    $("#submit").attr("disabled", true);
  }
}
<input name="cv-becario" class="ewd-otp-file-input" onchange="ValidateSize(this)" type="file" value="" required="">

<input name="certificado-de-notas-becario" class="ewd-otp-file-input" onchange="ValidateSize(this)" type="file" value="" required="">

<input name="titulo-becario" class="ewd-otp-file-input" onchange="ValidateSize(this)" type="file" value="" required="">

【问题讨论】:

  • 首先,你可以使用&lt;input type="file" accept=".xls,.xlsx" /&gt;
  • @Dementic 这增加了改进的用户体验,我也会推荐它,但应该注意的是,这只是向操作系统提供建议,并不会阻止用户上传不被接受的文件。
  • @JohnPavek 同意了。另一方面,OP 试图完成的任务已经完成了十亿次,他最好不要重新发明轮子。

标签: javascript


【解决方案1】:

在启用/禁用按钮之前,您需要检查所有这些的有效性。

我会修改函数以接收元素并返回 true/false

然后,不要使用内联 onchange,而是使用 jQuery 事件侦听器并执行以下操作:

var $fileInputs = $('.ewd-otp-file-input').change(function() {
  // filter collection of valid inputs
  var $validInputs = $fileInputs.filter(function() {
    return ValidateSize(this)
  });
  // if lengths match then all are valid
  var isValid = $fileInputs.length === $validInputs.length;
  // enable/disable based on all valid or not
  $("#submit").prop("disabled", !isValid);

});

// function probably needs some fine tuning
function ValidateSize(file) {
   // if empty input is valid ??
   if(!file.files.length){
     return true;
   }

  var FileSize = file.files[0].size / 1024 / 1024; // in MB
  var fileExtension = ['jpeg', 'jpg', 'png', 'gif', 'pdf', 'bmp'];
  if (FileSize > 2) {
    console.log('Over 2 meg')
    return false
  } else {
    if ($.inArray($(file).val().split('.').pop().toLowerCase(), fileExtension) == -1) {
      console.log("Solo estos formatos son soportados");
      return false
    } else {
      return true
    }
  }    
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<input name="cv-becario" class="ewd-otp-file-input" onchange="ValidateSize(this)" type="file" value="" required=""><br>

<input name="certificado-de-notas-becario" class="ewd-otp-file-input" onchange="ValidateSize(this)" type="file" value="" required=""><br>

<input name="titulo-becario" class="ewd-otp-file-input" onchange="ValidateSize(this)" type="file" value="" required=""><br>

<input name="enviar" id="submit" type="submit" value="submit"><br>

而不是使用 alert() 在函数中做一些额外的工作会让你为每个输入添加/删除错误消息

【讨论】:

  • 一个包含 html 代码的可运行演示,就像 OP 中的演示一样。
  • @UdoE。随意添加所需的额外 html 并将其转换为 sn-p。老实说,我不介意测试基本的 UI 代码以获得答案,但我对花时间对具有各种文件类型的多个文件输入进行调试不感兴趣。我的答案是一个可靠的指南,可以通过 OP 进行调整和扩展
  • 我正在尝试制作自定义错误消息,我插入了 $('.ewd-otp-file-input').after('

    Mayor de 2MB.

    ') ;在 if (FileSize > 2) { 但它在所有 3 个输入上插入错误,不仅在以前上传的文件上,我如何只能在以前上传的文件输入上插入消息?谢谢。
  • 函数中使用$(file).after('&lt;p&gt;Mayor de 2MB.&lt;/p&gt;'); ... $(file)$('.ewd-otp-file-input')的当前实例
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2019-03-21
  • 1970-01-01
  • 2021-09-08
  • 2021-10-07
  • 2019-03-22
  • 2013-08-15
  • 2020-11-20
相关资源
最近更新 更多