javascript - Chrome 扩展程序 - 从扩展程序访问文档/页面变量

标签 javascript google-chrome google-chrome-extension

我正在尝试开发仅适用于指定页面的扩展 - 如果页面所有者将全局变量添加到他们的代码中(例如。ACCEPT_STATS = true;)我想执行指定的代码。

我已经将我的函数绑定(bind)到 onload 事件,我还找到了如何在 Firefox 中执行此操作的解决方案:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
if (typeof win.wrappedJSObject.ACCEPT_STATS !== 'undefined') {
    // code to run if global variable present
}

但我无法在 Chrome 下进行这项工作。是否有可能访问文档的全局变量抛出 Chrome 扩展代码?

我的扩展程序代码作为内容脚本注入(inject)。

最佳答案

是的,将脚本包含到页面中确实在与页面运行时脚本隔离的上下文中运行。

但是,通过附加到文档 html 的脚本标记将内联脚本推送到运行时上下文中,可以解决孤立世界问题。然后,该内联脚本可以抛出一个自定义事件。

独立上下文中包含的脚本可以监听该事件并相应地做出响应。

因此,您包含的脚本中的代码将如下所示:

// inject code into "the other side" to talk back to this side;
var scr = document.createElement('script');
//appending text to a function to convert it's src to string only works in Chrome
scr.textContent = '(' + function () { 
  var check = [do your custom code here];
  var event = document.createEvent("CustomEvent");  
  event.initCustomEvent("MyCustomEvent", true, true, {"passback":check});
  window.dispatchEvent(event); } + ')();'
//cram that sucker in 
(document.head || document.documentElement).appendChild(scr);
//and then hide the evidence as much as possible.
scr.parentNode.removeChild(scr);
//now listen for the message
window.addEventListener("MyCustomEvent", function (e) {
  var check = e.detail.passback;
  // [do what you need to here].
});

关于javascript - Chrome 扩展程序 - 从扩展程序访问文档/页面变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21731635/

相关文章:

html - Firefox 呈现 Bootstrap 3 `.form-inline` 和比 Chrome 更宽的文本输入

javascript - Sequelize : instance. get 不是一个函数

javascript - 使用 modernizr 确定是否支持多窗口打开

javascript - jquery every() 函数不适用于输入字段

css - 网站在不同计算机上的同一浏览器和操作系统中显示不同的故障排除

javascript - 无法使用注入(inject)的 jQuery

javascript - 显示本地存储变量

google-chrome - Chrome 不信任 M70 for Aliexpress

javascript - React Native App 在一周内死掉(初始错误)

javascript - 为什么什么都不做就需要时间?