覆盖document.write以延迟脚本的执行

时间:2015-10-31 18:16:10

标签: javascript

我正在尝试延迟执行此广告脚本:

  <script type="text/javascript">
  var _pop = _pop || [];
  _pop.push(['siteId', 809347]);
  _pop.push(['minBid', 0.000000]);
  _pop.push(['popundersPerIP', 0]);
  _pop.push(['delayBetween', 0]);
  _pop.push(['default', false]);
  _pop.push(['defaultPerDay', 0]);
  _pop.push(['topmostLayer', false]);
  (function() {
    var pa = document.createElement('script'); pa.type = 'text/javascript'; pa.async = true;
    var s = document.getElementsByTagName('script')[0]; 
    pa.src = '//URL/pop.js';
    pa.onerror = function() {
      var sa = document.createElement('script'); sa.type = 'text/javascript'; sa.async = true;
      sa.src = '//URL/pop.js';
      s.parentNode.insertBefore(sa, s);
    };
    s.parentNode.insertBefore(pa, s);
  })();
</script>

为此,我以这种方式申请setTimeout

    setTimeout (function() {
   (function() {
    var pa = document.createElement('script'); pa.type = 'text/javascript'; pa.async = true;
    var s = document.getElementsByTagName('script')[0];
    pa.src = '//c1.popads.net/pop.js';
        pa.onerror = function() {
      var sa = document.createElement('script'); sa.type = 'text/javascript'; sa.async = true;
      sa.src = '//c2.popads.net/pop.js';
    document.head.appendChild(sa, s);
    };
    document.head.appendChild(pa, s);
  })();  }, 2300);
  </script>

并使用s.parentNode.insertBefore

更改了document.head.appendChild

脚本开始但我没有看到延迟。

我已经读过“如果目标脚本希望同步运行并使用document.write,那你就不走运了。除非,你想做一些涉及覆盖原生document.write函数的乱七八糟的黑客。” / p>

我需要覆盖document.write

1 个答案:

答案 0 :(得分:0)

您可以通过多种方法延迟执行任何脚本。简单的:

  1. 将脚本标记放在页面正文末尾之前,以便在浏览器解析完页面的其余部分后加载它们。因此,浏览器能够在脚本执行之前呈现页面。
  2. defer="defer" attribute添加到脚本标记(如果它加载外部文件)。在页面解析结束时执行被延迟。
  3. 在尝试时,使用包裹在代码周围的setTimeout来延迟。确保setTimeout本身被包装为执行on DOM ready event,否则它将在执行时启动计数器,然后渲染页面的其余部分,如果渲染速度很慢,您可能看不到任何效果。
  4. 在给定超时后异步加载脚本(但请参阅有关DOM ready事件的第3点)。在您的情况下,为什么不将广告加载程序代码放在外部文件中(因此您甚至不必修改它!),并在以后加载它(使用类似的脚本加载方法)?是的,这将加载一个装载机......
  5. 附注:

    • 使用someScriptElement.parentNode.insertBefore被认为是比document.head.appendChild更好的做法,因为文档可能没有标题。
    • 您引用的句子表示依赖document.write的任何脚本强制您同步加载 (因此应尽可能避免document.write)。您可以尝试通过覆盖document.write函数来模拟同步加载,以便您可以异步加载脚本。但在您的情况下,广告代码不使用document.write,并且它会异步加载另一个脚本 ,因此您不必费心。