我有一个Chrome扩展程序,可使用以下命令将javscript注入所有框架
chrome.tabs.executeScript(tabId, { file: "findDoc.js", allFrames:true }, function () {
... }
这很好用,除非文档包含adsbygoogle,例如http://words.loqu8.net/simp_01.html与http://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&&s.handlers,h=H&&H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&&d&&(!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运行。