我试图从我的附加组件内容脚本覆盖网页中名为replaceMe
的JS函数,但我发现原始函数实现总是被执行。
原始HTML包含以下函数定义:
function replaceMe()
{
alert('original');
}
我试图覆盖我的加载项,如(main.js
):
tabs.activeTab.attach({
contentScriptFile: self.data.url("replacerContent.js")
});
这是replacerContent.js
的样子:
this.replaceMe = function()
{
alert('overridden');
}
然而,当我运行我的插件时,我总是看到文本original
被警告,这意味着replacerContent.js中的重新定义从未生效。你能让我知道为什么吗? replaceMe
不是privileged method,我应该被允许覆盖,是吗?
答案 0 :(得分:1)
这是因为Web内容和内容脚本之间存在有意的安全性。如果您想在Web内容之间进行通信,并且您也可以控制网页,则应使用postMessage。
如果您无法控制网页,则会有一个黑客的解决方法。在内容脚本中,您可以通过全局变量unsafeWindow
:
var aliased = unsafeWindow.somefunction;
unsafeWindow.somefunction = function(args) {
// do stuff
aliased(args);
}
这有两个主要的注意事项:
unsafeWindow
hack,并计划将其删除并将其替换为更安全的api。答案 1 :(得分:0)
不要依赖unsafeWindow
黑客,而应考虑使用DOM。
您可以从内容脚本创建页面脚本:
var script = 'rwt=function()();';
document.addEventListener('DOMContentLoaded', function() {
var scriptEl = document.createElement('script');
scriptEl.textContent = script;
document.head.appendChild(scriptEl);
});
这种方法的好处是你可以在没有unsafeWindow
的环境中使用它。 G。镀铬扩展。
然后,您可以使用postMessage或DOM事件在页面脚本和内容脚本之间进行通信。