document.write()的一些坑

  这段时间在做一个广告系统,需要用js自动生成广告代码,其中遇到一些问题,在这记录下。

  第三方广告代码一般都是用 document.write()向页面写入,这次使用的时候遇到不少坑,经常会出现使用document.write()向页面写入的时候当前页面被清 空。这正是document.write()的特殊之处,页面载入后浏览器输出流自动关闭。此后对当前页面进行document.write()操作将打 开—个新的输出流,它将清除当前页面内容(包括源文档的任何变量或值)。

  那么有哪些浏览器输出流关闭的标识呢?我们首先想到的是 window.onload,在window.onload后页面加载完成,浏览器输出流必然关闭。经测试$(document).ready()中的操 作也是在浏览器输出流关闭之后执行。所以用于生成代码的document.write()不能写在window.onload 和$(document).ready()中。除了这两个之外有没有其他坑呢?js生成广告代码中需要ajax获取服务端的数据,ajax请求成功之后再 document.write()写入仍然会发生覆盖。这是因为jquery的ajax默认是异步请求,并不阻塞文档流,当ajax请求成功之后在执行操 作,浏览器输出流很可能就关闭了。这种情况可以把ajax默认请求改成同步,阻塞文档流,防止document.write()覆盖。

   由于第三方广告代码使用document.write()输出,所有的广告资源都在页面载入时加载,如果页面上第三方广告比较多,必然会阻塞页面加载。有 没有办法在使用document.write()的情况下不阻塞页面加载呢?其实是可以的,这里就需要我们改造原生的document.write()方 法,在广告加载完毕再把原生方法改回来。这里就不具体展开来写,雨夜带刀博客《让document.write的广告无阻塞的加载》有详细分析,这里贴一下带刀改造document.write()的代码。

 1 /**
 2  * 重写document.write实现无阻塞加载script
 3  * @param { Dom Object } textarea元素
 4  */
 5 var loadScript = function( elem ){
 6     var url = elem.value.match( /src="([\s\S]*?)"/i )[1],
 7         parent = elem.parentNode,
 8         // 缓存原生的document.write
 9         docWrite = document.write,
10         // 创建一个新script来加载
11         script = document.createElement( ‘script‘ ),
12         head = document.head ||
13             document.getElementsByTagName( ‘head‘ )[0] ||
14             document.documentElement;
15
16     // 重写document.write
17     document.write = function( text ){
18         parent.innerHTML = text;
19     };
20
21     script.type = ‘text/javascript‘;
22     script.src = url;
23
24     script.onerror =
25     script.onload =
26     script.onreadystatechange = function( e ){
27         e = e || window.event;
28         if( !script.readyState ||
29         /loaded|complete/.test(script.readyState) ||
30         e === ‘error‘
31         ){
32
33             // 恢复原生的document.write
34             document.write = docWrite;
35             head.removeChild( script );
36
37             // 卸载事件和断开DOM的引用
38             // 尽量避免内存泄漏
39             head =
40             parent =
41             elem =
42             script =
43             script.onerror =
44             script.onload =
45             script.onreadystatechange = null;
46
47         }
48     }
49
50     // 加载script
51     head.insertBefore( script, head.firstChild );
52 };
时间: 2024-08-26 01:12:13

document.write()的一些坑的相关文章

问卷项目--js跨域

项目中因为要把问卷投放到第三方,并且对方要收集统计数据,因此在调用对方接口的时候就会存在跨域的问题. 1. 什么叫js跨域 浏览器不允许javascript跨域请求其他域名下的内容.端口号不同,主域相同子域不同,协议不同,不同域名等等情况 下面表格里的a.js是无法获取b.js的内容的. 情况 举例 端口号不同 http://www.baidu.com/a.js   vs.  http://www.baidu.com:8080/b.js 主域相同子域不同 http://www.baidu.com

在script所在位置插入内容

上一篇文章document.write()的一些坑说了浏览器输出流关闭后使用document.write会清空当前页面,因此要避免在window.onload.$(document).ready()和ajax获取数据后使用document.write插入内容.但是这些常用操作又是很难避免的,那么在使用上述三种方法的时候能不能达到document.write()同样的效果呢? 其实是可以的实现的,我们知道js中除了可以用docuemnt.write插入内容,还可以使用appendChild,利用a

移动端点击事件全攻略,有你知道与不知道的各种坑

