Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何防止反adblock脚本更改';src&x27;iframe元素的属性是否异步?_Javascript_Jquery_Adblock - Fatal编程技术网

Javascript 如何防止反adblock脚本更改';src&x27;iframe元素的属性是否异步?

Javascript 如何防止反adblock脚本更改';src&x27;iframe元素的属性是否异步?,javascript,jquery,adblock,Javascript,Jquery,Adblock,我访问的站点具有以下脚本: <script type="text/javascript"> (function () { var ca = document.createElement('script'); ca.type = 'text/javascript'; ca.async = true; var s = document.getElementsByTagName(

我访问的站点具有以下脚本:

<script type="text/javascript">
        (function () {
            var ca = document.createElement('script');
            ca.type = 'text/javascript';
            ca.async = true;
            var s = document.getElementsByTagName('script')[0];
            ca.src = 'http://serve.popads.net/checkInventory.php';
            ca.onerror = function () {
                setTimeout(function () {
                    $('.embed-player').attr('src', "/adblock.html")
                }, 8000);
            }
            s.parentNode.insertBefore(ca, s);
        })();
    </script>
我试图查看iframe中的内容:

<iframe src="https://example.com" frameborder="0" class="embed-player" scrolling="no" allowfullscreen="true" webkitallowfullscreen="true" mozallowfullscreen="true" rel="nofollow"></iframe>
这很有效。但是

问题是我必须设置一个非常高的16000毫秒的超时值来抵消页面上使用的8000毫秒的超时值,因为有时候页面自己的异步调用比预期的要晚

这导致了在查看页面内容之前必须等待两个异步调用完成的麻烦

有没有比我使用的方法更有效的方法?


顺便说一句:我已经安装了Reek的反Adblock Killer Tampermonkey脚本和UBlock源代码过滤器——但由于某种原因,该站点上的脚本绕过了该代码(我已经检查过,它在大多数其他站点上都能工作)。它抛出一个控制台错误:
执行脚本“Anti-Adblock Killer | Reek”失败!无法分配给对象“#”的只读属性“adblock2”

有几种方法可以在代码运行之前劫持该代码

例如,可以防止在脚本元素上设置
onerror
属性:

Object.defineProperty(HTMLScriptElement.prototype, 'onerror', {
  setter: function() {}
});
如果您不想影响其他脚本

var onerror = Object.getOwnPropertyDescriptor(HTMLElement.prototype, 'onerror');
Object.defineProperty(HTMLScriptElement.prototype, 'onerror', {
  get: onerror.get,
  setter: function() {
    if(this.src !== 'http://serve.popads.net/checkInventory.php') {
      return onerror.set.apply(this, arguments);
    }
  }
});
或者,您可以添加一个捕获事件侦听器,以防止事件到达脚本

document.addEventListener('error', function(e) {
  if(e.target.tagName.toLowerCase() === 'script' &&
     e.target.src === 'http://serve.popads.net/checkInventory.php'
  ) {
    e.stopPropagation();
  }
}, true);
您还可以劫持
$.fn.attr
,以防止它将
src
更改为
“/adblock.html”

如果您的代码在您想要劫持的代码之后运行,正如Bergi所说,删除事件处理程序可能更简单:

iframe.onerror = null;

我建议修复导致其改变属性的原因,而不是解决症状


在本例中,“checkInventory.php”的请求似乎只是用作诱饵。因此,您可以简单地将异常规则
@|service.popads.net/checkInventory.php^
添加到您的广告拦截器中,这样就不会出现错误。

您可以尝试在您要阻止其src的iframe上使用
iframe.onerror=null
。对响应进行硬编码:
$('script[src>)="http://serve.popads.net/checkInventory.php“]”).attr(“src”,“数据:text/javascript,parseResponse({'result':0})”)
谢谢,但这两个都不起作用。如何更改iframe的类以便脚本不再找到它呢?谢谢!我将所有这些scriptlet添加到我的TamperMonkey脚本中,iframe仍然被覆盖。也没有控制台错误:(
document.addEventListener('error', function(e) {
  if(e.target.tagName.toLowerCase() === 'script' &&
     e.target.src === 'http://serve.popads.net/checkInventory.php'
  ) {
    e.stopPropagation();
  }
}, true);
var $attr = $.fn.attr;
$.fn.attr = function(attr, value) {
  if(attr === "src" && value === "/adblock.html") {
    return this;
  }
  return $attr.apply(this, arguments);
}
iframe.onerror = null;