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 相关文章推荐
JS 实现获取打开一个界面中输入的值
Mar 19 Javascript
js 模式窗口(模式对话框和非模式对话框)的使用介绍
Jul 17 Javascript
纯HTML5制作围住神经猫游戏-附源码下载
Aug 23 Javascript
IE9+已经不对document.createElement向下兼容的解决方法
Sep 14 Javascript
Bootstrap中文本框的宽度变窄并且加入一副验证码图片的实现方法
Jun 23 Javascript
Vue应用部署到服务器的正确方式
Jul 15 Javascript
Vue2仿淘宝实现省市区三级联动
Apr 15 Javascript
js实现图片上传并预览功能
Aug 06 Javascript
10个最受欢迎的 JavaScript框架(推荐)
Apr 24 Javascript
微信小程序 bindtap 传参的实例代码
Feb 21 Javascript
浅谈Vuex的this.$store.commit和在Vue项目中引用公共方法
Jul 24 Javascript
Vue如何实现变量表达式选择器
Feb 18 Vue.js
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语法(1)
2006/10/09 PHP
PHP与MySQL开发中页面出现乱码的一种解决方法
2007/07/29 PHP
jQuery 源码分析笔记
2011/05/25 PHP
一个PHP验证码类代码分享(已封装成类)
2011/07/17 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
js获取图片长和宽度的代码
2009/11/24 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
jQuery.Validate验证库的使用介绍
2013/04/26 Javascript
JavaScript lodash常见用法系列小结
2016/08/24 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
AngularJS实现表格的增删改查(仅限前端)
2017/07/04 Javascript
微信小程序之前台循环数据绑定
2017/08/18 Javascript
js生成word中图片处理方法
2018/01/06 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
浅析Vue 防抖与节流的使用
2019/11/14 Javascript
八种Vue组件间通讯方式合集(推荐)
2020/08/18 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
python实现矩阵乘法的方法
2015/06/28 Python
Python xlwt设置excel单元格字体及格式
2020/04/18 Python
Django中的Signal代码详解
2018/02/05 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
Python中turtle库的使用实例
2019/09/09 Python
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
ALDO英国官网:加拿大女鞋品牌
2018/02/19 全球购物
光电信息专业应届生求职信
2013/10/07 职场文书
网吧收银员岗位职责
2013/12/14 职场文书
导游的职业规划书范文
2013/12/27 职场文书
2015年基建工作总结范文
2015/05/23 职场文书
企业法人任命书
2015/09/21 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
css3实现背景图片颜色修改的多种方式
2021/04/13 HTML / CSS
python 提取html文本的方法
2021/05/20 Python
Python制作动态字符画的源码
2021/08/04 Python