【发布时间】:2011-08-21 22:08:48
【问题描述】:
我有一个 chrome 扩展,它使用 内容脚本 来动态插入引用 an external javascript file 的脚本标记。我使用的代码是:
var html_doc = document.getElementsByTagName('head')[0];
var _js = document.createElement('script');
_js.setAttribute('type', 'text/javascript');
_js.setAttribute('id', 'chr_js');
_js.setAttribute('src', 'http://unixpapa.com/js/dyna1.js');
if(!document.getElementById('chr_js'))
html_doc.appendChild(_js);
外部Javascript包含以下代码:
function lfunc(){
alert('RUNNING loaded function');
}
alert('LAST LINE of script');
当我在选项卡中加载页面时,会出现“脚本的最后一行”消息,表明脚本标签已正确插入 DOM。
我的扩展程序还有一个 按钮(即 browser_action)。现在,我希望这个按钮在被点击时调用上面定义的 lfunc()。不幸的是,我的代码根本不起作用。
我在background.html页面中使用如下代码来处理我的按钮的onClick事件:
<script>
chrome.browserAction.onClicked.addListener(function(tab) {
chrome.tabs.executeScript(null,
{code: "try {lfunc()} catch (e) {alert(e);}"});
}); // it should call lfunc()
</script>
manifest.json文件中的权限为:
"permissions": [
"tabs", "http://*/*", "https://*/*" ]
我没有收到“RUNNING 加载函数”消息,而是收到错误消息“ReferenceError: lfunc is not defined”。
我做错了什么?
【问题讨论】:
-
外部脚本和内容脚本是完全不同的(私有!)范围。他们不能使用彼此的代码。然而,他们确实为此发明了一些东西(有点):sendRequest 和 onRequest 但是为什么你要加载外部脚本?
-
如果您将 lfunc 安装到窗口的全局范围并像那样执行它,可能会起作用...我会尝试一下 =)
-
好吧,我无法让它工作。内容脚本和背景页面可以对话,但似乎它们都无法访问文档窗口中的用户内容。 (他们确实可以访问 DOM 和标准 JS,但不能访问用户添加的功能,例如您的外部脚本)。
-
非常感谢鲁迪的帮助。我想加载一个外部脚本,以便在那里打包我的扩展程序的大部分功能,以便我可以在其他浏览器的扩展程序中重用它(尤其是 IE)。通过这样做,我还可以通过修改外部 JS 文件轻松地从扩展更新代码。至少这是理论:)
-
那么,有没有办法从我的后台页面执行外部JS文件?
标签: javascript function google-chrome background