我有一个Chrome扩展程序,可使用以下命令将javscript注入所有框架

chrome.tabs.executeScript(tabId, { file: "findDoc.js", allFrames:true }, function () {
... }


这很好用,除非文档包含adsbygoogle,例如http://words.loqu8.net/simp_01.htmlhttp://words.loqu8.net/simp_02.html。在后一种情况下,似乎executeScript永远不会返回,并且永远不会调用该回调。

adsbygoogle块如下所示:

<div id="sponsor" style="display:block">
<script async src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script>
<!-- CWSJ Front&Article Page (Native-Right) -->
<ins class="adsbygoogle"
     style="display:inline-block;width:336px;height:280px"
     data-ad-client="ca-pub-4620242196338906"
     data-ad-slot="6183624152"></ins>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>




我已经尝试了所有runAt选项。这些都不起作用。好像adsbygoogle拒绝了executeScript。

Google Ads绝对在框架中,因此似乎allFrames:false至少应该使其起作用(不起作用)。 Google的iframe看起来像

<iframe width="336" height="280" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&amp;&amp;s.handlers,h=H&amp;&amp;H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&amp;&amp;d&amp;&amp;(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_0" name="aswift_0" style="left:0;position:absolute;top:0;"></iframe>


更新。事实证明,我注入了两个脚本,两个脚本都具有allFrames:true。如果allframes:false,我的代码工作正常。因此,这里的真正问题是,如何拥有allFrames:true,但跳过adsbygoogle框架。即使注入的脚本仅包含“ console.log”,它也会导致executeScript从不返回。

更新2。即使注入的脚本没有任何内容(注释掉所有内容),executeScript仍然挂在Adwords框架上,并且永远不会返回。

最佳答案

我能够使它在allFrames为true的情况下工作,但前提是将runAt设置为document_start

在这种情况下,回调肯定会针对主文档执行,但是我无法验证它是否针对iframe运行。

09-25 13:18