在网页中使用document.write时遭遇的奇怪问题


Posted in Javascript onAugust 24, 2010

在前些日子的对Razor模板引擎向JavaScript移植进行研究的过程中,我发现如果使用document.write输出的内容中包含了调用外部的JavaScript的<script>标记,就可能出现一点问题——在这里面被调用的外部JavaScript可能会在不适当的时间被执行,对于IE和Opera来说,就是当write的参数中的所有其它部分内容都被解析之后,这些外部的JavaScript才会执行。

而在进一步研究中我又发现,对于Chrome和Safari这两个使用了WebKit网页排版引擎的浏览器来说,如果外部调用的JavaScript中再次调用document.write来写入另一个调用外部JavaScript的<script>标记,则第二次调用的外部JavaScript不会被执行,而之后的一些内容也会被打乱——实际情况其实要稍微复杂一点,跟第二级、第三级document.write调用的参数中的具体内容有关,因为时间和精力的关系我没有办法作更具体的测试了。

在经过这些研究以后,几大主流浏览器中唯一幸存的、能正确处理所有document.write调用的,就只有Firefox了。
Firefox的一种伪“多线程”事件处理的特性一直是让我很不见待的东西,这件事也算是对“各有所长”的一个佐证吧。

想要了解这个问题所引发的种种现象,可以下载write-test.zip,解压之后用各种浏览器打开其中的write-test.htm。

这几天我一直在尝试编写一个替用函数来解决这个问题,目前已经能顺利通过上面那个链接中的测试了。
如果接下来的几天之内没有发现什么明显的问题,我会把它发在博客上供大家参考。
测试代码,打包下载

Javascript 相关文章推荐
javascript 写类方式之七
Jul 05 Javascript
ExtJs的Date格式字符代码
Dec 30 Javascript
JS操作Cookies包括(读取添加与删除)
Dec 26 Javascript
解决json日期格式问题的3种方法
Feb 02 Javascript
javascript设计简单的秒表计时器
Sep 05 Javascript
简介BootStrap model弹出框的使用
Apr 27 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
Jan 19 Javascript
利用Js+Css实现折纸动态导航效果实例源码
Jan 25 Javascript
Vue渲染函数详解
Sep 15 Javascript
微信小程序实现YDUI的ScrollNav组件
Feb 02 Javascript
layui实现数据表格隐藏列的示例
Oct 25 Javascript
解决vue+webpack项目接口跨域出现的问题
Aug 10 Javascript
javascript下string.format函数补充
Aug 24 #Javascript
javascript下利用arguments实现string.format函数
Aug 24 #Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 #Javascript
js null,undefined,字符串小结
Aug 21 #Javascript
javascript中的float运算精度实例分析
Aug 21 #Javascript
Firebug入门指南(Firefox浏览器)
Aug 21 #Javascript
jquery插件之easing 动态菜单
Aug 21 #Javascript
You might like
B2K与车机的中波PK
2021/03/02 无线电
用PHP函数解决SQL injection
2006/10/09 PHP
php.ini 配置文件的深入解析
2013/06/17 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
PHP7新特性之抽象语法树(AST)带来的变化详解
2018/07/17 PHP
Jquery中获取iframe的代码
2011/01/11 Javascript
jquery构造器的实现代码小结
2011/05/16 Javascript
jQuery数据缓存功能的实现思路及简单模拟
2013/05/27 Javascript
用js的for循环获取radio选中的值
2013/10/21 Javascript
Jquery插件编写简明教程
2014/03/25 Javascript
jquery的总体架构分析及实现示例详解
2014/11/08 Javascript
JavaScript按值删除数组元素的方法
2015/04/24 Javascript
分类解析jQuery选择器
2016/11/23 Javascript
Vuejs 用$emit与$on来进行兄弟组件之间的数据传输通信
2017/02/23 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
vue学习笔记五:在vue项目里面使用引入公共方法详解
2019/04/04 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
vue + axios get下载文件功能
2019/09/25 Javascript
Vue组件通信$attrs、$listeners实现原理解析
2020/09/03 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
Python中编写ORM框架的入门指引
2015/04/29 Python
Python设计实现的计算器功能完整实例
2017/08/18 Python
Python生成器常见问题及解决方案
2020/03/21 Python
解决Django响应JsonResponse返回json格式数据报错问题
2020/08/09 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
台湾菁英交友:结识黄金单身的台湾人
2018/01/22 全球购物
JoJo Maman Bébé爱尔兰官网:英国最受欢迎的精品母婴品牌
2020/12/20 全球购物
Linux的主要特性
2014/10/06 面试题
高二历史教学反思
2014/01/25 职场文书
单位委托书范本(3篇)
2014/09/18 职场文书
2014年大学班长工作总结
2014/11/14 职场文书
2014年小学安全工作总结
2014/12/04 职场文书
护士个人总结范文
2015/02/13 职场文书
《比的意义》教学反思
2016/02/18 职场文书