代码之家  ›  专栏  ›  技术社区  ›  darbid

如何为注入网页框架的JavaScript文件提供布尔标志?

  •  0
  • darbid  · 技术社区  · 4 年前

    我目前有一个javascript文件,通过清单以声明方式注入。

    "content_scripts": [
    {
      "matches": ["http://example.com/*"],
      "all_frames": true,
      "js": ["doubleClickScript.js"]
    }
    

    ]

    双击脚本。js目前检测到一帧内的双击。

    window.addEventListener('dblclick', dblclickCheck);
    

    事件检查文本是否双击,然后通过 window.parent.document.dispatchEvent 它将文本发送回contentscript。扩展的js。

    我现在想创建一个选项来打开和关闭双击。这就引出了我的问题,即如何最好地做到这一点。

    我意识到我可以使用自定义事件或窗口。每次插入此文件时都会发送postMessage,但这似乎效率低下,尤其是页面上有5个帧一直在更改。

    最终,我是否有可能将内容脚本中的flag设置为true或false?

    if (flag) window.addEventListener('dblclick', dblclickCheck);
    

    我添加了javascript标签,因为这可能也是一个纯javascript问题。

    0 回复  |  直到 4 年前
        1
  •  1
  •   darbid    4 年前

    我想写下我是如何解决这个问题的。我觉得这对登陆这里的谷歌搜索者来说很重要。

    我有一个主要的理解问题,因为我没有阅读或理解 exactly what Google meant on content scripts. .如果你像我下面声明的那样“注入”你的JS文件,那么你的JS文件会按照你的意愿加载,但它仍然只是一个内容扩展。

    "content_scripts": [
    {
    "matches": ["http://example.com/*"],
    "all_frames": true,
    "js": ["doubleClickScript.js"]
    }
    

    所以上面的双击脚本。js无法读取网页变量,只能读写HTML等 is listed here under Content Script Capabilities. 在我看来,与其他内容脚本的交流并不容易。因此,在一天结束时,上面的文件双击脚本。js也可能出现在你的内容中。js文件。区别在于双击脚本。在我的例子中,js只在加载帧时注入(这很好)。此外,对文件的引用将是框架文件。在标准内容中。js文件在使用任何代码之前,您必须首先获得这个特定的框架和文档。这里是主要的问题,因为你需要知道什么时候帧已经加载,一切都准备好了。

    如果希望java脚本文件不被扩展规则禁用,则需要执行以下“注入”。我相信这也被称为注入文件,但一旦加载,它将能够读取网页javascript等。

    var dblclickscript = document.createElement('script');
    dblclickscript.src = chrome.extension.getURL('doubleClickScript.js');
    dblclickscript.id = 'dblclickscript';
    dblclickscript.type = 'text/javascript';
    (document.head || document.documentElement).appendChild(dblclickscript);
    

    理解了这一点后,我就可以解决我的问题了@伊万诺科诺科正确地展示了一种解决方案。当我有效地将内容脚本注入每个框架时,我可以使用chrome。存储不过,我可能采用了一种更复杂的方法。

    在我的主内容脚本中,我在网站主/顶部文档的头部添加了一个新的脚本标签。这里面有变量。这个脚本有一个id,所以我可以再次找到它。如果变量发生变化,那么我将使用id删除该脚本,然后将其放回原处。

    然后从我的双击脚本。js每次加载时,它也会向frames文档头加载一个脚本标记。此脚本使用Windows。家长要知道变量值是什么,在我的例子中,如果一个值为真,则添加一个eventlistent。

    此eventlistener调用一个自定义事件,我的主contentscript正在监听该事件。

    这比仅仅使用存储要复杂一些,但我已经在将脚本注入脚本标记中,所以这就是我想要坚持的。