看标题的时候你可能会想,点击事件有什么好说的,还写一篇攻略?哈哈,如果你这么想,只能说明你too young to simple. 接触过移动端开发的同学可能都会面临点击事件的第一个问题:click事件的300ms延迟响应.不能立即响应给体验造成了很大的困扰,因此解决这个问题就成为了必然. 这个问题的解决方案就是: zepto.js的tap事件.tap事件可以理解为在移动端的click事件,而zepto.js因为几乎完全复制jQuery的api,因此常常被用在h5的开发上用来取代jquery.

那些年我们踩过的坑之表单reset

开发者往往是在一个又一个的坑中成长起来的,自学的开发者尤其如此,刚刚填完一个坑,转身又掉进另一个坑.有些坑很容易就跳出来了,也有些坑能整了一天都没头绪,第二天早上一来发现后面就有一架通往坑外的梯子,坑爹啊,问题原来这么简单! 我今天就踩了一个比较坑的坑,好在花了几分钟就跳出来了.事情是这样的: 今天在做一个新增自定义假期的功能,用到了表单.页面上有个新增按钮,点击弹出一个层,里面就是表单,用的是ajax提交.当用户点击取消时(顺便吐槽一下,保存和取消按钮设计得实在是太丑了),清空表单数据,弹出层

webpack渐入佳境系列一:webpack环境配置与打包基础【附带各种 "坑" 与解决方案!持续更新中...】

首先介绍传统模块化开发的主流方案: 1.基与CMD的sea.js,玉伯提出的解决方案,据说原来京东团队在使用.用时才定义,就近加载.最近在浏览seajs官方文档时发现seajs的域名已经在转卖,惊恐万分之余又想起了那句话,国内团队开发的技术,不是十全九美的最好不要用.国内高强度的生活节奏与压力使得日常维护变得很吃力.(想到这里,不禁为vue捏了一把汗,不过还好vue的前景非常光明!). 2.基于AMD的require.js,之前在用.提前声明与定义.国外团队维护. 3.基于commonJS的we

一名Android开发者的微信小程序填坑之路(1)

前言 首先要声明的是,我是一名 Android 开发者,之前基本没有前端开发经验,甚至连 JS ,HTML 都是为了开发小程序现学的一些皮毛--所以文章中所提到的一些点也许在资深前端开发者看来只是小case,但是站在一个 Android 开发者的角度来看确实是大坑. 前面就不说太多东西了,文章的末尾再谈谈我对小程序的一些看法--这篇文章主要是谈谈在开发小程序的过程中遇到的一些坑. PS:推荐一下我写的一个微信小程序版的Gank客户端:wechat-weapp-gank 正文 1,获取小程序开发工

一名Android开发者的微信小程序填坑之路(2)

前言 上一篇是九月二十七日写的,而这一篇我动笔的时间是十月十日(特殊的日子),中间相隔十三天--当然是因为国庆节.说老实话,这十三天里面我都没有碰和小程序有关的东西--毕竟学习小程序的开发也只是起于兴趣,而平时的工作并不会涉及与其相关的东西--但是在这十三天里,我能明显的感受到小程序热正在逐渐的消退,或者说大家正在逐渐以一种较为平和的姿态接受它的存在,其实这是一件好事.期待公测的到来. 接下来我就直接进入正题了,另外,文末我想和大家分享一下我的国庆节. PS:这篇文章是接着上一篇文章 一名And

使用WebDriver遇到的那些坑

http://blog.csdn.net/oWuFeng1/article/category/2722111 在做web项目的自动化端到端测试时主要使用的是Selenium WebDriver来驱动浏览器.Selenium WebDriver的优点是支持的语言多,支持的浏览器多.主流的浏览器Chrome.Firefox.IE等都支持,手机上的浏览器Android.IPhone等也支持,甚至还支持PhantomJS(由于PhantomJS跑测试时并不需要渲染元素,所以执行速度快). 但是我在使用S

手机那点事!已有高人把常见的不常见的坑都给找出来了,我就随便转一下了

mobileTech A useful tools or tips list for mobile web application developing 这个项目收集移动端开发所需要的一些资源与小技巧 工具类网站 HTML5 与 CSS3 技术应用评估 各种奇妙的hack 几乎所有设备的屏幕尺寸与像素密度表 移动设备参数表 ios端移动设备参数速查 浏览器兼容表 移动设备查询器 移动设备适配库 移动设备适配库2 viewport与设备尺寸在线检测器 html5 移动端兼容性速查 在线转换字体 c