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 dialog里的服务器控件 事件失效问题
Dec 08 Javascript
js获取窗口相对于屏幕左边和上边的位置坐标
May 15 Javascript
node.js中的fs.fstat方法使用说明
Dec 15 Javascript
JS扩展方法实例分析
Apr 15 Javascript
JavaScript学习笔记之取数组中最大值和最小值
Mar 23 Javascript
全面解析Bootstrap中form、navbar的使用方法
May 30 Javascript
js删除数组元素、清空数组的简单方法(必看)
Jul 27 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
Apr 20 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
Aug 27 Javascript
webpack proxy 使用(代理的使用)
Jan 10 Javascript
微信小程序wx.getUserInfo授权获取用户信息(头像、昵称)的实现
Aug 19 Javascript
javascript实现点击按钮切换轮播图功能
Sep 23 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 搜索框提示(自动完成)实例代码
2012/02/05 PHP
PHP类的声明与实例化及构造方法与析构方法详解
2016/01/26 PHP
wordpress网站转移到本地运行测试的方法
2017/03/15 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
JavaScript避免内存泄露及内存管理技巧
2014/09/05 Javascript
2014 HTML5/CSS3热门动画特效TOP10
2014/12/07 Javascript
jQuery中after()方法用法实例
2014/12/25 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
谈谈js中的prototype及prototype属性解释和常用方法
2015/11/25 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
IE8 内存泄露(内存一直增长 )的原因及解决办法
2016/04/06 Javascript
BootStrap整体框架之基础布局组件
2016/12/15 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
ES6中Math对象的部分扩展
2017/02/20 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
js阻止默认右键的下拉菜单方法
2018/01/02 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Python mutiprocessing多线程池pool操作示例
2019/01/30 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
python实现将列表中各个值快速赋值给多个变量
2020/04/02 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
宝拉珍选官方旗舰店:2%水杨酸精华液,收缩毛孔粗大和祛痘
2018/07/01 全球购物
Three Graces London官网:英国奢侈品牌
2021/03/18 全球购物
strlen的几种不同实现方法
2013/05/31 面试题
UDP协议功能
2013/01/06 面试题
初一生物教学反思
2014/01/18 职场文书
作风转变年心得体会
2014/10/22 职场文书
实施意见格式范本
2015/06/05 职场文书
2016党员党章学习心得体会
2016/01/14 职场文书
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP
电脑无法安装Windows 11怎么办?无法安装Win11的解决方法
2021/11/21 数码科技