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 播放器 控制
Jan 22 Javascript
用js遍历 table的脚本
Jul 23 Javascript
JavaScript学习点滴 call、apply的区别
Oct 22 Javascript
js为鼠标添加右击事件防止默认的右击菜单弹出
Jul 29 Javascript
JavaScript实现的图像模糊算法代码分享
Apr 22 Javascript
js实现文本框支持加减运算的方法
Aug 19 Javascript
浅谈JavaScript的自动垃圾收集机制
Dec 15 Javascript
JS简单判断函数是否存在的方法
Feb 13 Javascript
ES6中module模块化开发实例浅析
Apr 06 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
Jan 26 Javascript
mint-ui在vue中的使用示例
Apr 05 Javascript
JavaScript实现刮刮乐效果
Nov 01 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递归算法的详细示例分析
2013/02/19 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
PHP自动生成表单代码分享
2015/06/19 PHP
WordPress中查询文章的循环Loop结构及用法分析
2015/12/17 PHP
php实现在站点里面添加邮件发送的功能
2020/04/28 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
php远程请求CURL实例教程(爬虫、保存登录状态)
2020/12/10 PHP
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
一个支付页面DEMO附截图
2014/07/22 Javascript
js面向对象之公有、私有、静态属性和方法详解
2015/04/17 Javascript
jquery实现LED广告牌旋转系统图片切换效果代码分享
2015/08/26 Javascript
你一定会收藏的Nodejs代码片段
2016/02/04 NodeJs
jQuery的Cookie封装,与PHP交互的简单实现
2016/10/05 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
js canvas实现星空连线背景特效
2019/11/01 Javascript
解决vue中的无限循环问题
2020/07/27 Javascript
[51:15]2014 DOTA2国际邀请赛中国区预选赛 Orenda VS LGD-GAMING
2014/05/22 DOTA
一波神奇的Python语句、函数与方法的使用技巧总结
2015/12/08 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
Python实现登陆文件验证方法
2018/10/06 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
使用pyqt 实现重复打开多个相同界面
2019/12/13 Python
python 经典数字滤波实例
2019/12/16 Python
PyTorch里面的torch.nn.Parameter()详解
2020/01/03 Python
Python实现进度条和时间预估的示例代码
2020/06/02 Python
python适合做数据挖掘吗
2020/06/16 Python
解决Keras 中加入lambda层无法正常载入模型问题
2020/06/16 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
canvas画布实现手写签名效果的示例代码
2019/04/23 HTML / CSS
廉洁使者实施方案
2014/03/29 职场文书
项目建议书怎么写
2014/05/15 职场文书
四风自我剖析材料
2014/09/30 职场文书
MySQL Router的安装部署
2021/04/24 MySQL
python字符串的多行输出的实例详解
2021/06/08 Python
HTML页面点击按钮关闭页面的多种方式
2022/12/24 HTML / CSS