提交表单时,文件输入(标签)没有值 (AJAX)

File input (label) has no value when submitting the form (AJAX)

提问人:Astw41 提问时间:8/1/2022 最后编辑:Astw41 更新时间:8/1/2022 访问量:186

问:

我有一个表格。它有display:none,所以为了设置它的样式,我使用了一个标签。表单中的每个必需输入都有一个“必需”类。当它为空时,表单将不会发送,并且空输入周围有一个红色边框。问题是,当我尝试验证我的表单时(“必需”类在标签上,因为输入文件具有 display:none)并且表单验证读取它时,它总是空的(无论我是否上传文件)。<input type="file">

// head
<script>
        $(function () {

        $('#form').on('submit', function (e) {

            e.preventDefault();
            
            let sendForm = true;
            $('.required').each(function(){
                if ($(this).val() == ''){
                    $('#add').addClass('error');
                    $(this).addClass('error');

                    sendForm = false;
                } else {
                    $(this).removeClass('error');
                }
            })

            if (sendForm) {
                $.ajax({
                    type: "post",
                    url: 'php/php.php',
                    data: new FormData(this),
                    processData: false,
                    contentType: false,
                    success: function () {
                        document.getElementById("text").innerHTML = "success";
                        document.getElementById("add").style.border = "2px solid green";
                        $("#add").fadeOut(3000);
                    },
                    error: function () {
                        document.getElementById("text").innerHTML = "error";
                        document.getElementById("add").style.border = "2px solid red";
                    }
                });
            }

        });

        });
</script>
<form id="form" method="POST" action="php/php.php" enctype="multipart/form-data".>

<input type="text" name="Name" id="name" class="required"><br>

Image (jpg, png):
  <label for="upload_image" id="file_style" class="required">File</label>
                            
  <input type="file" style="display:none;" id="upload_image" name="Image" accept="image/*" onchange="loadFile(event)">
  <br>
  <img id="output">
                            
  <script>
    var loadFile = function(event) {
      var output = document.getElementById('output');
      output.src = URL.createObjectURL(event.target.files[0]);
      output.onload = function() {
        URL.revokeObjectURL(output.src)
      }
    };
  </script>

  <input type="number" name="Ing1" class="required">
  <input type="text" name="Ing2" class="required"><br>

  <input type="submit" name="Add" id="add">

</form>
.error{
    border: solid 12px red;
}

(这只是一个最小的工作示例,还有更多代码。这就是为什么有“无用”功能的原因。 我怎样才能做到,如果文件被上传,验证脚本不会将其视为未定义?

JavaScript jQuery AJAX 表单 验证

评论

0赞 epascarello 8/1/2022
为什么标签元素需要?也许您应该使用另一个类或属性来选择所需的元素。

答:

1赞 Mina 8/1/2022 #1

首先,您没有名为“loadFile”的函数,我不确定您是否需要它。

其次,在 ,u 循环抛出 中,你需要获取与该标签关联的标签,所以一种解决方案是在获取标签的属性后通过获取它,然后通过 .$('.required').eachlabelsinputidforfilesinput.files.length

.error{
    border: solid 12px red;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<head>
<script>
        $(function () {

        $('#form').on('submit', function (e) {

            e.preventDefault();
            
            let sendForm = true;
            $('.required').each(function(index, label){
                const input = document.getElementById(label.getAttribute('for'))
                if (!input.files.length){
                    $('#add').addClass('error');
                    $(this).addClass('error');

                    sendForm = false;
                } else {
                    $(this).removeClass('error');
                    $('#add').removeClass('error');
                }
            })

            if (sendForm) {
                $.ajax({
                    type: "post",
                    url: 'php/php.php',
                    data: new FormData(this),
                    processData: false,
                    contentType: false,
                    success: function () {
                        document.getElementById("text").innerHTML = "success";
                        document.getElementById("add").style.border = "2px solid green";
                        $("#add").fadeOut(3000);
                    },
                    error: function () {
                        document.getElementById("text").innerHTML = "error";
                        document.getElementById("add").style.border = "2px solid red";
                    }
                });
            }

        });

        });
</script>
</head>


<body>
<form id="form" method="POST" action="php/php.php" enctype="multipart/form-data".>
Image (jpg, png):
  <label for="upload_image" id="file_style" class="required">File</label>
                            
  <input type="file" style="display:none;" id="upload_image" name="Image" accept="image/*">
  <br>

  <input type="submit" name="Add" id="add">
  
  <div id="text"></div>

</form>
</body>

评论

0赞 Astw41 8/1/2022
我编辑了我的帖子。有更多的代码、输入等。我只是想举一个最小的工作例子。我真的不确定如何更改您的代码以使其正常工作(目前表单未发送,并且没有其他操作,例如添加“错误”类)。
1赞 Astw41 8/1/2022 #2

我想我找到了解决方案。我添加了这段代码:

$('.required2').each(function(){
  if ($(this).val() == ''){
    $('#file_style').addClass('error');
    sendForm = false;
  } else {
    $('#file_style').removeClass('error');
  }
})

进入我的提交功能。我需要更改一些东西以满足我的需要,但它可以正常工作。感谢大家的帮助和想法如何解决它!