【问题标题】:How can I apply this validation function to all inputs?如何将此验证功能应用于所有输入?
【发布时间】:2021-04-08 01:16:41
【问题描述】:

我有这段代码可以验证一个输入文件,但我需要验证多个字段(因为用户可以根据需要添加尽可能多的“输入文件”),现在不知道如何验证。我一直在尝试使用循环,但没有任何结果(主要是因为即使我在 w3school 一遍又一遍地阅读它,我也不理解它们)。

https://jsfiddle.net/ElenaMcDowell/2xrqp6zg/2/

$( ".postreplyForm" ).submit(function( event ) {
var fileBox = $('.post-file').val(); //This is the Class of the input file
if (fileBox === '') {
   //If there is no file
   return;
} else {
   //File format
   var fileExtension = ['jpg', 'jpeg', 'png', 'mp3', 'mp4', 'pdf', 'pps', 'ppt', 'pptx', 'xls', 'doc', 'docx', 'txt'];
   if ($.inArray($('.post-file').val().split('.').pop().toLowerCase(), fileExtension) == -1) {
      $(".errorFile").html('<br><center><p class="signuperror">File format not allowed.</p></center><br>');
   } else {
      $(".errorFile").html(' ');
      //File size
      var fileSize = $('.post-file')[0].files[0].size;
      if (fileSize > 1000000) {
         $(".errorFile").html('<br><center><p class="signuperror">The file is too big.</p></center><br>');
      } else {
         $(".errorFile").html(' ');
         return;
      }

   }

}
});

【问题讨论】:

  • 如果可以有多个.post-file,那么您需要遍历它,并单独处理每个。 $('.post-file').each((index, file) =&gt; { ...do stuff... });
  • 我尝试使用 each(),但随后验证一个正确的并提交表单,然后再验证另一个(我故意上传较重或格式错误以查看验证是否有效)。 :(
  • 在循环之外,var valid = true; 如果在任何时候遇到错误,valid = false。完成循环后,if (!valid) event.preventDefault()
  • 抱歉,还是不行。 :(

标签: javascript jquery loops file input


【解决方案1】:

您可以使用 $('.post-file')[0].files 获取所有值,然后遍历每个文件并检查条件,然后在您的 div errorFiles 中打印一些消息。另外,使用一些变量并将其设置为true,如果任何条件不满足设置为false,取决于此变量,请阻止您的表单提交。

演示代码

$(".postreplyForm").submit(function(event) {
  var fileBox = $('.post-file').val();
  if (fileBox === '') {
    return false; //prevent form to submit
  } else {
    //File format
    var fileExtension = ['jpg', 'jpeg', 'png', 'mp3', 'mp4', 'pdf', 'pps', 'ppt', 'pptx', 'xls', 'doc', 'docx', 'txt'];
    var flag = true; //decalre this
    var fileArray = $('.post-file')[0].files; //get all files
    $(".errorFile").html('');
    //loop through files
    $.each(fileArray, function(i, v) {
      name = v.name; //name of file
      fileSize = v.size; //size of file
      console.log(name);
      if ($.inArray(name.split('.').pop().toLowerCase(), fileExtension) == -1) {
        flag = false;
        $(".errorFile").html('<br><center><p class="signuperror">File format not allowed.</p></center><br>');
      } else {
        if (fileSize > 1000000) {
          $(".errorFile").html('<br><center><p class="signuperror">The file is too big.</p></center><br>');
          flag = false;
        }
      }
    })
  }
  //check not true prevnt submit
  if (!flag) {
    return false;
  } else {
    return true;
  }

});
.errorFile {
  color: red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form class="create-mode postreplyForm" method="post" action="a.php" name="post" enctype="multipart/form-data">
  <table class="table-newpost">
    <tr>
      <td colspan="5"><br>
        <div style="font-weight: bold; font-size: 14px; margin-bottom: -10px;">Attach file</div>
        <br>
        <span>File formats allowed: (.jpg, .jpeg, .png, .mp3, .mp4, .pdf, .zip, .rar, .pps, .ppt, .pptx, .xls, .doc, .docx, .txt, .rtf)</span>
        <br><br>
        <div class="fileBox">
          <div style="display: flex; margin-bottom: 2px;">
            <input type="file" name="file[]" id="fileID1" class="post-file" multiple="multiple">
            <div id="1" class="fileBtn fileDeleteInPost" title="Delete file">x</div>
            <div class="fileBtn add-file" title="Add file">+</div>
          </div>
        </div>
        <div class="errorFile"></div>
      </td>
    </tr>
    <tr>
      <td colspan="5" style="text-align: right;">
        <input type="hidden" name="reply-by" value="<?php echo $_SESSION['userId']; ?>">
        <button type="submit" name="submit-postreply" id="Miau">Submit</button>
      </td>
    </tr>
  </table>
</form>

【讨论】:

  • 感谢您的帮助,但它仍然只检查第一个文件而不是其他文件。我不明白为什么,但是如果第一个输入返回 true,那么无论第二个文件太大,它都会提交表单并且应该返回 false。
  • 你试过运行上面的代码吗?上面的代码是否也显示相同的行为?
  • 是的,我确实运行了上面的代码,它确实具有相同的行为。 :(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-29
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多