【问题标题】:Prevent duplicate form submit with jQuery Mobile Ajax Navigation (without disabling ajax)使用 jQuery Mobile Ajax Navigation 防止重复提交表单(不禁用 ajax)
【发布时间】:2012-11-21 20:21:49
【问题描述】:

在我的表单中,如果您足够快地单击提交两次,我将获得两个成功的表单 ajax 帖子。如何停止重复发帖?

据我所知

  1. 用户点击提交
  2. Ajax 帖子已发送
  3. 用户点击提交(填写完整且有效的表单)
  4. Ajax 帖子已发送
  5. 收到 Ajax 响应
  6. 页面刷新为空(新的空表单 - 需要值)
  7. 收到 Ajax 响应
  8. 页面刷新为空(新的空表单 - 需要值)

表单发送两次,我创建了两个项目。

有类似名称的问题,但它们与禁用验证或禁用 ajax 有关。 Ajax、jquery 验证和服务器端验证(MVC 中的 Post-Redirect-Get)对我来说工作得很好。

为了清楚我正在使用jQuery Mobile's Ajax navigation,所以我没有写任何 ajax

【问题讨论】:

    标签: jquery ajax forms post jquery-mobile


    【解决方案1】:

    这是我现在的解决方案:

    $(document).on('submit', "form", null, function (e) {
        $(this).find("input:submit")
        .attr('disabled', 'disabled')
        // the following is optional, arguably unnecessary
        .delay(2000)
        .queue(function (next) { $(this).removeAttr('disabled'); next(); });
    });
    

    (已更新为在 webkit 中工作)

    延迟是为了以防万一出现问题。实际上表单应该被替换并且替换不会被禁用。

    欢迎提出更好的建议。

    【讨论】:

    • 与其依赖延迟,不如在收到AJAX响应时重新初始化提交按钮?您可以设置一个通用的 .ajaxSuccess() 处理程序来运行所有 AJAX 请求,或者您可以将 JS 添加到 AJAX 响应中。
    • 当帖子成功返回重定向时,DOM 会重新初始化。延迟应该只在超时/错误而不是ajax成功时用完......也许在.ajaxError()
    【解决方案2】:
    $(document.body)
    .on("input:submit", "click", function () {
      var $this = $(this);
    
      if ( !$this.is(".submitting") ) {
        $this.addClass("submitting");
    
        $.ajax({ url: "etc..."})
        .done(function () {
          // success callback;
        })
        .fail(function () {
          // error callback;
        })
        .always(function () {
          $this.removeClass("submitting");
        })
      }
    });
    

    这有一个很好的副作用,您可以使用submitting CSS 类修改提交按钮的样式。您可以另外/替代地禁用它并在 always 回调中重新启用它。

    【讨论】:

    • 我想避免编写ajax调用,而是希望使用标准的post让jquery拦截它并作为ajax调用运行
    • @KCD 我明白了。您可以以同样的方式捕获submit 事件并禁用提交按钮。
    • 我发现禁用其提交事件上的input:submit 按钮有时会发布提交(firefox)有时会阻止它(webkit)。更新了我的答案以在事件冒泡到表单时捕获事件
    • @KCD 您也可以设置一个值,也许是$("form").data("submitting", true),并且只要尚未设置该值,就只发布表单。这与设置 CSS 类的方法相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    相关资源
    最近更新 更多