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 相关文章推荐
TreeView 用法(有代码)(asp.net)
Jul 15 Javascript
js实现的GridView即表头固定表体有滚动条且可滚动
Feb 19 Javascript
javascript+html5实现绘制圆环的方法
Jul 28 Javascript
jQuery超简单选项卡完整实例
Sep 26 Javascript
js实现图片淡入淡出切换简易效果
Aug 22 Javascript
js自定义Tab选项卡效果
Jun 05 Javascript
vue实现消息的无缝滚动效果的示例代码
Dec 05 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
vue2.0中set添加属性后视图不能更新的解决办法
Feb 22 Javascript
前端js中的事件循环eventloop机制详解
May 15 Javascript
新手快速入门微信小程序组件库 iView Weapp
Jun 24 Javascript
微信小程序自定义modal弹窗组件的方法详解
Dec 20 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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
15个小时----从修改程序到自己些程序
2006/10/09 PHP
php读取csv数据保存到数组的方法
2015/01/03 PHP
php银联网页支付实现方法
2015/03/04 PHP
window.event.keyCode兼容IE和Firefox实现js代码
2013/05/30 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
js运动动画的八个知识点
2015/03/12 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
2015/03/13 Javascript
js实现简单的可切换选项卡效果
2015/04/10 Javascript
jquery实现的缩略图预览滑块实例
2015/06/25 Javascript
JavaScript下的时间格式处理函数Date.prototype.format
2016/01/27 Javascript
Bootstrap入门书籍之(五)导航条、分页导航
2016/02/17 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
最全的Javascript编码规范(推荐)
2016/06/22 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
javascript 产生随机数的几种方法总结
2017/09/26 Javascript
Vue-cli3简单使用(图文步骤)
2019/04/30 Javascript
Python 错误和异常小结
2013/10/09 Python
详解Python的Django框架中的Cookie相关处理
2015/07/22 Python
Python制作刷网页流量工具
2017/04/23 Python
Python判断以什么结尾以什么开头的实例
2018/10/27 Python
Python列表如何更新值
2020/05/27 Python
python 牛顿法实现逻辑回归(Logistic Regression)
2020/10/15 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
世界上最好的野生海鲜和有机食品:Vital Choice
2020/01/16 全球购物
美国最大的烧烤架和户外生活用品专业零售商:Barbeques Galore
2021/01/09 全球购物
如何查看在weblogic中已经发布的EJB
2012/06/01 面试题
环保建议书
2014/03/12 职场文书
知识改变命运演讲稿
2014/05/21 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
我的中国梦主题教育活动总结
2015/05/07 职场文书
2015暑假假期总结
2015/07/13 职场文书
社区挂职锻炼个人工作总结
2015/10/23 职场文书
如何用 Python 子进程关闭 Excel 自动化中的弹窗
2021/05/07 Python
JVM入门之类加载与字节码技术(类加载与类的加载器)
2021/06/15 Java/Android