2013-10-25 39 views
-1

我有一个AJAX函数需要一些时间才能完成。完成后,我想打开一个新选项卡并显示结果。要做到这一点,我想出了三个选项:在javascript中使用setTimeout来模拟php的睡眠

  1. 使用window.open()从AJAX呼叫
  2. 使用window.open()的JavaScript函数/事件触发。
  3. 在javascript 函数/事件触发器中的setTimeout函数中使用window.open()。

问题是,这与所有主流浏览器(IE,Chrome浏览器,Firefox和Safari)和选项3工作应该做的伎俩,但有不必要的副作用:

  1. 在Chrome浏览器窗口不是在新标签中打开,而是弹出。
  2. 在Safari中,内部弹出式预防功能被激活;导致 不能打开弹出窗口。 (source

现在我想通使用的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函数完成时打开弹出窗口的解决方案?

回答

1

首先,浏览器不会忽略setTimeout函数,但执行不会停止并等待setTimeout完成,但会继续它的执行并等待超时完成以执行方法作为参数传递给setTimeout方法。

但你不需要模拟从PHP的睡眠方法,以达到你想要的。 ajax调用有一个成功事件,您可以附加一个事件处理程序。发生成功事件时打开新选项卡。否则,你将无法确切知道ajax请求何时结束。如果你不能使用jquery的ajax,你可以创建一个'old-school'ajax请求,如here

另外,打开一个新窗口并不是最好的解决方案,因为大多数浏览器都有弹出窗口拦截器。