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 相关文章推荐
js+xml生成级联下拉框代码
Jul 24 Javascript
单击复制文字兼容各浏览器的完美解决方案
Jul 04 Javascript
jquery插件pagination实现无刷新ajax分页
Sep 30 Javascript
jQuery中cookie插件用法实例分析
Dec 04 Javascript
jQuery Mobile页面返回不需要重新get
Apr 26 Javascript
jQuery实现响应鼠标事件的图片透明效果【附demo源码下载】
Jun 16 Javascript
Javascript中判断一个值是否为undefined的方法详解
Sep 28 Javascript
原生JS实现《别踩白块》游戏(兼容IE)
Feb 20 Javascript
JS获取月的第几周和年的第几周实例代码
Dec 05 Javascript
8 个有用的JS技巧(推荐)
Jul 03 Javascript
JS使用Chrome浏览器实现调试线上代码
Jul 23 Javascript
基于原生JS封装的Modal对话框插件的示例代码
Sep 09 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
JS实现php的伪分页
2008/05/25 PHP
使用Limit参数优化MySQL查询的方法
2008/11/12 PHP
PHP实现的堆排序算法详解
2017/08/17 PHP
php图片裁剪函数
2018/10/31 PHP
Exitjs获取DataView中图片文件名
2009/11/26 Javascript
Javascript类库的顶层对象名用户体验分析
2010/10/24 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
javascript ready和load事件的区别示例介绍
2013/08/30 Javascript
关于延迟加载JavaScript
2015/05/05 Javascript
jQuery采用连缀写法实现的折叠菜单效果
2015/09/18 Javascript
chrome浏览器当表单自动填充时如何去除浏览器自动添加的默认样式
2015/10/09 Javascript
10个JavaScript中易犯小错误
2016/02/14 Javascript
JS模拟bootstrap下拉菜单效果实例
2016/06/17 Javascript
微信小程序 wx.request(object) API详解及实例代码
2016/09/30 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
vue使用stompjs实现mqtt消息推送通知
2017/06/22 Javascript
JavaScript+HTML5实现的日期比较功能示例
2017/07/12 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
小程序使用watch监听数据变化的方法详解
2019/09/20 Javascript
[00:32]2018DOTA2亚洲邀请赛出场——LGD
2018/04/04 DOTA
跟老齐学Python之玩转字符串(2)
2014/09/14 Python
浅析Python中signal包的使用
2015/11/13 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
python自带的http模块详解
2016/11/06 Python
python爬虫入门教程--正则表达式完全指南(五)
2017/05/25 Python
Django url,从一个页面调到另个页面的方法
2019/08/21 Python
python中count函数简单的实例讲解
2020/02/06 Python
matplotlib绘制多子图共享鼠标光标的方法示例
2021/01/08 Python
大学生毕业自我鉴定范文
2013/11/03 职场文书
大学生职业生涯规划书范文
2014/01/04 职场文书
开展党的群众路线教育实践活动总结报告
2014/10/31 职场文书
预备党员个人总结
2015/02/14 职场文书
优秀党员个人总结
2015/02/14 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS