2011-05-24 73 views
2

在提交表单按钮之前,我做了一个$ .getJSON调用来验证一些数据,当它返回时,它会显示一个“你没有正确填写这个表单”的对话框或者表单。提交()。但有时候,特别是在我的慢速测试服务器上,在回调被调用之前需要几秒钟,所以我想提出一些按下按钮的可视指示(禁用按钮,等待游标等),以及然后关闭回调中的视觉指示。但我被告知,可能不会调用回调的机会很小但非零。如何防止getJSON未调用回调?

确保在这种情况下,我最终不会得到非功能性表单的最佳做法是什么?

+0

jQuery的哪个版本您使用的? – mekwall 2011-05-24 14:03:44

+0

jQuery 1.4。 (大部分我们的一些页面仍然使用1.3) – 2011-05-24 14:34:41

回答

4

除了.success回调代替$.getJSON之外,您还可以使用和.error回调。如果请求失败,.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); 
    } 
}); 
+0

我推广这种方法。还有一个可以为请求设置的超时选项,这样当它需要更长的时间然后x秒时,它会调用错误回调,这就是为什么上面的'setTimeout'方法是多余的。 – mekwall 2011-05-24 14:58:01

+1

您可以添加另一个涉及['.ajaxSetup'](http://api.jquery.com/jQuery.ajaxSetup/)和全局错误回调的解决方案。我会自己做,但我觉得这个答案已经足够了,所以我不需要第三个答案来竞争*,也不想在未经您的同意的情况下编辑您的答案;) – mekwall 2011-05-24 15:00:56

+0

@Marcus Ekwall - 做我的客人,编辑走了。真的不需要我的同意,但我很欣赏你的礼貌:) – karim79 2011-05-24 15:07:05

4

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

setTimeout(enableForm,10000); //在10秒后启用任何形式的表单

2

你可以看看这里http://api.jquery.com/jQuery.getJSON/中的jqXHR对象部分,它解释该函数$ .getJSON()返回一个实现的XMLHTTPRequest所以你将不得不使用.error,.success和.complete的jqXHR对象

我认为这将工作你的情况:

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

原则上,与我发布的相同,但更简洁和*更新*。 +1 – karim79 2011-05-24 14:11:50

+0

虽然这是jQuery 1.5,不是吗? – 2011-05-24 14:55:59

+0

不幸的是,他使用1.5之前的版本,所以这对他不起作用。 – mekwall 2011-05-24 14:56:26