2011-11-07 93 views
0

我意識到我們可以在內容腳本的共享DOM(according to manual)上工作。Chrome瀏覽器擴展:連接「內容腳本」與注入的DOM

我們可以通過

element.addEventListener('click',function(){ ourController.fnCallback(); }); 
// or 
element.onclick = ourController.fnCallback; 

連接注入DOM內容符合我們的內容腳本,但注射時DOM實現了這樣的事情:

<a href="javascript:ourController.fnCallback();">Click Me!</a> 

拋出的錯誤是cannot call fnCallback() on undefined ourController(不完全重寫的錯誤消息)

我們可以通過注入dom與我們的JavaScript對象進行通信,比如我在第二個示例中嘗試過嗎?

對象爲content_script.js定義是這樣的:

var ourController = { 
    fnCallback: function(){ 
     // code here 
    } 
}; 

這個代碼是直接放置在腳本按照體現這樣裝:

"content_scripts": [ { 
    "js": [ "content_script.js" ], 
    "matches": [ "http://*/*", "https://*/*", "ftp://*/*" ], 
    "run_at": "document_start" 
}], 

回答

2

解決此問題的文件出來:

執行環境

內容腳本在一個特殊的環境中執行所謂的隔離的世界。他們可以訪問他們注入的頁面的DOM,但不能訪問頁面創建的任何JavaScript變量或函數。它會查看每個內容腳本,就好像其上運行的頁面上沒有執行其他JavaScript一樣。反過來也是如此:頁面上運行的JavaScript不能調用任何函數或訪問由內容腳本定義的任何變量。

因此,任何注入的內容都無法使用內容腳本。唯一的解決辦法就是用這樣的代碼從withing內容腳本

document.getElementById("elmID").addEventListener('click',function(){ 
     var data = //get the data from DOM or window state, not from content script 
     chrome.extension.sendRequest({ 
      'request_data': data 
     }); 
    }) 

這將增加點擊事件功能,可與content_script

+0

誰是downvoting? –

1

看起來你沒有定義ourController或fnCallback在同一個內容腳本中。

如果您發佈了整個腳本,這將有所幫助。函數名稱空間在哪裏存在?

+0

我添加了創建的對象的代碼通信。對不起,但我不能發佈整個腳本(超過1000行,並由NDA保護) –

+0

好的,那麼很難提供幫助。 :( –

+0

但你還需要什麼更多的信息? –

相關問題