2016-11-05 132 views
3

目前,我們這是在manifest.json文件中初始化如下內容的腳本:內容腳本在Chrome擴展程序被執行多次

"content_scripts": [ 
    { 
    "matches": [ 
     "https://docs.google.com/*" 
     ], 
    "js ["content.js"], 
    "run_at": "document_start", 
    "all_frames": true, 
    "match_about_blank": true  
    } 

], 

其設置爲運行每次用戶加載了谷歌文檔文檔。然而,通過查看控制檯日誌,好像內容腳本被加載(是正確的單詞注入?)多次,因爲我們得到多個控制檯日誌。

我讀過一些其他的答案,這可能與內容腳本加載一次,當谷歌文檔標籤加載一次,一旦它完成加載,所以它運行多次的事實;儘管如何防止這種情況發生?

回答

5

問題是"all_frames": true。谷歌文檔嵌入了許多iframe■從同一個域:

<iframe src="https://docs.google.com/document/u/0/preload" style="display:none;" tabindex="-1"></iframe> 
<iframe src="https://docs.google.com/offline/iframeapi?ouid=REDACTED#cd=1" style="display: none;"></iframe> 

你的內容腳本是越來越注入到所有這些幀。

如果您設置了​​:您的內容只會被注入到頂部框架中,並且在瀏覽到Google文檔時只會記錄一次。

+0

好的,謝謝你!那麼,如果我們試圖監控用戶對Google文檔的使用情況,並且需要將我們的內容腳本注入到所有iframe中,但是我們不希望我們的內容腳本多次運行?那可能嗎? –

+1

這些看起來像是從根本上反對的目標。你有一個約束,你需要將內容腳本注入到所有的框架中。這意味着它將在所有這些中運行;這是不可避免的。這聽起來像你想要做的是「使用來自各種幀的信息,只運行一次腳本,然後改變(一些?)這些幀」。爲此,您需要一種方式讓內容腳本互相協調和交流。你需要一個單獨的共享狀態。你可以使用「背景腳本」內容腳本可以發送消息,並且可以發回消息。 – Birchlabs

+0

不需要內容腳本。請參閱選項卡API –

相關問題