2014-07-02 60 views
1

我正在開發帶有Webviews的Chrome應用程序。用於Web瀏覽的頁面也可以在常規瀏覽器中運行。如果在webview中,頁面將消息發送到主App,但顯然他們需要先從App獲取消息,以便知道將消息發送到何處。Chrome應用程序消息傳遞和'loadstop'與.load()計時

沒問題 - 主應用程序在看到一個'loadstop'事件後立即發送一條消息,告訴頁面將消息發送到哪裏。如果一個頁面不在webview中,那麼它永遠不會收到消息。

問題是,我需要知道什麼時候頁面應該停止等待消息,並假定它不在webview中。

何時發生'loadstop',相對於頁面中的事件,如jQuery的.ready或.load?有沒有一種方法來捕捉或觸發一個事件,確保在主App中看到'loadstop'MIGHT和webview的JavaScript發送和接收到的消息之後發生。

回答

1

何時發生'loadstop',相對於頁面中的事件,如jQuery的.ready或.load?

據爲loadstop事件的文檔:

當在客戶端頁(包括其所有子幀)的所有幀級負載已經完成觸發。這包括當前文檔中的導航以及子幀文檔級負載,,但而不是包括異步資源負載。

這表明它更類似於jQuery的.ready(),該DOM樹被加載後執行,而是在等待資產(的.css,.js文件)下載之前。

請關注該文檔頁面;這已經是很多自兩週前以來有所改善。


有沒有一種方法來捕獲或觸發保證「loadstop」後,會出現可能會在主應用程序和消息中可以看出發送和web視圖的JavaScript接收到事件?

的manifest.json聲明您我-APP-main.js背景腳本(和你的WebView許可),它啓動您我-WebView的wrapper.html,其中包括您<webview>標籤,也內聯一些JavaScript(或來源我-WebView的wrapper.js文件),其經onload功能,這樣的事件偵聽器分配給您的WebView:

onload = function() { 
    webview = document.getElementById("the-id-attribute-of-my-webview"); 
    webview.addEventListener("<EVENT>", function() { 
    // the cool stuff you want to do 
    } 
} 

<EVENT>可以是我鏈接的文檔(包括loadstop)中列出的任何webview DOM事件。你的主應用程序不應該在意這一切正在發生。 (這是異步!它是JavaScript!它是神奇的!)

如果你仍然困惑,只需在GitHub上搜索Google的webview sample即可。

+0

我不知道這個onload代碼放在哪裏 - 在web視圖中?所以webview可以在主應用程序的同時接收'loadstop'?這可能是方便的,但主要的應用程序絕對不在乎。我預先加載了大量廣告(網頁瀏覽中的頁面)以顯示在自助服務終端上 - 它們不僅需要圖片,JavaScript ......,還需要在完成準備時告訴主應用,包括確定自己的播放長度。只有這樣才能允許主應用程序安排它們顯示給用戶,否則我的客戶不滿意。 – DaveWalley

+0

是的,onload代碼被放置在(或鏈接到)調用webview的相同嵌入式HTML頁面中。對於你的具體問題,你可以使web瀏覽器默認隱藏在CSS中,然後將其切換爲從loadstop回調函數顯示? –

+0

這基本上就是我在做的,但是從您的評論和文檔中,loadstop事件對於webview來說太早了 - 在加載異步資源之前以及在webview的JavaScript可以完成之前。只有webview知道這是什麼時候發生的,所以它需要發送消息或設置標誌或做一些事情,而不是主要的應用程序。順便說一句,解決方法我已經決定讓主應用程序每秒鐘輪詢webviews - 而不是JavaScript異步方式,但最終只有幾行代碼。 – DaveWalley

相關問題