Ajax帖子因警报而延迟

时间:2013-05-28 15:01:29

标签: jquery ajax safari

我使用以下代码将操作和参数发送到我服务器上的脚本:

$(function() {
    url = "http://...../myscript.php";
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false});
    alert("Hello");
});

我注意到(在MacOSX上的Safari 6.0.4上)弹出警报框,只有在点击" OK"后才发送ajax请求。 (在Chrome上,显示警报时会发送请求。)

因此我的ajax请求之后的代码实际上会延迟发送的请求。

为什么会这样?

编辑:

$.post(url, { action: 'system', param: 'volume get 5'}, {cache: false});
sum = 0;
for(i = 0; i < 1000000000; i++)
    sum++;
$("title").html(sum);

在计算完成后导致请求被发送。

1 个答案:

答案 0 :(得分:2)

  

我注意到(在MacOSX上的Safari 6.0.4上)会弹出警告框,只有在我点击“确定”后才会发送ajax请求。 (在Chrome上,显示警报时会发送请求。)

     

因此,我的ajax请求后面的代码实际上会延迟发送的请求。

我发现这非常令人惊讶,但我无法测试它,因为我没有Mac OS X.虽然alert阻止主JavaScript线程,但它不应该阻止浏览器发送请求,因为浏览器是多线程的。但我想在某些实现中它可以。

请注意,无论如何,alert将阻止您与请求关联的任何“成功”或“错误”处理程序的调用,这是完全不同的事情。这是因为除非你使用web worker,否则JavaScript在浏览器上是单线程的,并且(再次)alert支持一个JavaScript线程。

如果发送确实被alert阻止,您可以使用setTimeout解决此问题:

$(function() {
    url = "http://...../myscript.php";
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false});
    setTimeout(function() { alert("Hello"); }, 0); // Defers it
});

如果这是回调,那么处理这个问题的最好方法就是做一些比alert更现代的事情,比如一个风格迥异的绝对定位div包含信息。如果您希望消息是模态的,您可以自己做,尽管有一些边缘条件禁用页面的其余部分;但是jQuery还有大约一百万个“模态”插件可以为你处理这些边缘条件。 (jQuery UI和Bootstrap都提供它们,还有很多其他的。)