0

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

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

我注意到(在 MacOSX 上的 Safari 6.0.4 上)弹出警报框,并且仅在单击“确定”后才发送 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);

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

4

1 回答 1

2

我注意到(在 MacOSX 上的 Safari 6.0.4 上)弹出警报框,并且仅在单击“确定”后才发送 ajax 请求。(在 Chrome 上,请求在显示警报时发送)。

所以我的 ajax 请求后面的代码实际上延迟了请求的发送。

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

请注意,无论如何,alert都会暂停对与请求关联的任何“成功”或“错误”处理程序的调用,这是完全不同的事情。这是因为除非您使用网络工作者,否则 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 都提供了它们,还有很多其他的。)

于 2013-05-28T15:06:58.497 回答