2011-11-07 67 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

但你还需要什么更多的信息? –

相关问题