JQuery 需要表单验证在 Chrome 浏览器中失败
JQuery form validation Required failing in Chrome browser
我正在使用 JQuery 来验证表单。该表单有两个字段。一个是文本,另一个是文件。每个字段都使用所需的方法。在没有选择名称或文件的情况下单击提交时,表单将在没有这两个值的情况下提交。
但是,这适用于桌面 Firefox 56.0,适用于我的 phone 的 Chrome 63.0.03239.11 但不适用于我的桌面 Chrome 版本 63.0.3239.108(官方构建)( 64 位)。
另外,我注意到,如果我没有以表单形式上传文件并且只是使用 $(form).serialize()
来捕获表单文本字段,则必需的验证有效。我应该就此提交 Chrome 错误报告吗?
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-validation@1.17.0/dist/jquery.validate.js"></script>
<script> var myPath = "/timelines/post_photo.php";</script>
<form id="foo">
<div class="form-group">
<!-- Child id -->
<label for="name">Child's name:</label>
<select multiple class="form-control" name="child" id="name">
<option style="display:none" disabled selected value></option>
<option value="1"> Jim Bergin </option>
<option value="2"> Harry Potter </option>
<option value="3"> John Carpenter </option>
<option value="4"> Johnny Ive </option>
<option value="5"> Steve Jobs </option>
</select>
</div>
<!-- Upload Photo -->
<div class="form-group">
<label for="photo">Upload photo:</label>
<input type="file" class="form-control-file" name="photo" id="photo" />
<img src="/timelines/images/loading.gif" class="img-fluid" id="loading-indicator" style="display:none" />
<input type="submit" value="Submit" class="btn btn-primary">
</div>
</form>
验证脚本
$( document ).ready(function() {
var request;
$("#foo").validate({
//Our required fields
rules: {
child: {
required: true
},
photo: {
required: true
}
},
submitHandler: function(form) {
$('#loading-indicator').show();
//Create variable to hold the form data
var fd = new FormData($(this)[0]);
//Create request function
request = $.ajax({
url: myPath,
type: "POST",
enctype: 'multipart/form-data',
data: fd,
processData: false,
contentType: false,
cache: false
});
request.done(function(response) {
// Show and fade out success message
});
request.fail(function (response) {
// Show an error message
});
}
});
});
你这里有几个问题:
<select multiple class="form-control" name="child" id="name">
<option style="display:none" disabled selected value></option>
<option value="1"> Jim Bergin </option>
<option value="2"> Harry Potter </option>
<option value="3"> John Carpenter </option>
<option value="4"> Johnny Ive </option>
<option value="5"> Steve Jobs </option>
</select>
为了验证 select
元素,第一个 option
必须包含 value=""
。由于您的仅包含 value
,它 可能 被解释为 value=""
以外的内容,具体取决于浏览器。
你有display:none
,所以验证插件可能不会考虑这个元素,因为默认情况下,隐藏元素被忽略。
你有 disabled
属性,所以验证插件可能也不会考虑这个元素。
最后,您有一个 selected
属性。因此,如果此 option
以编程方式为 "selected",则自动满足 required
规则并且验证此元素没有意义。
我认为上面的四个要点彼此有些矛盾,因此可以解释为什么您在不同的浏览器中看到不同的结果。
我正在使用 JQuery 来验证表单。该表单有两个字段。一个是文本,另一个是文件。每个字段都使用所需的方法。在没有选择名称或文件的情况下单击提交时,表单将在没有这两个值的情况下提交。
但是,这适用于桌面 Firefox 56.0,适用于我的 phone 的 Chrome 63.0.03239.11 但不适用于我的桌面 Chrome 版本 63.0.3239.108(官方构建)( 64 位)。
另外,我注意到,如果我没有以表单形式上传文件并且只是使用 $(form).serialize()
来捕获表单文本字段,则必需的验证有效。我应该就此提交 Chrome 错误报告吗?
<script src="https://code.jquery.com/jquery-3.2.1.min.js" integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4=" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery-validation@1.17.0/dist/jquery.validate.js"></script>
<script> var myPath = "/timelines/post_photo.php";</script>
<form id="foo">
<div class="form-group">
<!-- Child id -->
<label for="name">Child's name:</label>
<select multiple class="form-control" name="child" id="name">
<option style="display:none" disabled selected value></option>
<option value="1"> Jim Bergin </option>
<option value="2"> Harry Potter </option>
<option value="3"> John Carpenter </option>
<option value="4"> Johnny Ive </option>
<option value="5"> Steve Jobs </option>
</select>
</div>
<!-- Upload Photo -->
<div class="form-group">
<label for="photo">Upload photo:</label>
<input type="file" class="form-control-file" name="photo" id="photo" />
<img src="/timelines/images/loading.gif" class="img-fluid" id="loading-indicator" style="display:none" />
<input type="submit" value="Submit" class="btn btn-primary">
</div>
</form>
验证脚本
$( document ).ready(function() {
var request;
$("#foo").validate({
//Our required fields
rules: {
child: {
required: true
},
photo: {
required: true
}
},
submitHandler: function(form) {
$('#loading-indicator').show();
//Create variable to hold the form data
var fd = new FormData($(this)[0]);
//Create request function
request = $.ajax({
url: myPath,
type: "POST",
enctype: 'multipart/form-data',
data: fd,
processData: false,
contentType: false,
cache: false
});
request.done(function(response) {
// Show and fade out success message
});
request.fail(function (response) {
// Show an error message
});
}
});
});
你这里有几个问题:
<select multiple class="form-control" name="child" id="name">
<option style="display:none" disabled selected value></option>
<option value="1"> Jim Bergin </option>
<option value="2"> Harry Potter </option>
<option value="3"> John Carpenter </option>
<option value="4"> Johnny Ive </option>
<option value="5"> Steve Jobs </option>
</select>
为了验证
select
元素,第一个option
必须包含value=""
。由于您的仅包含value
,它 可能 被解释为value=""
以外的内容,具体取决于浏览器。你有
display:none
,所以验证插件可能不会考虑这个元素,因为默认情况下,隐藏元素被忽略。你有
disabled
属性,所以验证插件可能也不会考虑这个元素。最后,您有一个
selected
属性。因此,如果此option
以编程方式为 "selected",则自动满足required
规则并且验证此元素没有意义。
我认为上面的四个要点彼此有些矛盾,因此可以解释为什么您在不同的浏览器中看到不同的结果。