我有一个Chrome扩展程序,使用
将javscript注入allframeschrome.tabs.executeScript(tabId, { file: "findDoc.js", allFrames:true }, function () {
... }
除非文档包含adsbygoogle,例如http://words.loqu8.net/simp_01.html vs 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广告绝对是一个框架,所以似乎allFrames:false至少应该让它工作(它没有)。谷歌的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框架。即使注入的脚本只包含&#39; console.log&#39;它导致executeScript永远不会返回。
更新2。即使注入的脚本没有任何内容(注释掉所有内容),executeScript仍然会挂在Adwords框架上,永远不会返回。
答案 0 :(得分:1)
我可以让它适用于allFrames
true,但前提是我将runAt
设置为document_start
。
在这种情况下,回调肯定会对主文档执行,但我无法验证它是否为iframe运行。
答案 1 :(得分:0)
不幸的是,我没有为清单权限找到类似“exclude_matches”的内容,只需编码就可以了
MySqlCommand
或类似的东西。
但是,如果您不需要这些adsgoogle框架,则可以
1)关闭它们;
2)运行你的脚本。
执行两个executeScripts: 第一个脚本与allframes一起运行:false。它只是找到具有这样一个主机的所有帧(使用jquery,querySelectorAll等),并设置它们src =“”; (您可以在设置之前保存原始源,并在以后主脚本完成其工作时将其还原)。 第二个脚本是您的主脚本,您可以在第一个脚本的回调中运行它。