asbygoogle导致chrome executioncript永远不会返回

时间:2015-12-21 23:51:57

标签: javascript google-chrome

我有一个Chrome扩展程序,使用

将javscript注入allframes
chrome.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&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框架。即使注入的脚本只包含&#39; console.log&#39;它导致executeScript永远不会返回。

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

2 个答案:

答案 0 :(得分:1)

我可以让它适用于allFrames true,但前提是我将runAt设置为document_start

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

答案 1 :(得分:0)

不幸的是,我没有为清单权限找到类似“exclude_matches”的内容,只需编码就可以了 MySqlCommand或类似的东西。 但是,如果您不需要这些adsgoogle框架,则可以

1)关闭它们;

2)运行你的脚本。

执行两个executeScripts: 第一个脚本与allframes一起运行:false。它只是找到具有这样一个主机的所有帧(使用jquery,querySelectorAll等),并设置它们src =“”; (您可以在设置之前保存原始源,并在以后主脚本完成其工作时将其还原)。 第二个脚本是您的主脚本,您可以在第一个脚本的回调中运行它。