您的直觉是正确的,作为 Chrome 扩展程序的一部分从内容脚本运行的 JavaScript 在沙箱中运行,该沙箱无法访问在包含页面中执行的 JavaScript。
根据内容脚本上的 Chrome 文档:
However, content scripts have some limitations. They cannot:
* Use chrome.* APIs (except for parts of chrome.extension)
* Use variables or functions defined by their extension's pages
* Use variables or functions defined by web pages or by other content scripts
首先,我建议您考虑不同的快捷键。为您自己的扩展程序覆盖现有快捷键的功能可能会为期待 Facebook 快捷键的人提供不和谐的用户体验。想象一下,如果一个扩展覆盖了作为复制和粘贴桌面操作系统一部分的 ctrl-c 和 ctrl-p 快捷方式——我想你会有一些不高兴的用户可能会删除改变他们之前学到的行为的东西。
但是,如果您坚持,那么这里是加载将在包含页面的上下文中执行的 JavaScript 的解决方法:
编辑:更新每条评论以引用插件中的 JS 文件,而不是托管在网络上的文件
首先,您需要在 chrome 插件中创建一个 JavaScript 文件:override-fb-hotkeys.js
.
首先,您需要在 Web 上的某个位置托管一个 JavaScript 文件,其中包含您要在页面中执行的脚本,假设您将它托管在:http://example.com/override-fb-hotkeys.js
.
然后,从您的内容脚本中,您可以将一个脚本标签插入到引用您的 JavaScript 文件的 DOM 中,如下所示:
var script = document.createElement('script');
script.setAttribute("type", "text/javascript");
script.setAttribute("async", true);
script.setAttribute("src", chrome.extension.getURL("override-fb-hotkeys.js")); //Assuming your host supports both http and https
var head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
head.insertBefore(script, head.firstChild)
然后将在包含页面的上下文中获取并执行 JavaScript,而不是来自 Chrome 插件的沙盒代码。