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的Tooltip插件 qtip使用详细说明
Sep 08 Javascript
Extjs实现下拉菜单效果
Apr 01 Javascript
深入浅析JS Function()构造函数
Aug 22 Javascript
angularjs 表单密码验证自定义指令实现代码
Oct 27 Javascript
vue.js 1.x与2.0中js实时监听input值的变化
Mar 15 Javascript
vue 通过下拉框组件学习vue中的父子通讯
Dec 19 Javascript
webpack中的热刷新与热加载的区别
Apr 09 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
Nov 30 Javascript
vue 之 css module的使用方法
Dec 04 Javascript
vue实现导航标题栏随页面滚动渐隐渐显效果
Mar 12 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
Jun 02 Javascript
React如何使用axios请求数据并把数据渲染到组件
Aug 05 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独立Session数据库存储操作类分享
2014/06/11 PHP
php计算两个日期时间差(返回年、月、日)
2014/06/19 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
2017/07/03 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
javascript 读取XML数据,在页面中展现、编辑、保存的实现
2009/10/27 Javascript
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
js setTimeout opener的用法示例详解
2013/10/23 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
JS连连看源码完美注释版(推荐)
2013/12/09 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
jquery获取点击控件的绝对位置简单实例
2016/10/13 Javascript
Angularjs使用ng-repeat中$even和$odd属性的注意事项
2016/12/31 Javascript
详解React中的组件通信问题
2017/07/31 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
vue 组件 全局注册和局部注册的实现
2018/02/28 Javascript
Vue的H5页面唤起支付宝支付功能
2019/04/18 Javascript
详解如何在Vue项目中发送jsonp请求
2019/10/25 Javascript
Node.js中文件系统fs模块的使用及常用接口
2020/03/06 Javascript
Python实现针对给定单链表删除指定节点的方法
2018/04/12 Python
python中import与from方法总结(推荐)
2019/03/21 Python
python实现IOU计算案例
2020/04/12 Python
python爬取抖音视频的实例分析
2021/01/19 Python
Merrell迈乐澳大利亚网站:购买户外登山鞋
2017/05/28 全球购物
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
ParcelABC西班牙:包裹运送和快递服务
2019/12/24 全球购物
节能宣传周活动总结
2014/05/08 职场文书
公务员诚信承诺书
2014/05/26 职场文书
面试自我评价范文
2014/09/17 职场文书
“向国旗敬礼”活动策划方案(4篇)
2014/09/27 职场文书
2016抗战胜利71周年红领巾广播稿
2015/12/18 职场文书
CSS filter 有什么神奇用途
2021/05/25 HTML / CSS
python实现简单的三子棋游戏
2022/04/28 Python
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript