有这样需求,此 Chrome 插件需要监听任意网页中某个变量的变化,或是访问其中的值。但默认注入的 content.js 和原网页 Javascript 脚本并不运行在一个相同的环境中,无法相互访问。
搜索和自己尝试了如下的解决方法,不知是否还有更巧妙的方法?
content.js 没有办法访问到原网页,只要向 Dom 中再注入一个 inject.js 脚本就进入了原网页的作用域。如果能让 inject.js 与 content.js 或是直接与 background.js 通信即可。
接下来的通信问题的解决方法:
- 可以通过外部服务器中转,不过太麻烦了。
- inject.js 可以通过`chrome.runtime.sendMessage`直接向插件发起连接,但插件必须声明`externally_connectable`,并且安全起见不能使用*://*/*匹配所有域名。
- inject.js 可以注入 Dom 事件,由 content.js 捕获,可行。
- inject.js 可以写入 localStorage 或者其他共享的变量,由 content.js 轮询,不过如果变量发生了多次修改,每次的修改事件就很难及时发出。
- 可由 content.js 创建一个 SharedWorker 的函数,并将其转换为 Blob ,再使用`URL.createObjectURL`创建为共享链接存入 localStorage , inject.js 读取后此链接后,两个脚本同时连上同一个 SharedWorker ,由 worker 转发消息,可以很好双向通信。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/246279
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.