Javascript Ajax和防止双重“的出现;提交;
我正在处理一个遗留应用程序,其中他们对许多Ajax表单“提交”使用[a]标记。 如果我们使用[input]按钮,我们可以设置[input]标记的disable属性。 但在超链接上禁用并不是规范的一部分,跨浏览器也不一致 我们正在寻找一个简单的解决方案,阻止额外点击超链接 注意:在“单击”处理程序中,我们将JavaScript与jQuery一起使用,返回false或防止默认值-Javascript Ajax和防止双重“的出现;提交;,javascript,jquery,html,ajax,hyperlink,Javascript,Jquery,Html,Ajax,Hyperlink,我正在处理一个遗留应用程序,其中他们对许多Ajax表单“提交”使用[a]标记。 如果我们使用[input]按钮,我们可以设置[input]标记的disable属性。 但在超链接上禁用并不是规范的一部分,跨浏览器也不一致 我们正在寻找一个简单的解决方案,阻止额外点击超链接 注意:在“单击”处理程序中,我们将JavaScript与jQuery一起使用,返回false或防止默认值- $('#target').click(function(e) { e.preventDefault(); ale
$('#target').click(function(e) {
e.preventDefault();
alert('Handler for .click() called.');
});
$('#target').click(function(e) {
alert('Handler for .click() called.');
return false;
});
嗯。。。只允许按钮按下一次(在页面的整个生命周期内),然后可以使用.data()-
或者切换属性。我喜欢Ben Nadel的
基本上,您可以围绕jQuery.ajax函数创建一个包装器,并且可以为应用程序中的每个ajax请求生成各种各样的内容。其中之一就是请求跟踪
您将看到,在他的getJSON
wrapper方法中,请求名称采用可选的“name”参数。这可以是任何东西,它只是一个确定请求来源的键。在您的情况下,它将由每个链接单击提供。如果name参数存在,则他将其存储在跟踪集合中
如果另一个调用具有相同的请求名称,它将被简单地丢弃。一旦原始请求返回,他将清除该请求名称的跟踪标志
此方法非常适合将许多常见功能扩展到应用程序中的所有ajax请求。我已经创建了一个多请求处理程序,它还允许您指定新请求的行为——是中止任何现有请求,还是仅仅删除请求。当您希望处理最新的请求时,这非常有用,例如自动完成。womp的解决方案是一种非常彻底的方法 但是,如果您想要更简单一点的东西,我可能会实现一个。只需设置一个“提交”标志,然后测试看看当用户单击链接时是否设置了信号量。可以通过在DOM对象本身上设置标志或使用全局布尔值来实现这一点
$('#link').each(function() {
this.submitting = false;
}).click(function() {
if (!this.submitting)
{
this.submitting = true;
var self = this;
$.ajax({
success: function() {
self.submitting = false;
},
error: function() {
self.submitting = false; // make sure they can try again
}
});
}
});
我显然缩短了$.ajax调用,但我想你明白了
编辑:呃。。。实际上,我忘记了最重要的部分。if(!submitting)。当这个链接执行ajax请求时会发生什么?如果是这样,你可以看看这个 (存储库中的3.05版本不是您想要的版本) 这有一个停止重复ajax请求的选项 你也可以看看 他们点击链接,一个加载标志出现,他们不能再点击该链接
var fooObj = {
isAdd : true,
add : function(){
if(fooObj.isAdd == true){
fooObj.isAdd = false;
var opt = {
url : 'http://yoururl.com',
type : 'post',
success : function(response){
if(response=='save'){
fooObj.isAdd = true;
}
}
}
$.ajax(opt);
}
}
}
我认为这是可行的。我还注意到IE浏览器在使用ajax时响应缓慢。对于触发ajax调用的所有事件,最好先在父组件或所有页面上添加加载层,以防止新事件触发,另一方面通知用户正在加载数据。
例如,您可以使用易于实现的来执行此操作,这将阻止链接的默认操作,是的。但是,我认为tyndall希望阻止进一步的AJAX调用,在这种情况下,我认为这不会起作用。因为您总是在响应中设置
self.submitting
状态,所以可以将回调挂钩简化为:$.AJAX({complete:function(){self.submitting=false;})代码>如果(!This.submitting)
和This.submitting=true之间出现第二次单击,则此操作将不起作用代码>。这是如何不实现信号量的经典示例;-)@这在JS执行模型下是不可能的。你把这个线程错当成Java了吗这是一个救命稻草。我的jQuery UJS表单无缘无故地重复提交,但现在没有:-)请使用Ctrl+K选项来格式化代码,而不是HTML,它更容易阅读(也更容易格式化)。这对我来说很有效。radztech是一种很酷的方法。谢谢你的提醒