2016-11-05 156 views
3

目前,我们这是在manifest.json文件中初始化如下内容的脚本:内容脚本在Chrome扩展程序被执行多次

"content_scripts": [ 
    { 
    "matches": [ 
     "https://docs.google.com/*" 
     ], 
    "js ["content.js"], 
    "run_at": "document_start", 
    "all_frames": true, 
    "match_about_blank": true  
    } 

], 

其设置为运行每次用户加载了谷歌文档文档。然而,通过查看控制台日志,好像内容脚本被加载(是正确的单词注入?)多次,因为我们得到多个控制台日志。

我读过一些其他的答案,这可能与内容脚本加载一次,当谷歌文档标签加载一次,一旦它完成加载,所以它运行多次的事实;尽管如何防止这种情况发生?

回答

5

问题是"all_frames": true。谷歌文档嵌入了许多iframe■从同一个域:

<iframe src="https://docs.google.com/document/u/0/preload" style="display:none;" tabindex="-1"></iframe> 
<iframe src="https://docs.google.com/offline/iframeapi?ouid=REDACTED#cd=1" style="display: none;"></iframe> 

你的内容脚本是越来越注入到所有这些帧。

如果您设置了​​:您的内容只会被注入到顶部框架中,并且在浏览到Google文档时只会记录一次。

+0

好的,谢谢你!那么,如果我们试图监控用户对Google文档的使用情况,并且需要将我们的内容脚本注入到所有iframe中,但是我们不希望我们的内容脚本多次运行?那可能吗? –

+1

这些看起来像是从根本上反对的目标。你有一个约束,你需要将内容脚本注入到所有的框架中。这意味着它将在所有这些中运行;这是不可避免的。这听起来像你想要做的是“使用来自各种帧的信息,只运行一次脚本,然后改变(一些?)这些帧”。为此,您需要一种方式让内容脚本互相协调和交流。你需要一个单独的共享状态。你可以使用“背景脚本”内容脚本可以发送消息,并且可以发回消息。 – Birchlabs

+0

不需要内容脚本。请参阅选项卡API –

相关问题