IE下使用cloneNode注意事项分享


Posted in Javascript onNovember 22, 2012

cloneNode 是 HtmlElement 原型链上的方法,用于创建指定 dom 节点的拷贝,它接受一个布尔参数 include_all,如果 include_all 设置为 true,则副本会带有指定节点的所有子节点。

然而,script 标签也是 dom 节点,cloneNode 对其依然有效,经实测各浏览器(尤其是IE)对 cloneNode 执行结果表现不一致,主要现象为以下两种:

IE,至少是 IE8 及以下,对某节点 cloneNode 时,如果该节点包含 script 节点,那么 script 节点的脚本内容“有可能”会被再次执行一次。
非 IE 浏览器,cloneNode 某节点,包含的 script 节点的脚本内容不会被再次执行。
IE 以外的浏览器表现令我很满意,而针对于上面所述 IE 的“有可能”,还分以下两种情况:

如果 cloneNode 一个 script 节点,无论该节点是外链脚本,还是内嵌脚本,均不会被再次执行。
如果 cloneNode 一个其它节点,该节点下包含的内嵌脚本不会被执行,而包含的外链脚本,会被再次执行一次。
这里有一个 demo 复现了 IE 下 cloneNode 的这个问题。

看到这里,你是不是要被绕晕了?解决方法很简单,不用管是什么浏览器,cloneNode 之前,把目标节点下所有的 script 标签移除即可,因为脚本已经执行过,移除它的标签并不会造成影响,如下:

function cloneNode(dom){ 
var scripts = dom.getElementsByTagName("script"); 
for(var i = scripts - 1, s; i >= 0; i --){ 
s = scripts[i]; 
s.parentNode.removeChild(s); 
} 
return dom.cloneNode(true); 
}

因此,我们在使用 cloneNode(true) 时一定要注意思考:所复制节点内的所有子节点是否都是需要的?尽量把不需要的都干掉,避免造成负作用影响,再举个例子,如果复制 div 中包含 iframe,而 iframe 的页面里有脚本 parent.xxx…,那么 iframe 里的这些脚本必然会再重新执行一次,iframe 页本身没问题(也不一定),但由于它操作了 parent,那么这个 parent 造成的影响就难以估量了。解决方法是 cloneNode 之后,把副本里包含的 iframe 干掉,当然,如果剧情所需,iframe 不能干掉的话,就在 iframe 页里的脚本自行做判断了。

另外,cloneNode 目标节点内包含 link 标签的话,这个估计也会有些影响,我没有做实验,如果没用的话,也是 removeChild 了之,以绝后患。

Javascript 相关文章推荐
javascript的原生方法获取数组中的最大(最小)值
Dec 19 Javascript
JS调用CS里的带参方法实例
Aug 01 Javascript
JavaScript保留关键字汇总
Dec 01 Javascript
JS实现回到页面顶部动画效果的简单实例
May 24 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
Feb 24 Javascript
Angular 1.x个人使用的经验小结
Jul 19 Javascript
js定时器+简单的动画效果实例
Nov 10 Javascript
JQuery元素快速查找与操作
Apr 22 jQuery
微信小程序wx:for循环的实例详解
Oct 07 Javascript
VuePress 快速踩坑小结
Feb 14 Javascript
layui输入框中只允许输入整数的实现方法
Sep 18 Javascript
基于postman获取动态数据过程详解
Sep 08 Javascript
jquery remove方法应用详解
Nov 22 #Javascript
FusionCharts图表显示双Y轴双(多)曲线
Nov 22 #Javascript
ECMAScript 创建自己的js类库
Nov 22 #Javascript
javascript克隆对象深度介绍
Nov 20 #Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
Nov 20 #Javascript
JS中toFixed()方法引起的问题如何解决
Nov 20 #Javascript
JavaScript实现拼音排序的方法
Nov 20 #Javascript
You might like
用PHP制作静态网站的模板框架
2006/10/09 PHP
php使用正则表达式获取图片url的方法
2015/01/16 PHP
如何用PHP做到页面注册审核
2017/03/02 PHP
删除PHP数组中的重复元素的实现代码
2017/04/10 PHP
php mysql PDO 查询操作的实例详解
2017/09/23 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
图解js图片轮播效果
2015/12/20 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
使用Ajax与服务器(JSON)通信实例
2016/11/04 Javascript
Angular2 父子组件数据通信实例
2017/06/22 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
react中使用swiper的具体方法
2018/05/15 Javascript
JS获取子节点、父节点和兄弟节点的方法实例总结
2018/07/06 Javascript
jQuery中常用动画效果函数知识点整理
2018/08/19 jQuery
element-ui中select组件绑定值改变,触发change事件方法
2018/08/24 Javascript
vue 中使用 watch 出现了如下的报错的原因分析
2019/05/21 Javascript
零基础写python爬虫之urllib2使用指南
2014/11/05 Python
更新修改后的Python模块方法
2019/03/03 Python
Python匿名函数及应用示例
2019/04/09 Python
详解PyCharm安装MicroPython插件的教程
2019/06/24 Python
Python创建数字列表的示例
2019/11/28 Python
Tensorflow中k.gradients()和tf.stop_gradient()用法说明
2020/06/10 Python
pycharm配置安装autopep8自动规范代码的实现
2021/03/02 Python
德国街头和运动文化高品质商店:BSTN Store
2017/08/26 全球购物
老公爱的承诺书
2014/03/31 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
学习十八届四中全会依法治国心得体会
2014/11/03 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
2015年终个人政治思想工作总结
2015/11/24 职场文书
react国际化react-intl的使用
2021/05/06 Javascript
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python