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 相关文章推荐
jQuery 技巧大全(新手入门篇)
May 12 Javascript
jQuery中children()方法用法实例
Jan 07 Javascript
基于jquery实现的仿优酷图片轮播特效代码
Jan 13 Javascript
js实现数组冒泡排序、快速排序原理
Mar 08 Javascript
jQuery的each循环用法简单示例
Jun 12 Javascript
AngularJS使用ng-Cloak阻止初始化闪烁问题的方法
Nov 03 Javascript
搭建Bootstrap离线文档的方法
Dec 02 Javascript
原生js实现中奖信息无间隙滚动效果
Jan 18 Javascript
jquery实时获取时间的简单实例
Jan 26 Javascript
vue百度地图 + 定位的详解
May 13 Javascript
vscode vue 文件模板的配置方法
Jul 23 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 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使用正则过滤js脚本代码实例
2014/05/10 PHP
CI(CodeIgniter)框架中的增删改查操作
2014/06/10 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
php根据日期或时间戳获取星座信息和生肖等信息
2015/10/20 PHP
php文件操作之文件写入字符串、数组的方法分析
2019/04/15 PHP
用jquery方法操作radio使其默认选项是否
2013/09/10 Javascript
jquery ajax jsonp跨域调用实例代码
2013/12/11 Javascript
Bootstrap基本组件学习笔记之导航(10)
2016/12/07 Javascript
BootStrap3中模态对话框的使用
2017/01/06 Javascript
js遍历json的key和value的实例
2017/01/22 Javascript
Bootstrap DateTime Picker日历控件简单应用
2017/03/25 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
深入理解angular2启动项目步骤
2017/07/15 Javascript
实例学习JavaScript读取和写入cookie
2018/01/29 Javascript
Vue 报错TypeError: this.$set is not a function 的解决方法
2018/12/17 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
深入了解Vue.js 混入(mixins)
2020/07/23 Javascript
[47:53]DOTA2上海特级锦标赛主赛事日 - 1 败者组第一轮#2COL VS Spirit
2016/03/02 DOTA
详解Python import方法引入模块的实例
2017/08/02 Python
Python开发中爬虫使用代理proxy抓取网页的方法示例
2017/09/26 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
在cmd命令行里进入和退出Python程序的方法
2018/05/12 Python
Python线程池模块ThreadPoolExecutor用法分析
2018/12/28 Python
树莓派使用USB摄像头和motion实现监控
2019/06/22 Python
Python线上环境使用日志的及配置文件
2019/07/28 Python
给大家整理了19个pythonic的编程习惯(小结)
2019/09/25 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
HTML5和CSS3实例教程总结(推荐)
2016/07/18 HTML / CSS
一名老师的自我评价
2014/02/07 职场文书
2014物价局民主生活会对照检查材料思想汇报
2014/09/24 职场文书
房屋租赁委托书范本
2014/10/04 职场文书
情侣之间的道歉短信
2015/05/12 职场文书
记者节感言
2015/08/03 职场文书
win10更新失败无限重启解决方法
2022/04/19 数码科技