2012-09-03 56 views
2

根據this question,當我們設置window.location時,JavaScript將「停止」執行或變爲競態條件。PhoneGap如何在更改window.location/document.location後保持Javascript執行

有時我們需要在WebView內多次觸發window.location = SOMESCH://xxx以將「通知」發送回我們的應用程序。例如設置window.location = myapp://loginButtonEnabled?e=1告訴應用程序,用戶已經填寫了一些nessasary信息並可以開始登錄。這似乎是不可能做這樣的事情:

function(){ 
window.location = myapp://loginButtonEnable?e=1; 
window.location = myapp://hideHintView; 
..... 
window.location = myapp://theLastThing; 
} 

只有最後window.location = myapp://theLastThing將被解僱,然後使用Javascript的執行將停止(雖然我們在webView:shouldStartLoadWithRequest:navigationType:不會回來,停在我們的應用程序重定向)。

我發現有趣的是,PhoneGap通過使用調度隊列使這成爲可能,但我仍然沒有弄清楚它爲什麼可以工作,任何人都知道這個技巧?

順便說一句,有沒有簡單的方法來設置位置後「恢復」執行?這比使用操作隊列要好得多。

回答

5

您需要讓事件循環有機會每次響應位置更改。這樣做的典型方法是使用具有小/零延遲的setTimeout,這具有將執行移至下一個事件循環節拍的效果。嘗試是這樣的:

var q=[]; 

function dequeue() { 
    window.location='myapp://'+q.shift(); 
    if (q.length>0) setTimeout(dequeue,0); 
} 

function notifyApp(cmd) { 
    q.push(cmd); 
    if (q.length==1) setTimeout(dequeue,0); 
} 

notifyApp('loginButtonEnable?e=1'); 
notifyApp('hideHintView'); 
notifyApp('theLastThing'); 

至於JavaScript執行停止,設置window.location除非它實際上導致頁面變化應該不會有這樣的效果 - 也許嘗試使用上面的技術,看看是否在最後你的JavaScript繼續致電notifyApp()

編輯:另一種方法來這個問題,而不是創造改變當前頁面的位置的臨時I幀 - 見例如 Triggering shouldStartLoadWithRequest with multiple window.location.href calls

相關問題