Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google chrome Chrome扩展无法访问自定义窗口属性_Google Chrome_Google Chrome Extension - Fatal编程技术网

Google chrome Chrome扩展无法访问自定义窗口属性

Google chrome Chrome扩展无法访问自定义窗口属性,google-chrome,google-chrome-extension,Google Chrome,Google Chrome Extension,我正在尝试编写一个带有开发工具面板的Chrome扩展。此扩展需要调用在我也创建的网页中的窗口属性上定义的函数。换句话说,扩展只用于我自己的网页,我控制这两个网页。例如: // This script is added in my own webpage application when it loads window.myTest = () => { /* do something */ } 我希望能够从我的Chrome扩展中调用函数window.myTest。我需要做类似的功能,如 似

我正在尝试编写一个带有开发工具面板的Chrome扩展。此扩展需要调用在我也创建的网页中的窗口属性上定义的函数。换句话说,扩展只用于我自己的网页,我控制这两个网页。例如:

// This script is added in my own webpage application when it loads
window.myTest = () => { /* do something */ }
我希望能够从我的Chrome扩展中调用函数
window.myTest
。我需要做类似的功能,如

似乎我需要通过从后端页面注入脚本/代码来实现这一点。我有所有可以调用的后端页面扩展,我可以看到我注入的代码在页面上下文中被调用(通过console.log进行测试写入页面的控制台输出)

这是我的密码:

manifest.json

{
  "manifest_version": 2,

  "name": "MyTest",
  "description": "MyTest",
  "version": "0.0.1",

  "minimum_chrome_version": "10.0",

  "devtools_page": "devtools.html",

  "background": {
    "scripts": ["background.js"]
  },

  "content_scripts": [{
    "matches": ["<all_urls>"],
    "js": ["testscript.js"]
  }],

  "permissions": [
    "tabs",
    "<all_urls>"
  ]
}
background.js

// empty, but here to be able to open background page
我还有一个面板,当点击按钮时,它会向后台页面发送消息。我知道专家组和发送信息也能起作用。但是
window.myTest
仍然是
未定义的

编辑
从background.js中删除了注入,因为我没有使用它,并且出现了与前面描述的相同的问题。

最后,我得到了关于这个的规范。Mozilla和Chrome遵循相同的扩展规范

内容脚本获得DOM的“干净”视图。这意味着:

  • 内容脚本无法查看页面定义的JavaScript变量 脚本
  • 如果页面脚本重新定义内置DOM属性,则 内容脚本看到的是属性的原始版本,而不是 重新定义的版本

只要在清单“内容脚本”部分声明testscript.js,就不必手动注入它。如果使用类似于
setTimeout(func,5000)
的方法调用
window.myTest()
,会怎么样?我的意思是,您能否确保在注入脚本运行时声明了
myTest
?如果这是针对您制作的网页的,则不适合注入
。您应该将您的
匹配项
仅限于您正在影响的页面。@AndreaConte,而OP显然不需要通过manifest.json
content\u脚本
条目和
tabs.executeScript()
,将相同的脚本注入页面,对于仅在用户打开DevTools的罕见情况下与页面交互的扩展,使用
tabs.executeScript()
进行注入可能更合适,因此注入仅在需要功能时发生,而不是总是被注射时,绝大多数时间它永远不会被使用。我们不知道哪个更好,因为OP没有分享足够的信息。
// empty, but here to be able to open background page