返回顶部
首页 > 资讯 > 前端开发 > VUE >怎么重写document.write实现无阻塞加载JS广告
  • 916
分享到

怎么重写document.write实现无阻塞加载JS广告

2024-04-02 19:04:59 916人浏览 薄情痞子
摘要

本篇内容主要讲解“怎么重写document.write实现无阻塞加载js广告”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重写document.write实

本篇内容主要讲解“怎么重写document.write实现无阻塞加载js广告”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重写document.write实现无阻塞加载JS广告”吧!

无阻塞加载javascript,对于页面性能优化有很大的作用,这样能有效的减少js对页面加载的阻塞。特别是一些广告js文件,由于广告内容有可能是富媒体,更是很可能成为你页面加载提速的瓶颈,高性能javascript告诉我们,同学,提升你的网页速度,就无阻塞地加载JS吧。

于是便有一下代码出现。

(function() {  var s = document.createElement('script');  s.type = 'text/javascript';  s.async = true;  s.src = 'Http://yourdomain.com/script.js';  var x = document.getElementsByTagName('script')[0];  x.parentnode.insertBefore(s, x);  })();

上边都是大家熟悉的,看过书的同学都知道这样无阻塞加载的好处,效果挺不错的,当此等无阻塞脚本遇到一般js广告就来了写问题——广告代码出现在html里面了却不显示广告。

纳尼?HTML出来了不渲染到页面上?

先看看广告js代码

document.write('<img src="/file/imgs/upload/202210/19/2yteldpaphw.gif" alt="LoGo">');

代码挺简单就一个document.write输出HTML代码(相信很多广告商的广告都这样),页面不显示广告问题在哪里呢? 问题就在这个document.write。为什么?先w3schools看看document.write的定义很使用吧。

定义和用法
write() 方法可向文档写入 HTML 表达式或 JavaScript 代码。
可列出多个参数(exp1,exp2,exp3,...) ,它们将按顺序被追加到文档中。

方法:
一是在使用该方在文档中输出 HTML,另一种是在调用该方法的的窗口之外的窗口、框架中产生新文档。在第二种情况中,请务必使用 close() 方法来关闭文档。

但其原理是在页面流输入过程中执行,一旦页面加载完毕,再次调用 document.write(),会隐式地调用 document.open() 来擦除当前文档并开始一个新的文档。也就是说如果在HTML加载完后我们再使用document.write会檫除之前生成html,而显示document.write输出的内容。

而我们例子中在页面加载完后在在html中输出document.write,就不会被执行了。问题知道了,原理知道了,那怎么解决这个问题呢?

异步利用ajax,行不同,很多广告文件都是第三方的,在不同域名下,存在跨域问题,而且不能我们控制其代码的输出。在这种情况下我们想到了一个办法就是重写掉document.write,在js文件加载结束后再把document.write重写回去。看代码。

***版本无阻塞加载js广告:

