2012-12-03 88 views
8

我正在開發一個在內容腳本中使用jQuery/Zepto的Chrome擴展。現在,該擴展程序旨在運行在每個網站上,這意味着jQuery/Zepto的副本將加載到用戶打開的每個選項卡上。Chrome擴展:在內容腳本和後臺腳本之間共享對象

有沒有辦法在各種內容腳本之間共享jQuery/Zepto對象?

我知道內容腳本可以與後臺腳本進行通信。我希望能夠讓後臺腳本訪問jQuery對象並返回對每個內容腳本的引用。但是我意識到只有JSON消息可以在內容和後臺腳本之間傳遞。

有什麼辦法可以實現我想要的嗎?

+0

不,您不能在內容腳本之間共享直接函數引用。 (重複的問題:[如何在兩個不同標籤的內容腳本之間傳輸數據?](http://stackoverflow.com/questions/11597416/how-to-transfer-data-between-the-content-scripts-of-兩不同的選項卡))。 –

+0

發佈這個答案,我會接受它。順便說一句,一個問題 - 我昨天認爲讓jQuery包含在每個頁面中可能實際上不成問題,因爲與網頁的實際資源不同,這不需要下載。考慮到網頁的平均大小接近1MB(正如我在線閱讀的),內存消耗的增加不應該是我推斷的問題。這似乎有意義嗎? –

回答

9

內容腳本沒有獲得對方的JavaScript對象要麼。

Chrome支持通過chrome.runtime.sendMessage + .onMessage在內容腳本和/或後臺頁面之間進行通信。因爲所有消息都是JSON序列化的,所以JavaScript對象不能以這種方式「泄露」到其他上下文中。

所以:不,你不能共享像jQuery這樣的對象(內容腳本在其他標籤中)。

1

Content ScriptsExecution environment確保內容的腳本可以在它們之間通信

例:

"content_scripts": [ 
    { 
     "matches": ["<all_urls>"], 
     "js": ["myscript.js","myscript1.js"] 
    } 
    ] 
} 

Individual DOM Environment其中["myscript.js","myscript1.js"]注入確保myscript1.js有權訪問所有內容(函數,變量)內容的腳本myscript.js,但這是從兩個Individual DOM Environment正在通信停止。

說了這麼多,你在Content Scripts這就要求要求地方message passing需求background pages訪問DOM of injected pages看到什麼限制\要求?

請詳細說明在不同的標籤

相關問題