2014-09-25 35 views
0

因此,在this thread中正確接受教育並在開發Chrome擴展程序的過程中進一步移動後,似乎需要更多關於如何前進的方向。在彈出窗口中執行當前選項卡中的腳本

function testFunction() { 
    chrome.tabs.query({active: true, currentWindow: true}, function(arrayOfTabs) { 
    var activeTab = arrayOfTabs[0]; 
    chrome.tabs.executeScript(activeTab.id, {file: "test.js"}); 
}); 

test.js包含我的腳本。它可以很好地處理console.log等基本事物並更改背景顏色,但似乎不適用於我試圖使用的預製腳本。就像我在前面的主題中提到的那樣,當我簡單地將它粘貼到控制檯中時,我的腳本運行良好 - 並且我希望擴展程序能夠做到這一點。 當我說腳本不依賴頁面上的任何內容時,我可能是錯誤的。

通過控制檯運行代碼時發生了什麼,以及如何通過擴展運行相同的代碼?

謝謝。

+0

也許你忘了的路徑添加到您的JS文件到manufest /「權限」陣列?有時候您可能還需要將此路徑添加到manufest /「web_accessible_resources」 – lexasss 2014-09-25 10:59:41

回答

2

您的代碼在控制檯和內容腳本中的工作方式不同,因爲Chrome會爲每個擴展程序的腳本創建單獨的isolated JavaScript context

它有很多原因,不僅僅是安全性:頁面不能影響在較高特權擴展上下文中運行的腳本。另外,這意味着頁面和腳本使用的代碼之間不會發生衝突。有關更多信息,請參閱上面的鏈接。


當你在控制檯中執行代碼,你可以看到控制檯,它默認讀取<top frame>上方的下拉。這是您選擇執行命令的上下文的位置。如果有從任何擴展插入的上下文腳本,您也會在其中看到它的上下文。

您提到的腳本是指已在頁面上定義的JavaScript對象;這就是爲什麼如果你在控制檯中默認執行它,但是當從上下文腳本調用這些對象時,它不起作用。


那麼,那些完全隔離?這兩個上下文都具有對DOM的共享訪問。這使得內容腳本可以將代碼注入頁面的上下文中:您可以創建一個<script>元素並將其插入到頁面中。這將執行頁面上下文中的代碼。

有關涉及此主題的規範問題,請參閱Inject code in a page using a Content script。在官方文檔中幾乎沒有提及這一點,並且當我第一次看到它可能是時,我坦率地說出了自己的想法。

所以,你的情況,你需要的是就像一個代理內容腳本,注入一個頁面級的腳本:

// content.js - this is what you pass to `executeScript` 
var s = document.createElement('script'); 
s.src = chrome.runtime.getURL('test.js'); // This is the actual script 
s.onload = function() { 
    this.parentNode.removeChild(this); 
}; 
(document.head||document.documentElement).appendChild(s); 

對於這個工作,你需要添加test.jsweb-accessible resources in the manifest(因爲網頁本身將請求加載它,當你添加<script>標籤):

"web_accessible_resources" : [ "test.js" ], 
+0

謝謝Xan,您再次對我進行了教育。一切都像一個魅力! – 2014-09-27 09:36:24

相關問題