我正在尝试在提交之前向表单添加一些验证。这是我正在使用的:
$('#add_upload').submit(function(e){
var file = $('#realupload_1').val();
var p_name = $('#p_name').val();
var p_price = $('#p_price').val();
var thumb = $('#realupload_2').val();
var p_desc = $('#p_desc').val();
if(file == ''){
e.preventDefault();
alert('Please select a valid product file');
}else if(p_name == '' || p_name == 'ebook name'){
e.preventDefault();
alert('Please set a valid product name');
}else if(p_price == '0.00' || Math.ceil(p_price) == 0){
e.preventDefault();
alert('Please set a valid price for your product');
}else if(thumb == ''){
alert('Please select a valid product image for your product');
e.preventDefault();
}else if(p_desc == '' || p_desc == 'Description...'){
e.preventDefault();
alert('Please add a description for your product');
}else{
//$('#submita').attr("disabled","disabled").val("Please wait....");
}
});
以上在Firefox和Chrome上完美运行。但是,我遇到了IE9的问题 - 它进入了else语句,但它没有提交表单!一旦我再次按下提交按钮,它会要求我确保我的上传文件字段不为空!我不确定它是如何清除价值的。
当我删除上述验证时,表单提交正常。但是,我需要先验证。
我尝试过:
以上没有任何区别。
我非常感谢这里的帮助,因为我浪费了2个小时!
我的问题与this question类似,但尚未确定答案。
Here is the HTML如果有帮助的话。
好吧,我已经把问题缩小到这个问题JS代码:
$('#file_upload_1').click(function(){
$('#realupload_1').trigger('click');
});
如您所见,我正在触发单击以打开文件对话框。 IE9似乎不喜欢这样,它必须是一个安全问题,如果文件输入被自动触发,表单将不会提交。
有人可以证实吗?
答案 0 :(得分:3)
我要赞成Bhuvan Rikka的评论,但在看过Wirey的代码之后,我认为这可能类似于同意Hindenberg需要一层油漆。
标记,脚本和可用性方面存在一些需要注意的问题。
e.returnValue = false
我通过以下更改扩展了wirey's fiddle。
试试吧。请注意,如果弹出窗口显示第一个无效字段的消息,您可以看到所有无效字段吗?
这是清理过的HTML。
<form id="add_upload" action="/echo/json/" method="post" enctype="multipart/form-data">
<div class="standard-white-row upload-ebook-row">
<!-- The label is no longer an input. Removed ID from label -->
<div class="fakeupload">Select your ebook file…</div>
<input id="eBookFile" type="file" class="realupload required defaultInvalid" />
</div>
<div class="standard-white-row">
<div class="field-ebook-name">
<input id="eBookName" name="eBookName" type="text" value="eBook Name" class="required defaultInvalid" />
</div>
<div class="field-ebook-price">
<input id="eBookPrice" name="eBookPrice" type="text" value="0.00" class="required defaultInvalid" />
</div>
</div>
<div class="standard-white-row upload-preview-img-row">
<!-- The label is no longer an input. Removed ID from label -->
<div class="fakeupload">Select your thumbnail image…</div>
<input id="thumbNail" name="thumbNail" type="file" class="realupload required defaultInvalid" />
</div>
<div class="standard-white-row">
<textarea id="Description" name="Description" cols="" rows="" class="required defaultInvalid">Description…</textarea>
</div>
<div class="standard-white-row standard-white-submit">
<input id="submitButton" type="submit" value="Add ebook" />
</div>
<div class="errorSummary incomplete"></div>
</form>
对于表单验证功能,我们首先链接到http://ajax.aspnetcdn.com/ajax/jquery.validate/1.9/jquery.validate.min.js处的Validate插件,然后使用defaultInvalid方法扩展validate。
// Validation extension to invalidate a field if the value is the default.
// Add the 'defaultInvalid' css class to inputs with a default value.
jQuery.validator.addMethod("defaultInvalid", function (value, element) {
return !(element.value == element.defaultValue);
});
第一种验证方法将显示无效字段旁边的验证错误。
第二个(并已注释掉)验证方法将验证错误放在表单下方的摘要中。
$(document).ready(function () {
// Invalid fields will receive the 'errorHilite' css class
// error message will be inline adjacent to the invalid field
$('#add_upload').validate({
keyup: false,
onfocusout: false,
onclick: false,
errorElement: "span",
errorClass: "errorHilite"
});
// Invalid fields will receive the 'errorHilite' css class.
// Error messages are summarized in the element specified by errorLabelContainer.
/*
$('#add_upload').validate({
errorLabelContainer: $(".errorSummary"),
keyup: false,
onfocusout: false,
onclick: false,
errorElement: "div",
errorClass: "errorHilite"
});
*/
});
查看Validate API Reference了解更多选项。
答案 1 :(得分:3)
IE9中的安全性不允许您手动触发该输入字段的单击。
您可以尝试将输入包装在Label中,然后触发标签上的单击,这可能有效:)
<label id="labelID" for="inputID">
<input id="inputID" type="file" />
</label>
$('#labelID').trigger('click');
虽然我同意其他答案,但还有更好的方法来实现你想要实现的目标。