jQuery .validate() submitHandler 未触发
jQuery .validate() submitHandler not firing
我正在加载一个对话框,其中包含使用 Bootbox.js 即时构建的表单,并且我正在使用 jQuery 验证插件验证用户输入。
验证工作正常,但是当表单填写成功时 submitHandler
被忽略。
怎么了?
submitHandler: function(form) {
alert("Submitted!");
var $form = $(form);
$form.submit();
}
请参阅下面的完整示例。我看过其他提出类似问题的帖子。不幸的是,他们似乎在页面上呈现了表单,而我正在通过 jQuery.
呈现我的表单
$(document).on("click", "[data-toggle=\"contactAdmin\"]", function() {
bootbox.dialog({
title: "Contact admin",
buttons: {
close: {
label: 'Close',
className: "btn btn-sm btn-danger",
callback: function() {}
},
success: {
label: "Submit",
className: "btn btn-sm btn-primary",
callback: function() {
$("#webteamContactForm").validate({
rules: {
requestType: {
required: true
}
},
messages: {
requestType: {
required: "Please specify what your request is for",
}
},
highlight: function(a) {
$(a).closest(".form-group").addClass("has-error");
},
unhighlight: function(a) {
$(a).closest(".form-group").removeClass("has-error");
},
errorElement: "span",
errorClass: "help-blocks",
errorPlacement: function(error, element) {
if (element.is(":radio")) {
error.appendTo(element.parents('.requestTypeGroup'));
} else { // This is the default behavior
error.insertAfter(element);
}
},
submitHandler: function(form) {
alert("Submitted!");
var $form = $(form);
$form.submit();
}
}).form();
return false;
}
}
},
message: '<div class="row"> ' +
'<div class="col-md-12"> ' +
'<form id="webteamContactForm" class="form-horizontal" method="post"> ' +
'<p>Please get in touch if you wish to delete this content</p>' +
'<div class="form-group"> ' +
'<div class="col-md-12"> ' +
'<textarea id="message" name="message" class="form-control input-md" rows="3" cols="50">This email is to notify you the creator is putting a request for the following item\n\n' +
this.attributes.getNamedItem("data-url").value + '\n\n' + '</textarea> ' +
'<span class="help-block">Feel free to change the message and add more information. Please ensure you always provide the link.</span> </div> ' +
'</div> ' +
'<div class="form-group requestTypeGroup"> ' +
'<label class="col-md-4 control-label" for="requestType">This request is for:</label> ' +
'<div class="col-md-4"> <div class="radio"> <label for="Edit"> ' +
'<input type="radio" name="requestType" id="requestType-0" value="Edit"> ' +
'Editing </label> ' +
'</div><div class="radio"> <label for="Delete"> ' +
'<input type="radio" name="requestType" id="requestType-1" value="Delete"> Deletion</label> ' +
'</div> ' +
'</div> </div>' +
'</form> </div> </div>'
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootbox.js/4.4.0/bootbox.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.js"></script>
<a data-toggle="contactAdmin" data-title="help" data-url="http:/www.mydomain.com/some-url" href="#">Contact Web team</a>
检查 jsFiddle 的 DOM,两个问题变得明显。
您的 "submit" <button>
是 type="button"
.
您的 "submit" 按钮在 <form></form>
容器之外。
如果您希望 jQuery 验证插件自动捕获 "submit" 按钮的 click
事件...
- 按钮必须是
type="submit"
- 按钮必须在
<form></form>
容器内。
如果您希望插件按预期运行,则必须满足这两个条件。
您还错误地将 .validate()
方法放置在模态对话框 "submit" 按钮的 success
回调中。
.validate()
方法仅用于初始化插件,应调用一次 表单创建后。
编辑:
在尝试了这个之后,很明显 Bootbox modal plugin 可能有一些严重的限制会干扰表单的提交。
我正在初始化验证插件在对话框打开后。
我在 "submit" 中使用 .valid()
方法来触发验证测试。
我可以初始化验证并正常工作,但是在实际提交表单之前对话框被关闭了。也许有一个解决方案,但在查看 Bootbox 的文档后,它并不明显。
https://jsfiddle.net/vyaw3ucd/2/
编辑 2:
根据 OP 的解决方案...
bootbox.dialog({
// other options,
buttons: {
success: {
label: "Submit",
className: "btn btn-sm btn-primary",
callback: function () {
if ($("#webteamContactForm").valid()) {
var form = $("#webteamContactForm");
form.submit(); // form submits and dialog closes
} else {
return false; // keeps dialog open
}
}
}
}
});
但是,通过简单地直接使用提供的 form
参数,在使用 jQuery 验证插件的 submitHandler
选项时不会出现任何错误。
submitHandler: function (form) {
console.log("Submitted!");
form.submit();
}
感谢Sparky的帮助,你提供的解决方案给了我答案。 submitHandler 似乎对提交逻辑造成了一些混乱。
我删除了 submitHandler 并将以下内容添加到成功回调中,一切都按预期进行
success: {
label: "Submit",
className: "btn btn-sm btn-primary",
callback: function () {
if($("#webteamContactForm").valid()){
var form = $("#webteamContactForm");
form.submit();
} else {
return false;
}
}
}
我知道这是一个老问题 post 但我想我会分享我对类似问题的解决方法。我无法通过按回车来提交我的表格,但我可以让它在输入时进行验证。所以我使用了链接方法,现在我可以在输入时提交我的表单。
jQuery:
//Variables created without the keyword var, are always global, even if they are created inside a function.
var form = $('#<?echo $PAGEID?>');
var FormError = $('.alert-danger',form);
var success = $('.alert-success',form);
form.keypress(function(e){
if(e.which == 13){ //TRIGGER SUBMIT THROUGH ENTER
document.getElementById('defaultActionButton').click();
}
}).validate({
focusInvalid: false, // do not focus the last invalid input
onkeyup: false,
ignore: ".ignore", //required for hidden input validation ie: hiddenRecaptcha
rules:{
"TYPE": {
required: true,
},
"MSG": {
required: true,
rangelength:[40,1000]
},
"CONTACT": {
required: {
depends: "#newuser:checked"
}
},
"EMAIL": {
required: true,
email: {
depends: function() {
if(!$("#newuser:checked"))
return true;
else
return false;
}
},
HTH_TelephoneEmail: {
depends: function() {
if($("#newuser:checked"))
return true;
else
return false;
}
}
},
hiddenRecaptcha: {
required: function () {
if (grecaptcha.getResponse() == '') {
return true;
} else {
return false;
}
}
}
},
messages: { // custom messages for form validation input
"TYPE": {
required: 'Please select an option as it pertains to your inquiry'
},
"MSG": {
required: 'Please provide some content as it pertains to your inquiry'
},
"CONTACT": {
required: "Please enter a contact person or company"
},
hiddenRecaptcha: {
required: function() {
$(".g-recaptcha:first").tooltip("enable").tooltip("show");
}
}
},
showErrors: function(errorMap, errorList) {
// Clean up any tooltips for valid elements
$.each(this.validElements(), function (index, element) {
element = $(element);
NoError_ToolTip(element);
});
// Create new tooltips for invalid elements
$.each(errorList, function (index, error) {
element = $(error.element);
message = error.message;
Error_ToolTip(element,message);
});
},
invalidHandler: function (event, validator) { //display error alert on form submit
success.hide();
$(document).scrollTop( $(".form-body").offset().top );
},
submitHandler: function () {
Submit_Complete(); //fires ajax call
}
});
您应该更改提交按钮的名称,因为存在命名冲突。例如,尝试将其从 name="submit"
更改为 name="other"
。
我正在加载一个对话框,其中包含使用 Bootbox.js 即时构建的表单,并且我正在使用 jQuery 验证插件验证用户输入。
验证工作正常,但是当表单填写成功时 submitHandler
被忽略。
怎么了?
submitHandler: function(form) {
alert("Submitted!");
var $form = $(form);
$form.submit();
}
请参阅下面的完整示例。我看过其他提出类似问题的帖子。不幸的是,他们似乎在页面上呈现了表单,而我正在通过 jQuery.
呈现我的表单$(document).on("click", "[data-toggle=\"contactAdmin\"]", function() {
bootbox.dialog({
title: "Contact admin",
buttons: {
close: {
label: 'Close',
className: "btn btn-sm btn-danger",
callback: function() {}
},
success: {
label: "Submit",
className: "btn btn-sm btn-primary",
callback: function() {
$("#webteamContactForm").validate({
rules: {
requestType: {
required: true
}
},
messages: {
requestType: {
required: "Please specify what your request is for",
}
},
highlight: function(a) {
$(a).closest(".form-group").addClass("has-error");
},
unhighlight: function(a) {
$(a).closest(".form-group").removeClass("has-error");
},
errorElement: "span",
errorClass: "help-blocks",
errorPlacement: function(error, element) {
if (element.is(":radio")) {
error.appendTo(element.parents('.requestTypeGroup'));
} else { // This is the default behavior
error.insertAfter(element);
}
},
submitHandler: function(form) {
alert("Submitted!");
var $form = $(form);
$form.submit();
}
}).form();
return false;
}
}
},
message: '<div class="row"> ' +
'<div class="col-md-12"> ' +
'<form id="webteamContactForm" class="form-horizontal" method="post"> ' +
'<p>Please get in touch if you wish to delete this content</p>' +
'<div class="form-group"> ' +
'<div class="col-md-12"> ' +
'<textarea id="message" name="message" class="form-control input-md" rows="3" cols="50">This email is to notify you the creator is putting a request for the following item\n\n' +
this.attributes.getNamedItem("data-url").value + '\n\n' + '</textarea> ' +
'<span class="help-block">Feel free to change the message and add more information. Please ensure you always provide the link.</span> </div> ' +
'</div> ' +
'<div class="form-group requestTypeGroup"> ' +
'<label class="col-md-4 control-label" for="requestType">This request is for:</label> ' +
'<div class="col-md-4"> <div class="radio"> <label for="Edit"> ' +
'<input type="radio" name="requestType" id="requestType-0" value="Edit"> ' +
'Editing </label> ' +
'</div><div class="radio"> <label for="Delete"> ' +
'<input type="radio" name="requestType" id="requestType-1" value="Delete"> Deletion</label> ' +
'</div> ' +
'</div> </div>' +
'</form> </div> </div>'
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/bootbox.js/4.4.0/bootbox.min.js"></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
<script src="https://ajax.aspnetcdn.com/ajax/jquery.validate/1.13.0/jquery.validate.js"></script>
<a data-toggle="contactAdmin" data-title="help" data-url="http:/www.mydomain.com/some-url" href="#">Contact Web team</a>
检查 jsFiddle 的 DOM,两个问题变得明显。
您的 "submit"
<button>
是type="button"
.您的 "submit" 按钮在
<form></form>
容器之外。
如果您希望 jQuery 验证插件自动捕获 "submit" 按钮的 click
事件...
- 按钮必须是
type="submit"
- 按钮必须在
<form></form>
容器内。
如果您希望插件按预期运行,则必须满足这两个条件。
您还错误地将 .validate()
方法放置在模态对话框 "submit" 按钮的 success
回调中。
.validate()
方法仅用于初始化插件,应调用一次 表单创建后。
编辑:
在尝试了这个之后,很明显 Bootbox modal plugin 可能有一些严重的限制会干扰表单的提交。
我正在初始化验证插件在对话框打开后。
我在 "submit" 中使用
.valid()
方法来触发验证测试。
我可以初始化验证并正常工作,但是在实际提交表单之前对话框被关闭了。也许有一个解决方案,但在查看 Bootbox 的文档后,它并不明显。
https://jsfiddle.net/vyaw3ucd/2/
编辑 2:
根据 OP 的解决方案...
bootbox.dialog({
// other options,
buttons: {
success: {
label: "Submit",
className: "btn btn-sm btn-primary",
callback: function () {
if ($("#webteamContactForm").valid()) {
var form = $("#webteamContactForm");
form.submit(); // form submits and dialog closes
} else {
return false; // keeps dialog open
}
}
}
}
});
但是,通过简单地直接使用提供的 form
参数,在使用 jQuery 验证插件的 submitHandler
选项时不会出现任何错误。
submitHandler: function (form) {
console.log("Submitted!");
form.submit();
}
感谢Sparky的帮助,你提供的解决方案给了我答案。 submitHandler 似乎对提交逻辑造成了一些混乱。
我删除了 submitHandler 并将以下内容添加到成功回调中,一切都按预期进行
success: {
label: "Submit",
className: "btn btn-sm btn-primary",
callback: function () {
if($("#webteamContactForm").valid()){
var form = $("#webteamContactForm");
form.submit();
} else {
return false;
}
}
}
我知道这是一个老问题 post 但我想我会分享我对类似问题的解决方法。我无法通过按回车来提交我的表格,但我可以让它在输入时进行验证。所以我使用了链接方法,现在我可以在输入时提交我的表单。
jQuery:
//Variables created without the keyword var, are always global, even if they are created inside a function.
var form = $('#<?echo $PAGEID?>');
var FormError = $('.alert-danger',form);
var success = $('.alert-success',form);
form.keypress(function(e){
if(e.which == 13){ //TRIGGER SUBMIT THROUGH ENTER
document.getElementById('defaultActionButton').click();
}
}).validate({
focusInvalid: false, // do not focus the last invalid input
onkeyup: false,
ignore: ".ignore", //required for hidden input validation ie: hiddenRecaptcha
rules:{
"TYPE": {
required: true,
},
"MSG": {
required: true,
rangelength:[40,1000]
},
"CONTACT": {
required: {
depends: "#newuser:checked"
}
},
"EMAIL": {
required: true,
email: {
depends: function() {
if(!$("#newuser:checked"))
return true;
else
return false;
}
},
HTH_TelephoneEmail: {
depends: function() {
if($("#newuser:checked"))
return true;
else
return false;
}
}
},
hiddenRecaptcha: {
required: function () {
if (grecaptcha.getResponse() == '') {
return true;
} else {
return false;
}
}
}
},
messages: { // custom messages for form validation input
"TYPE": {
required: 'Please select an option as it pertains to your inquiry'
},
"MSG": {
required: 'Please provide some content as it pertains to your inquiry'
},
"CONTACT": {
required: "Please enter a contact person or company"
},
hiddenRecaptcha: {
required: function() {
$(".g-recaptcha:first").tooltip("enable").tooltip("show");
}
}
},
showErrors: function(errorMap, errorList) {
// Clean up any tooltips for valid elements
$.each(this.validElements(), function (index, element) {
element = $(element);
NoError_ToolTip(element);
});
// Create new tooltips for invalid elements
$.each(errorList, function (index, error) {
element = $(error.element);
message = error.message;
Error_ToolTip(element,message);
});
},
invalidHandler: function (event, validator) { //display error alert on form submit
success.hide();
$(document).scrollTop( $(".form-body").offset().top );
},
submitHandler: function () {
Submit_Complete(); //fires ajax call
}
});
您应该更改提交按钮的名称,因为存在命名冲突。例如,尝试将其从 name="submit"
更改为 name="other"
。