2013-10-25 77 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

另外,打開一個新窗口並不是最好的解決方案,因爲大多數瀏覽器都有彈出窗口攔截器。