【问题标题】:How do I protect against getJSON not calling the callback?如何防止 getJSON 不调用回调?
【发布时间】:2011-05-24 22:09:19
【问题描述】:

在提交表单按钮之前,我进行了 $.getJSON 调用来验证一些数据,当它返回时,它要么显示“您没有正确填写此表单”对话框,要么执行表单。提交()。但有时,特别是在我的慢速测试服务器上,调用回调之前需要几秒钟,所以我想提供一些视觉指示(禁用按钮、等待光标等)你按下了按钮,并且然后在回调中关闭该视觉指示。但有人告诉我,回调可能不会被调用的可能性很小但非零。

确保在这种情况下我不会以非功能形式结束的最佳做法是什么?

【问题讨论】:

  • 您使用的是哪个版本的 jQuery?
  • jQuery 1.4。 (大多数情况下。我们的一些页面仍然使用 1.3)

标签: javascript jquery getjson


【解决方案1】:

除了.success 回调之外,您还可以将$.ajax.error 回调一起使用,而不是$.getJSON。如果请求失败,.error 回调将触发。您可以使用它重新启用并显示合适的消息,类似于投票失败时在 StackOverflow 上显示的消息。示例:

$.ajax({
  url: "test.html",
  dataType: "json",
  success: function(html){
     $form.submit();
  },
  error: function(xhr, error){
     console.debug(xhr); 
     console.debug(error);
     $form.find(":input").attr("disabled", false);
  }
});

【讨论】:

  • 我推广这种方法。您还可以为请求设置一个超时选项,以便它在需要超过 x 秒的时间时调用错误回调,这就是为什么上面的 setTimeout-method 是多余的。
  • 您能否添加另一个涉及$.ajaxSetup 和全局错误回调的解决方案。我会自己做,但我觉得这个答案已经足够了,所以我不需要与第三个答案竞争,我也不想在未经你同意的情况下编辑你的答案;)跨度>
  • @Marcus Ekwall - 做我的客人,编辑吧。真的不需要我的同意,但我很感激你的礼貌:)
【解决方案2】:

我会简单地使用超时。确保 enableForm() 仅在表单已启用时返回,并在表单禁用时清除超时以避免运行多个计时器。

setTimeout(enableForm, 10000); // 在任何情况下都在 10 秒后启用表单

【讨论】:

    【解决方案3】:

    您可以在 jqXHR 对象部分查看 http://api.jquery.com/jQuery.getJSON/,它解释了函数 $.getJSON() 返回一个实现 XMLHTTPRequest 的 jqXHR 对象,因此您将拥有可用的 .error、.success 和 .complete

    我认为这适用于您的情况:

    $.getJSON("a.json", function() {}).error(function() {}) 
    

    【讨论】:

    • 原则上和我发的一样,但更简洁更新。 +1
    • 那是 jQuery 1.5,不是吗?
    • @Paul,是的!但是,您可以使用 $.ajaxSetup 为自己设置一个全局错误回调处理程序。
    • 对不起,版本是在我发布答案后指定的,我检查了 jquery 1.3 代码并且 $.ajax 函数返回未定义,因为 getJSON 它只是对该函数的特定调用,它不会工作
    猜你喜欢
    • 2015-05-21
    • 2015-01-16
    • 2013-07-15
    • 2015-04-23
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多