Ajax 和防止双重“提交”

Posted

技术标签:

【中文标题】Ajax 和防止双重“提交”【英文标题】:Ajax and Preventing Double "submit" 【发布时间】:2011-03-12 10:18:15 【问题描述】:

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

我们正在寻找一种简单的解决方案来阻止对超链接的额外点击。

注意:我们使用 javascript 和 jQuery

【问题讨论】:

这对我有用。***.com/questions/16777003/… radztech,很酷的方法。感谢您的提醒 【参考方案1】:

在您的“点击”处理程序中,要么返回 false,要么阻止默认值 -

$('#target').click(function(e) 
  e.preventDefault();
  alert('Handler for .click() called.');
);

$('#target').click(function(e) 
  alert('Handler for .click() called.');
  return false;
);

嗯...只允许按钮被按下一次(在页面的整个生命周期中)然后可以使用 .data() -

http://api.jquery.com/data/

或者切换一个属性。

【讨论】:

这将阻止链接的默认操作,是的。但是,我认为 tyndall 想要阻止进一步的 AJAX 调用,在这种情况下,我认为这不会起作用。【参考方案2】:

我喜欢 Ben Nadel 的 routine for handling this。

本质上,您围绕 jQuery .ajax 函数创建了一个包装器,并且您可以构建应用程序中每个 ajax 请求所发生的各种事情。其中之一是请求跟踪。

您会看到,在他的getJSON 包装方法中,它采用可选的“名称”参数作为请求名称。这可以是任何东西,它只是识别请求来源的关键。在您的情况下,它将由每个链接点击提供。如果 name 参数存在,则他将其存储在跟踪集合中。

如果另一个调用具有相同的请求名称,它就会被丢弃。一旦原始请求返回,他就会清除该请求名称的跟踪标志。

此方法非常适合将许多通用功能扩展到应用程序中的所有 ajax 请求。我创建了一个多请求处理程序,它还允许您指定新请求的行为——它是否会中止任何现有请求或只是被丢弃。当您希望处理最新的请求(例如自动完成)时,这很有用。

【讨论】:

【参考方案3】:

womp 的解决方案是解决这个问题的非常彻底的方法。

但是,如果您想要一些更简单的东西,我可能会实现semaphore。只需设置一个“提交”标志,并测试用户单击链接时是否设置了信号量。您可以通过在 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)。

【讨论】:

由于您总是在响应中设置self.submitting 状态,您可以将回调挂钩简化为:$.ajax( complete: function() self.submitting = false; ); 如果第二次点击出现在if (!this.submitting)this.submitting = true; 行之间,这将不起作用。这是如何不实现信号量的经典示例;-) @Steves 这在 JS 执行模型下是不可能的。你把这个线程误认为是Java吗? :P 这是一个救生员。我的 jQuery-UJS 表单无缘无故地重复提交,现在它没有:-)【参考方案4】:

当此链接执行 ajax 请求时会发生什么?如果是这样你可以看看这个

http://www.protofunc.com/scripts/jquery/ajaxManager3/(不是您可能想要使用的存储库中的 3.05 版本)。

这有一个选项来停止重复的 ajax 请求。

你也可以看看

http://jquery.malsup.com/block/

他们点击链接,然后出现加载标志,他们无法再点击该链接。

【讨论】:

【参考方案5】:
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);    
        
    

我认为这是可行的。我还注意到使用 ajax 时 IE 浏览器响应缓慢。

【讨论】:

请使用 Ctrl+K 选项来格式化你的代码而不是 html,它更容易阅读(并且你可以格式化)。【参考方案6】:

对于所有触发 ajax 调用的事件,最好在父组件或所有页面上添加加载层,一方面防止新的事件触发,另一方面通知用户加载数据正在处理。 您可以通过使用 jQuery BlockUI Plugin 来做到这一点,例如这很容易实现

【讨论】:

以上是关于Ajax 和防止双重“提交”的主要内容,如果未能解决你的问题,请参考以下文章

防止在后端ASP.NET Core 3中提交双重形式的提交。*

如何防止flask-sqlalchemy中的双重数据提交

在 wordpress 中编码时防止双重表单提交

HTML 防止双重提交

用于防止双重提交的纯 Java/JSF 实现

Spring Data JPA - 防止一对一关系的双重表单提交