我有一个AJAX功能,需要一些时间才能完成。完成后,我想打开一个包含结果的新选项卡。为此,我提出了三个选择:
问题是这必须适用于所有主流浏览器(IE,Chrome,Firefox和Safari),而选项3应该可以解决这个问题但是会产生不必要的副作用:
现在我想使用setTimeout()作为一个过程代码,最后得到一些像:
$('.selector').click(function() {
doAjaxCall();
setTimeout(function(){ }, 150);
window.open(...);
});
嗯,这适用于Safari,但Chrome和FireFox似乎忽略了setTimeout()并直接继续使用window.open()。这就是我的问题;
。当调用window.open()时,必须使用的数据并不总是最新的。所以,我在这里。回归本源。弄清楚症状是什么,了解我探索过的场景的缺点并最终得到这样的结果:
$('.selector').click(function() {
doAjaxCall();
for(i = 0; i <= 100000000; i++) {
// procedural and time consuming so doAjaxCall has enough time to complete
}
window.open(...);
});
在我的情况下,我坚持使用xajax进行ajax处理,所以我不能使用jQuery的ajax解决方案。
有关如何改善这一点的任何建议?导致所有主流浏览器在ajax-function完成后打开弹出窗口的解决方案?
答案 0 :(得分:1)
首先,浏览器不会忽略setTimeout函数,但执行不会停止并等待setTimeout完成,但会继续执行并等待超时完成以执行作为参数传递给setTimeout方法的方法。
但是你不需要从php模拟睡眠方法以达到你想要的效果。 ajax调用有一个成功事件,您可以在其上附加事件处理程序。成功事件发生时打开新选项卡。否则,您将无法确切知道ajax请求何时结束。如果你不能使用jquery的ajax,你可以创建一个老式的学校&#39; ajax请求,如here
此外,打开新窗口不是最佳解决方案,因为大多数浏览器都有弹出窗口阻止程序。