Javascript Ajax和防止双重“的出现;提交;

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

我正在处理一个遗留应用程序,其中他们对许多Ajax表单“提交”使用[a]标记。 如果我们使用[input]按钮,我们可以设置[input]标记的disable属性。 但在超链接上禁用并不是规范的一部分,跨浏览器也不一致

我们正在寻找一个简单的解决方案,阻止额外点击超链接

注意:在“单击”处理程序中,我们将JavaScript与jQuery一起使用,返回false或防止默认值-

$('#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是一种很酷的方法。谢谢你的提醒