我使用以下代码将操作和参数发送到我服务器上的脚本:
$(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);
在计算完成后导致请求被发送。
答案 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都提供它们,还有很多其他的。)