如何破坏jQueryvalidation和任何进一步的提交尝试?

我有以下jQueryvalidation插件的代码….基本上提交,我将所有内容都滑动并淡出…唯一的问题是,如果你足够快,你可以多次提交表单。 如何确保在输入上按下回车键(或点击该提交按钮)不会进一步提交?

基本上会发生什么,是表单会在没有javascript的情况下加载action属性中的url,所以纯粹解绑不起作用…(即使它确实如此,我总是按下输入/点击足够快得到它做了几个….)

jQuery('.desired').validate({ debug: true, rules: { email: { required: true, email: true } }, wrapper: "div", messages: { email: "Please enter a valid email address." }, errorPlacement: function(error, element) { error.hide().appendTo(element.parent()).hide().slideDown(); }, errorClass: 'help-text', submitHandler: function(form) { var $ = jQuery; var url = $(form).attr('action'); var query = $(form).serialize(); $.ajax({ url: url, type: "POST", data: query, success: function() { $("

Thanks") .insertAfter(jQuery(form)) .css('height', function(i,h) { $(this).hide() return h; }); // $(form).css('height', $(form).height()); $(form).slideUp('slow'); $(form).fadeOut({ queue: false, duration: 'slow' }); // $('.help-jquery').fadeIn('slow'); $('.help-jquery') .css('opacity', 0) .slideDown('fast') .animate( { opacity: 1 }, { queue: false, duration: 'slow' } ); //$('.desired submit').click(function(){ //return false; //}); }, error: function() { console.log('Error: did not submit properly'); }, complete: function(e) { //$('.desired').unbind('submit'); //e.preventDefault(); //return false; } }); }, success: function(error,element){ }, highlight: function(error){ // This empty function needs to be here for this to work } });

你使用unbind()在正确的轨道上,它解决了你的一半问题,因为它会有效地抑制表单提交上的validation。

要解决后半部分,只需通过注册相应的处理程序,在解除绑定后,只需将表单的submit事件中性化:

 $(form).unbind("submit").submit(function() { return false; }); 

使用布尔变量,如下所示:

 var didValidate = false; if(!didValidate) { jQuery('.desired').validate({ //... your code here }); } 

在您的AJAX成功函数中,将didValidate设置为true。

在进行任何validation之前,请使用1或0的变量,检查变量是否等于0.如果不是0,则不执行任何操作。 如果是,继续。 validation通过后,将变量设置为1,以便不再进行validation。

使用事件命名空间:

‘。’后面的名字。 让我们更具体地针对处理程序。

这在提交处理程序的顶部:

 $(form).bind('submit.temp_submit_hold', function(e){ e.preventDefault(); e.stopPropagation(); //added this in case the plugin's handler func uses bubbling return false; } ); 

这是ajax调用的完整回调的顶部:

 $('.desired').unbind('submit.temp_submit_hold'); 

完整看完您的评论后再做一点解释。 在onsubmit处理程序开始工作之后,就会立即发出preventDefault的时间。 完成时,您希望再次启用它。 因此,我们绑定一个func,它使用prevent default来阻止它,然后将它解除绑定以切换行为。 我还添加了stopPropagation,以防插件使用委托/冒泡。

可能最简单的方法是向你的提交工具添加这样的东西

 submitHandler: function(form) { var $ = jQuery; if ( $.data(form, "submit") ) > "" return false; $.data(form, "submit", "in progress"); // .. the rest of your handler } 

如果您希望稍后再次提交表单,请在成功时删除.data()。

使用.destroy()方法。

这个问题及其答案都很古老。 所以从那时起,开发人员添加了一个.destroy()方法来从表单中分离validation插件。

销毁此validation程序实例,释放资源并取消注册事件。

 // Initialize the validation plugin on your form var validator = $("#myform").validate(); // Remove validation from your form validator.destroy(); // After this point `#myform` is back to its original state without validation. 

https://jqueryvalidation.org/Validator.destroy/


要停止多个提交,请在插件的submitHandler函数中禁用submit按钮。 submitHandler仅在表单有效且您已单击提交按钮时触发。)

 submitHandler: function(form) { // validation & submit success, so disable submit button $("#yourSubmitButton").prop('disabled', true); // your ajax code here return false; }