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 css样式操作代码(批量操作)
Oct 09 Javascript
Jquery.TreeView结合ASP.Net和数据库生成菜单导航条
Aug 27 Javascript
解决Extjs 4 Panel作为Window组件的子组件时出现双重边框问题
Jan 11 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
js如何改变文章的字体大小
Jan 08 Javascript
jQuery EasyUI 获取tabs的实例解析
Dec 06 Javascript
webpack配置sass模块的加载的方法
Jul 30 Javascript
vue项目中使用scss的方法步骤
May 16 Javascript
js实现图片无缝循环轮播
Oct 28 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
Apr 10 Javascript
JS面试题中深拷贝的实现讲解
May 07 Javascript
JavaScript 反射学习技巧
Oct 16 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
AJAX for PHP简单表数据查询实例
2007/01/02 PHP
php 动态多文件上传
2009/01/18 PHP
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
PHP自定义多进制的方法
2016/11/03 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
jquery select选中的一个小问题
2009/10/11 Javascript
JS简单的图片放大缩小的两种方法
2013/11/11 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
Jquery Easyui对话框组件Dialog使用详解(14)
2016/12/19 Javascript
Express进阶之log4js实用入门指南
2018/02/10 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
vue 实现基础组件的自动化全局注册
2020/12/25 Vue.js
python输入错误密码用户锁定实现方法
2017/11/27 Python
EM算法的python实现的方法步骤
2018/01/02 Python
pandas通过索引进行排序的示例
2018/11/16 Python
python安装pil库方法及代码
2019/06/25 Python
python按修改时间顺序排列文件的实例代码
2019/07/25 Python
python3 requests库实现多图片爬取教程
2019/12/18 Python
如何基于Python创建目录文件夹
2019/12/31 Python
Django QuerySet查询集原理及代码实例
2020/06/13 Python
python 使用多线程创建一个Buffer缓存器的实现思路
2020/07/02 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
2020/08/22 Python
Django URL参数Template反向解析
2020/11/24 Python
详解Python之Scrapy爬虫教程NBA球员数据存放到Mysql数据库
2021/01/24 Python
CSS3 box-shadow属性实例详解
2020/06/19 HTML / CSS
Furla官网:意大利著名的皮革品牌
2019/08/06 全球购物
消防战士优秀事迹材料
2014/02/13 职场文书
莫言诺贝尔获奖演讲稿
2014/05/21 职场文书
入党积极分子个人总结
2015/03/02 职场文书
护士心得体会范文
2016/01/25 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python