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 相关文章推荐
Javascript实现CheckBox的全选与取消全选的代码
Jul 20 Javascript
js控制滚动条缓慢滚动到顶部实现代码
Mar 20 Javascript
javascript相等运算符与等同运算符详细介绍
Nov 09 Javascript
更快的异步执行(setTimeout多浏览器)
Aug 12 Javascript
JavaScript获取网页表单提交方式的方法
Apr 02 Javascript
JS上传组件FileUpload自定义模板的使用方法
May 10 Javascript
半个小时学json(json传递示例)
Dec 25 Javascript
原生JS实现圣旨卷轴展开效果
Mar 06 Javascript
基于vue-element组件实现音乐播放器功能
May 06 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 Javascript
详解Vue3.0 前的 TypeScript 最佳入门实践
Jun 18 Javascript
微信小程序tabBar 返回tabBar不刷新页面
Jul 25 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
动态新闻发布的实现及其技巧
2006/10/09 PHP
PHP 获取远程网页内容的代码(fopen,curl已测)
2011/06/06 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
Ubuntu VPS中wordpress网站打开时提示”建立数据库连接错误”的解决办法
2016/11/03 PHP
php实现的三个常用加密解密功能函数示例
2017/11/06 PHP
laravel框架之数据库查出来的对象实现转化为数组
2019/10/23 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
PHP设计模式之组合模式定义与应用示例
2020/02/01 PHP
jquery delay()介绍及使用指南
2014/09/02 Javascript
jQuery分组选择器用法实例
2014/12/23 Javascript
下雪了 javascript实现雪花飞舞
2020/08/02 Javascript
Node+Express+MongoDB实现登录注册功能实例
2017/04/23 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
iscroll动态加载数据完美解决方法
2017/07/18 Javascript
AngularJS动态添加数据并删除的实例
2018/02/27 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
浅谈vue项目4rs vue-router上线后history模式遇到的坑
2018/09/27 Javascript
Vue js 的生命周期(看了就懂)(推荐)
2019/03/29 Javascript
vuex 动态注册方法 registerModule的实现
2019/07/03 Javascript
es6中比较有用的7个技巧小结
2019/07/12 Javascript
js验证密码强度解析
2020/03/18 Javascript
vue+koa2搭建mock数据环境的详细教程
2020/05/18 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
python中嵌套函数的实操步骤
2019/02/27 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
Django之编辑时根据条件跳转回原页面的方法
2019/08/21 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
IE8下CSS3选择器nth-child() 不兼容问题的解决方法
2016/11/16 HTML / CSS
Wiggle中国:英国骑行、跑步、游泳 & 铁三运动装备专卖网店
2016/08/02 全球购物
什么是反射?如何实现反射?
2016/07/25 面试题
体育专业学生自我评价范文
2014/01/17 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
交警失职检讨书
2015/01/26 职场文书
千万级用户系统SQL调优实战分享
2022/03/03 MySQL