2015-10-27 30 views
3

我們使用承諾lib Q,我們遇到以下問題。 window.open() is blocked by browser when is called from promise承諾內打開的窗口

我們試圖打開窗戶的承諾機制啓動前,這是工作,但問題是,當一個新的標籤頁打開(並獲得focues)所有的瀏覽器資源指的是新的標籤,邏輯仍然在第一個選項卡中完成,從而導致性能不佳。

還有其他的方式來與事件可能處理這個問題時,承諾完成,然後抓住這個事件,並打開新的窗口。

更新

這是什麼意思「所有的瀏覽器資源是指新標籤」 我們發現有趣的現象:) 我們正在運行的應用程序時對按鈕的用戶點擊,在這種情況下,我們打開新選項卡,焦點更改爲新選項卡,我們正在等待應用程序啓動,這需要大約15秒(直到應用程序實際運行)。 我們做了以下測試(這是VERT有意思:)),當我們點擊運行應用程序和新標籤打開是我們立即單擊後退到第一個選項卡(其中有按鈕),並通過該做的時間減少到4.5秒!!!!似乎焦點改變了瀏覽器處理資源的方式。

IM尋找其他的解決方案!

+0

「所有的瀏覽器資源都是指新標籤」是什麼意思? – jfriend00

+0

@ jfriend00 - 它太長了:)請看我的更新,你有什麼想法以及我們如何克服它? –

+0

如果沒有看到相關代碼,我們無法幫助您解決代碼問題。你期望我們猜測代碼是什麼嗎?一個瘋狂的猜測是後臺窗口中的Javascript計時器變慢,而前臺窗口計時器全速運行。但是,由於我不知道你的代碼是做什麼的,我不知道這是否甚至是相關的。 – jfriend00

回答

7

這是因爲兩種策略之間的衝突:

  1. 通過規範,承諾執行.then()處理異步(當前事件循環結束後)。

  2. 出於可用性和安全性原因window.open()只能從直接用戶操作(在用戶操作啓動的同一事件循環處理期間)調用。

因爲#2,你將無法從.then()處理程序如下承諾規範承諾打開了一扇窗。

通常的解決方法是在用戶單擊時(在承諾解決之前)同步打開窗口,然後填寫承諾解決時已打開的窗口內容或錯誤情況關閉窗口。這並不理想,但如果在打開窗口時涉及到異步操作,除了獲得諸如瀏覽器插件(而不是普通網頁腳本)之類的提升權限之外,確實沒有其他選擇。

有關如何解決具體的編碼問題與實現這種更詳細的幫助變通,你將有你的實際代碼添加到您的問題,並描述了它,你正在運行到的具體問題。

問題要求有特定代碼的幫助必須包括你想幫助的代碼。

+0

我認爲你應該將你的答案移動到http://stackoverflow.com/questions/23287940/window-open-is-blocked-by-browser-when-is-called-from-promise,我們將它作爲dupe – Bergi

+0

@Bergi - 這是不是在答案中提供的同樣的建議?我已經提供了這個鏈接,但我想知道是否有其他選擇... –

+0

@JhonD:我認爲這與Quentin提供的解釋完全一樣,Denys提出的解決方案也是如此。如果你正在尋找更多的選擇,你應該a)明確要求,b)也許提供原始問題的賞金。 – Bergi