function LoadADScript(url, container, callback){          this.dw = document.write;          this.url = url;          this.containerObj = (typeof container == 'string'?document.getElementById(container):container);          this.callback = callback || function(){};      }            LoadADScript.prototype = {          startLoad: function(){              var script = document.createElement('script'),                  _this = this;                            if(script.readyState){ //IE                  script.onreadystatechange = function(){                  if (script.readyState == "loaded" || script.readyState == "complete"){                      script.onreadystatechange = null;                      _this.finished();                  }              };              }else{ //Other                  script.onload = function(){                      _this.finished();                  };              }                            document.write = function(ad){                  var html = _this.containerObj.innerHTML;                  _this.containerObj.innerHTML = html + ad;              }                            script.src = _this.url;              script.type = 'text/javascript';              document.getElementsByTagName('head')[0].appendChild(script);          },          finished: function(){              document.write = this.dw;              this.callback.apply();          }      };

页面调用代码:

var loadScript = new LoadADScript('ad.js','msat-adwrap',function(){ console.log('msat-adwrap'); });  loadScript.startLoad();        var loadScript = new LoadADScript('ad2.js','msat-adwrap',function(){ console.log('msat-adwrap2'); });  loadScript.startLoad();        var loadScript = new LoadADScript('ad3.js','msat-adwrap',function(){ console.log('msat-adwrap3'); });  loadScript.startLoad();

广告JS代码

//ad.js  document.write('<img src="/file/imgs/upload/202210/19/2yteldpaphw.gif" alt="Logo">');   //ad2.js  document.write('<img src="/file/imgs/upload/202210/19/ev2kmibfe0r.gif" width="270" height="129" usemap="#mp">');   //ad3.js  document.write('<img alt="Google" height="95" id="hplogo" src="/file/imgs/upload/202210/19/bndhurutcpn.png" width="275">');

***版本的问题是在多个文件调用的时候,会出现一些问题:

1. 由于文件加载的速度不一样,导致可能有些先加载有些后加载,也就是无序的,而且很多时候我们需要的是有序的。比如我们需要先加载***屏的广告。

2. 想有些广告需要前置设置一些参数的,例如google adsense

为了解决这两个问题好进一步修改成最终无阻塞加载js版本。

HTML页面代码:

<!DOCTYPE html>  <html lang="en">      <head>          <meta charset="utf-8" />          <title>new_file</title>          <script type="text/javascript" src="loadscript.js"></script>      </head>  <body>  <div id = "msat-adwrap"></div>  <div id = "msat-adwrap2"></div>  <script type="text/javascript">      loadScript.add({          url:'ad.js',          container: 'msat-adwrap',          callback:function(){ console.log('msat-adwrap'); }      }).add({          url:'ad2.js',          container: 'msat-adwrap2',          callback:function(){ console.log('msat-adwrap2'); }      }).add({//google adsense          url:'http://pagead2.googlesyndication.com/pagead/show_ads.js',          container: 'msat-adwrap',          init: function(){              google_ad_client = "ca-pub-2152294856721899";                           google_ad_slot = "3929903770";              google_ad_width = 250;              google_ad_height = 250;          },          callback:function(){ console.log('msat-adwrap3'); }      }).execute();  </script>  </body>  </html>

loadscript.js源代码

  var loadScript = ( function() {      var adQueue = [], dw = document.write;      //缓存js自身的document.write       function LoadADScript(url, container, init, callback) {          this.url = url;          this.containerObj = ( typeof container == 'string' ? document.getElementById(container) : container);          this.init = init ||          function() {          };           this.callback = callback ||          function() {          };       }       LoadADScript.prototype = {          startLoad : function() {              var script = document.createElement('script'), _this = this;               _this.init.apply();               if(script.readyState) {//IE                  script.onreadystatechange = function() {                      if(script.readyState == "loaded" || script.readyState == "complete") {                          script.onreadystatechange = null;                          _this.startNext();                      }                  };              } else {//Other                  script.onload = function() {                      _this.startNext();                  };              }              //重写document.write              document.write = function(ad) {                  var html = _this.containerObj.innerHTML;                  _this.containerObj.innerHTML = html + ad;              }               script.src = _this.url;              script.type = 'text/javascript';              document.getElementsByTagName('head')[0].appendChild(script);          },          finished : function() {              //还原document.write              document.write = this.dw;          },          startNext : function() {              adQueue.shift();              this.callback.apply();              if(adQueue.length > 0) {                  adQueue[0].startLoad();              } else {                  this.finished();              }          }      };       return {          add : function(adObj) {              if(!adObj)                  return;               adQueue.push(new LoadADScript(adObj.url, adObj.container, adObj.init, adObj.callback));              return this;          },          execute : function() {              if(adQueue.length > 0) {                  adQueue[0].startLoad();              }          }      };  }());

到此,相信大家对“怎么重写document.write实现无阻塞加载JS广告”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 怎么重写document.write实现无阻塞加载JS广告

本文链接: https://lsjlt.com/news/86772.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 怎么重写document.write实现无阻塞加载JS广告
    本篇内容主要讲解“怎么重写document.write实现无阻塞加载JS广告”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么重写document.write实...
    99+
    2024-04-02
  • Linux怎么实现设备阻塞/非阻塞读写
    本篇内容介绍了“Linux怎么实现设备阻塞/非阻塞读写”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!设备阻塞IO的实现当我们读写设备文件的I...
    99+
    2023-06-16
  • 图形编辑器中JS怎么实现拖拽阻塞
    本篇内容主要讲解“图形编辑器中JS怎么实现拖拽阻塞”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“图形编辑器中JS怎么实现拖拽阻塞”吧!图形编辑器中在图形编辑器中,想象这么一个场景,我们撤销了一些...
    99+
    2023-07-05
  • 基于JS实现弹性漂浮广告的示例代码怎么写
    这期内容当中小编将会给大家带来有关基于JS实现弹性漂浮广告的示例代码怎么写,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。效果图1.功能(鼠标移入移出事件、点击事件、定时器控制移动)div实现在页面上移动,...
    99+
    2023-06-26
  • JS怎么实现loading加载
    这篇文章主要讲解了“JS怎么实现loading加载”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS怎么实现loading加载”吧!防抖节流自定义指令一、问题现象操作系统流程时,网速过慢,点...
    99+
    2023-07-05
  • JavaScript实现跟随广告的代码怎么编写
    本篇文章为大家展示了JavaScript实现跟随广告的代码怎么编写,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。浮动广告是目前网站很常见的一种广告形式,浮动广告能实时跟随用户的浏览,有效的传达产品要...
    99+
    2023-06-25
  • js左右弹性滚动对联广告怎么实现
    要实现js左右弹性滚动对联广告,可以通过以下步骤来完成: 创建HTML结构:首先,在页面上创建两个对联广告容器,一个在左侧,一个在...
    99+
    2024-04-02
  • 怎么用CSS+JS+Cookie实现页脚固定广告展示
    这篇文章主要讲解了“怎么用CSS+JS+Cookie实现页脚固定广告展示”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用CSS+JS+Cookie实现页...
    99+
    2024-04-02
  • js怎么实现不同客户端显示不同广告
    这篇文章主要介绍“js怎么实现不同客户端显示不同广告”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“js怎么实现不同客户端显示不同广告”文章能帮助大家解决问题。核心代码var IsSpide...
    99+
    2023-07-05
  • js怎么实现图片的懒加载
    这篇文章给大家分享的是有关js怎么实现图片的懒加载的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。图片的懒加载是前端优化必须要掌握的东西,图片实现懒加载可以节省带宽又可以减轻我们网页的负荷。接下来我来记录一下我所掌...
    99+
    2023-06-14
  • 怎么在Android中实现一个广告无限循环功能
    今天就跟大家聊聊有关怎么在Android中实现一个广告无限循环功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。代码实现:public class NewsHom...
    99+
    2023-05-30
    android
  • vue2怎么实现带有阻尼下拉加载功能
    这篇“vue2怎么实现带有阻尼下拉加载功能”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue2怎么实现带有阻尼下拉加载功能...
    99+
    2023-07-05
  • vue无限加载指令怎么实现
    本文小编为大家详细介绍“vue无限加载指令怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue无限加载指令怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。vue 中的自定义指令是对底层 dom 进...
    99+
    2023-07-04
  • .net加载失败的程序集怎么实现重新加载
    这篇文章主要介绍“.net加载失败的程序集怎么实现重新加载”,在日常操作中,相信很多人在.net加载失败的程序集怎么实现重新加载问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”.net加载失败的程序集怎么实现重...
    99+
    2023-07-02
  • Vue怎么实现无限加载瀑布流
    这篇文章主要介绍“Vue怎么实现无限加载瀑布流”,在日常操作中,相信很多人在Vue怎么实现无限加载瀑布流问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue怎么实现无限加载瀑布流”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-25
  • js怎么实现无限加载自适应屏幕瀑布流图片效果
    这篇文章主要讲解了“js怎么实现无限加载自适应屏幕瀑布流图片效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“js怎么实现无限加载自适应屏幕瀑布流图片效果”...
    99+
    2024-04-02
  • js模拟怎么实现重载以及默认参数
    本篇内容主要讲解“js模拟怎么实现重载以及默认参数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js模拟怎么实现重载以及默认参数”吧!模拟实现重载以及默认参数众所周知,js是函数不支持重载和默认...
    99+
    2023-06-30
  • 怎么用js和ajax实现加载时的进度条
    这篇文章主要介绍“怎么用js和ajax实现加载时的进度条”,在日常操作中,相信很多人在怎么用js和ajax实现加载时的进度条问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么...
    99+
    2024-04-02
  • c++重载运算符怎么实现复数加减
    要实现复数的加减操作符重载,可以重载加法运算符"+“和减法运算符”-"。以下是一个示例代码: #include ...
    99+
    2024-03-15
    c++
  • 怎么使用JS和CSS实现加载进度条的效果
    这篇文章主要介绍“怎么使用JS和CSS实现加载进度条的效果”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用JS和CSS实现加载进度条的效果”文章能帮助大家解决问题。准备软件:HBuilderX...
    99+
    2023-07-04
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作