Jquery 使用“时多次提交的表格”;提交;回调和$.ajax来发布它
我观察到以下代码出现了一些奇怪的行为:Jquery 使用“时多次提交的表格”;提交;回调和$.ajax来发布它,jquery,ajax,forms,Jquery,Ajax,Forms,我观察到以下代码出现了一些奇怪的行为: $.fn.submit_to_remote = function() { // I use .each instead of the .submit directly so I can save // the 'submitEnabled' variable separately for each form jQuery.each($(this), function() { $(this).submit(function() {
$.fn.submit_to_remote = function() {
// I use .each instead of the .submit directly so I can save
// the 'submitEnabled' variable separately for each form
jQuery.each($(this), function() {
$(this).submit(function() {
form = $(this);
if (form.data('submitEnabled') == false) { alert('disabled'); return false; }
form.data('submitEnabled', false);
$.ajax({type: 'POST', url: 'url', data: data, dataType: 'script',
success: function(script) {
alert('success')
}
})
return false;
})
})
}
$('.submit_to_remote').submit_to_remote();
因此,基本上,在表单上调用submit_to_remote时,它将禁用它的正常提交,然后发出AJAX POST请求
奇怪的是,表单被多次发布,正如“禁用”警报所示。如您所见,我通过使用保存在表单对象上的“变量”,并检查该变量以查看表单是否已提交来防止这种情况
经过进一步测试,似乎罪魁祸首是AJAX调用返回的脚本。让我解释一下我在做什么,这样更清楚
表单被发布到服务器,并返回一个脚本。脚本再次显示表单,但这次显示了一些字段的错误消息。请注意,表单已完全替换
脚本在显示新表单时执行以下操作:
$('.submit_to_remote').submit_to_remote();
我必须这样做,否则,当您再次单击submit按钮时,表单将正常提交,没有AJAX
因此,假设用户提交表单并返回相应的错误(“已禁用”警报未显示)。然后他再次提交;这一次“已禁用”警报显示一次。现在他又提交了一次,这次警报显示了两次!等等
因此,.submit回调似乎一次又一次地附加在每个请求之后,但是为什么呢
是否可以使用.html()将原始表单保留为幽灵或其他形式
谢谢
PS:如果相关,下面是$.ajax调用返回的脚本:
replace_content_with = 'the form and other stuff here';
$('.page-content').html(replace_content_with);
$('.submit_to_remote').submit_to_remote();
不确定这种奇怪的行为,但似乎解除提交事件的绑定就可以了 因此,在运行$.ajax调用返回的脚本之前,请运行以下命令:
$('.submit_to_remote').unbind("submit");
这将删除以前的绑定,只保留新的绑定。是的,我同意Seb的观点,在我看来,在绑定之前总是解除绑定是一种很好的做法,除非您确定当前没有绑定到您想要的元素。只需使用“.submit”、“.click”、“.mouseover”等,您就可以在意外情况下双重绑定您的资料。。。功能 养成这样做的习惯(对我来说永远不会失败): 。。。而不是:
$('.some_element').submit(function() {
// do stuff here...
});
解绑对我不起作用。这确实:
$(document).off('submit');
$(document).on('submit',"#element_id",function(e){
e.preventDefault();
//do something
});
我希望它能帮助
事实上,如果在提交之前进行了一些验证并返回,unbind()可能会给您带来一些麻烦。例如:
$(document).on('submit',"#element_id",function(e){
e.preventDefault();
$(document).unbind('submit');
var name = $(this).children('input[name="name"]').val();
if( name == 'wrong name')
return;
//do something
});
在这种情况下,如果您输入的是“错误的名称”,那么表单将不会被提交,之后,当您输入“正确的名称”时,将不会触发$(document).on('submit'..,也不会触发e.preventDefault();并且您的表单将以常规方式提交。请记住,jQuery submit()事件将查找:
,或表单()中的
。一些框架将type属性默认为“submit”,因此如果您试图覆盖默认值,请将type属性更改为其他属性,这样它就不会多次提交。OpenCart双重提交是因为common.js
中存在提交绑定
通过对不匹配“表单-”
的表单使用id模式来避免这种情况
示例:
您可以使用此代码来解决:
$(this).submit(function() {
.
.
.
});
$(this).unbind("submit");
更简单的是:
$(".some-class").off().submit(function() {
//Do stuff here
});
我有同样的问题,并修复如下使用点击
$('.submit_to_remote').on('click', function(){
//Some validation or other stuff
$(this).submit();
});
我忘了提到我也试过了,但奇怪的是,这不起作用,因为这样新表单就不会有AJAX行为,甚至我会用脚本重新绑定它…+1我可以在这里使用这个解决方案:我尝试了这个,但在我的例子中有表单的提交,但是如果我更新表单内容,并重新提交,提交会发送origi如果我不这样做,我会提交增量表单(1、2、3等)。因为我重新绑定了“提交”按钮和“提交”操作,我的表单每次都会发送4次单击。讨厌的东西。完美的解决方案,但我很难量化我要查找的内容,从而找到此页面。谢谢,节省我的一天!;))这是一个很好的解决方案。谢谢,你节省了我的时间。这项工作对我来说非常出色,我会采取这种做法,汉克斯-这正是我所需要的这是迄今为止最容易解决的方法
$('.submit_to_remote').on('click', function(){
//Some validation or other stuff
$(this).submit();
});