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 相关文章推荐
Jquey拖拽控件Draggable使用方法(asp.net环境)
Sep 28 Javascript
jQuery怎么解析Json字符串(Json格式/Json对象)
Aug 09 Javascript
用jquery中插件dialog实现弹框效果实例代码
Nov 15 Javascript
JavaScript中的typeof操作符用法实例
Apr 05 Javascript
jQuery源码解读之removeClass()方法分析
Feb 20 Javascript
简介JavaScript中fixed()方法的使用
Jun 08 Javascript
JS获取html元素的标记名实现方法
Oct 08 Javascript
import与export在node.js中的使用详解
Sep 28 Javascript
利用node.js如何创建子进程详解
Dec 09 Javascript
详解vue-cli3多页应用改造
Jun 04 Javascript
微信小程序动态显示项目倒计时
Jun 20 Javascript
CocosCreator如何实现划过的位置显示纹理
Apr 14 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 is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
百度工程师讲PHP函数的实现原理及性能分析(一)
2015/05/13 PHP
PHP代码优化技巧小结
2015/09/29 PHP
PHP页面跳转操作实例分析(header方法)
2016/09/28 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
nodejs实用示例 缩址还原
2010/12/28 NodeJs
增强用户体验友好性之jquery easyui window 窗口关闭时的提示
2012/06/22 Javascript
firefox下jQuery UI Autocomplete 1.8.*中文输入修正方法
2012/09/19 Javascript
js自定义事件及事件交互原理概述(二)
2013/02/01 Javascript
控制页面按钮在后台执行期间不重复提交的JS方法
2013/06/24 Javascript
解决window.opener=null;window.close(),只支持IE6不支持IE7,IE8的问题
2014/01/14 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
12种JavaScript常用的MVC框架比较分析
2015/11/16 Javascript
jquery插件uploadify实现带进度条的文件批量上传
2015/12/13 Javascript
详解微信小程序开发之——wx.showToast(OBJECT)的使用
2017/01/18 Javascript
js常用DOM方法详解
2017/02/04 Javascript
Vue.js中extend选项和delimiters选项的比较
2017/07/17 Javascript
基于vue循环列表时点击跳转页面的方法
2018/08/31 Javascript
解决JS表单验证只有第一个IF起作用的问题
2018/12/04 Javascript
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
python使用pil进行图像处理(等比例压缩、裁剪)实例代码
2017/12/11 Python
20个常用Python运维库和模块
2018/02/12 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
2019/07/11 Python
python使用requests.session模拟登录
2019/08/09 Python
如何使用python传入不确定个数参数
2020/02/18 Python
解决reload(sys)后print失效的问题
2020/04/25 Python
django序列化时使用外键的真实值操作
2020/07/15 Python
了解一下python内建模块collections
2020/09/07 Python
Python3+Appium安装及Appium模拟微信登录方法详解
2021/02/16 Python
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
商务助理岗位职责
2013/11/13 职场文书
《蝙蝠和雷达》教学反思
2014/04/23 职场文书
教师年度个人总结
2015/02/11 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
阿里面试Nacos配置中心交互模型是push还是pull原理解析
2022/07/23 Java/Android