Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/440.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
Javascript Chrome扩展名-从扩展名访问文档/页面变量_Javascript_Google Chrome_Google Chrome Extension - Fatal编程技术网

Javascript Chrome扩展名-从扩展名访问文档/页面变量

Javascript Chrome扩展名-从扩展名访问文档/页面变量,javascript,google-chrome,google-chrome-extension,Javascript,Google Chrome,Google Chrome Extension,我正在尝试开发只在指定页面上工作的扩展-如果页面所有者将全局变量添加到他们的代码中(例如,ACCEPT\u STATS=true;),我希望执行指定的代码 我已经将我的函数绑定到onload事件,我还找到了在Firefox中如何实现这一点的解决方案: var win = window.top.getBrowser().selectedBrowser.contentWindow; if (typeof win.wrappedJSObject.ACCEPT_STATS !== 'undefined'

我正在尝试开发只在指定页面上工作的扩展-如果页面所有者将全局变量添加到他们的代码中(例如,
ACCEPT\u STATS=true;
),我希望执行指定的代码

我已经将我的函数绑定到onload事件,我还找到了在Firefox中如何实现这一点的解决方案:

var win = window.top.getBrowser().selectedBrowser.contentWindow;
if (typeof win.wrappedJSObject.ACCEPT_STATS !== 'undefined') {
    // code to run if global variable present
}
但我无法在Chrome下工作。是否有可能访问文档的全局变量扩展代码


我的扩展代码作为内容脚本注入。

页面上运行的javascript与使用内容脚本注入的javascript在不同的“孤立世界”中运行。Google Chrome出于安全原因将这两个世界分开,因此您不能在任何窗口上读取window.XYZ。有关孤立世界如何工作的更多信息:

实现这一点的正确方法是通过window.postMessage API与页面通信。以下是我将如何着手的:

  • 在每个选项卡中插入内容脚本
  • 通过window.postMessage向选项卡发送消息
  • 如果页面理解此消息,它将正确响应(再次通过window.postMessage)
  • 内容脚本执行它需要执行的代码

  • HTH

    是,将脚本包含到页面中不会在独立于页面运行时脚本的上下文中运行

    但是,通过在文档的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].
    });
    

    这听起来像是内容脚本应该做的事情,不是吗?“但是,内容脚本有一些限制。它们不能:[……]使用由网页或其他内容脚本定义的变量或函数。”内容脚本是在一个孤立的世界中执行的。你必须将代码注入页面。是的,这就是问题所在。我搜索带有提供的全局JS变量的网站,并想测试指定页面是否包含该变量。但是,只要网页正在侦听,就可以使用window.postMessage在内容脚本和网页之间进行通信。但如果不认真听,我认为这是不可能的,因为它违反了安全政策。在我看来,这是一个很好的解决方案。但是,请注意,“initCustomEvent”已被弃用。相反,您可以使用“CustomEvent”构造函数。来源:我得到一个
    未捕获的TypeError:“)();”不是一个函数
    错误。这个解决方案应该还能工作吗?它实际上是通过传递一个多行字符串来工作的:
    scr.textContent=`var event=document.createEvent(“CustomEvent”);initCustomEvent(“MyCustomEvent”,true,true,{“passback”:token});window.dispatchEvent(事件);`