当Chrome扩展程序尝试通过chrome.executeScript在窗口对象中获取自定义函数时,它什么都没有。
例如:
标签ID:150
Tab js:
window.customfunc = function(){return 'yeap';}
扩展背景JS:
chrome.tabs.executeScript(150, { code: "console.log(window);" })
的manifest.json:
{
"background": {
"scripts": [ "background.js" ]
},
"content_scripts": [ {
"exclude_globs": [ ],
"exclude_matches": [ ],
"include_globs": [ "*://*/*" ],
"js": [ "script.js" ],
"matches": [ "http://*/*" ],
"run_at": "document_idle"
} ],
"content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'",
"description": "Test",
"manifest_version": 2,
"name": "Workspace",
"permissions": [ "unlimitedStorage", "notifications", "clipboardWrite", "notifications", "clipboardRead", "management", "tabs", "history", "cookies", "idle", "storage", "webRequest", "webRequestBlocking", "contentSettings", "*://*/*" ],
"version": "1.0"
}
结果:
在控制台中,window
对象未显示customfunc
,因此我们无法将window.customfunc
与chrome.executeScript
一起使用。
为什么会发生这种情况,我们该如何解决? 感谢。
答案 0 :(得分:3)
这是为了安全。内容脚本(background.js
正在执行)与选项卡的脚本(其中定义了customfunc
)隔离开来。您还可以获得额外的好处,而不必担心命名空间冲突(这就是让事情搞乱的地方)。
一种方法是创造
说 myscript.js
console.log(window)
然后使用内容脚本(或chrome.tabs.executeScript
)来写
<script src='chrome.extension.getURL("myscript.js")'></script>
到标签的DOM。你还需要添加
"web_accessible_resources": ["myscript.js"]
到你的清单。
但是由于事情变得复杂,一个好问题就是你需要访问customfunc
的原因。 (您还可以查看https://stackoverflow.com/a/9517879/2336725以获得更长的答案。)