javascript dom操作之cloneNode文本节点克隆使用技巧
2009-12-27 00:22
846 查看
true:完全的复制一个节点,什么叫完全呢,就是复制一切,包括他的子节点,以至于文本节点,凡是有的,一律克隆,所谓完全
false:只克隆当前节点,不克隆任何的子节点,当然也不会克隆他所包裹的文本,因为任何文本都有指向他的节点(文本节点)
当然有时候两者是可以通用的哦,如果要复制的节点没有任何的子节点,这是二者全等;比如 img...
为了让大家理解的更为深刻,举个小例子吧:
复制代码 代码如下:
<div>
<span>Shadow</span> |No Shadow
</div>
我定义一个变量用于指向span节点
var element = document.getElementsByTagName('span')[0];
那么
复制代码 代码如下:
var t1 = element.cloneNode(false).innerHTML;//不复制子节点
var t2 = element.cloneNode(true).innerHTML;//copy all
alert(t1);
alert(t2);
这是会依次输出 (空)“”和Shadow ;
复制代码 代码如下:
var textnode = element.firstChild;//指向文本节点
var t1 = textnode.cloneNode(false).nodeValue;
var t2 = textnode.cloneNode(true).nodeValue;
alert(t1);
alert(t2);
这是他们会同时输出Shadow。
【cloneNode的bug】
在上面多级联动中说到,会用cloneNode复制容器,但cloneNode在ie中有一个bug:
在ie用attachEvent给dom元素绑定事件,在cloneNode之后会把事件也复制过去。
而用addEventListener添加的事件就不会,可以在ie和ff测试下面的代码:
div
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
在ie和ff点击第一个div都会触发alert,关键是第二个div,在ff不会触发,而ie就会。
当然这个是不是bug还不清楚,或许attachEvent本来就是这样设计的也说不定。
但第一版就是由于这个bug,而没有用cloneNode。
在找解决方法之前,再扩展这个问题,看看直接添加onclick事件会不会有同样的bug。
首先测试在元素里面添加onclick:
div
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
结果在ie和ff都会复制事件。
再测试在js添加onclick:
div
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
结果在ie和ff都不会复制事件,看来只有attachEvent会引起这个bug。
下面是解决方法:
用John Resig在《精通JavaScript》推荐的Dean Edwards写的addEvent和removeEvent方法来添加/移除事件。
它的好处就不用说了,而且它能在ie解决上面说到的cloneNode的bug。
因为它的实现原理是在ie用onclick来绑定事件,而上面的测试也证明用onclick绑定的事件是不会被cloneNode复制的。
false:只克隆当前节点,不克隆任何的子节点,当然也不会克隆他所包裹的文本,因为任何文本都有指向他的节点(文本节点)
当然有时候两者是可以通用的哦,如果要复制的节点没有任何的子节点,这是二者全等;比如 img...
为了让大家理解的更为深刻,举个小例子吧:
复制代码 代码如下:
<div>
<span>Shadow</span> |No Shadow
</div>
我定义一个变量用于指向span节点
var element = document.getElementsByTagName('span')[0];
那么
复制代码 代码如下:
var t1 = element.cloneNode(false).innerHTML;//不复制子节点
var t2 = element.cloneNode(true).innerHTML;//copy all
alert(t1);
alert(t2);
这是会依次输出 (空)“”和Shadow ;
复制代码 代码如下:
var textnode = element.firstChild;//指向文本节点
var t1 = textnode.cloneNode(false).nodeValue;
var t2 = textnode.cloneNode(true).nodeValue;
alert(t1);
alert(t2);
这是他们会同时输出Shadow。
【cloneNode的bug】
在上面多级联动中说到,会用cloneNode复制容器,但cloneNode在ie中有一个bug:
在ie用attachEvent给dom元素绑定事件,在cloneNode之后会把事件也复制过去。
而用addEventListener添加的事件就不会,可以在ie和ff测试下面的代码:
div
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
在ie和ff点击第一个div都会触发alert,关键是第二个div,在ff不会触发,而ie就会。
当然这个是不是bug还不清楚,或许attachEvent本来就是这样设计的也说不定。
但第一版就是由于这个bug,而没有用cloneNode。
在找解决方法之前,再扩展这个问题,看看直接添加onclick事件会不会有同样的bug。
首先测试在元素里面添加onclick:
div
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
结果在ie和ff都会复制事件。
再测试在js添加onclick:
div
[Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]
结果在ie和ff都不会复制事件,看来只有attachEvent会引起这个bug。
下面是解决方法:
用John Resig在《精通JavaScript》推荐的Dean Edwards写的addEvent和removeEvent方法来添加/移除事件。
它的好处就不用说了,而且它能在ie解决上面说到的cloneNode的bug。
因为它的实现原理是在ie用onclick来绑定事件,而上面的测试也证明用onclick绑定的事件是不会被cloneNode复制的。
您可能感兴趣的文章:
相关文章推荐
- JavaScript中操作有些DOM时关于文本节点和元素节点的问题。
- javascript中dom节点操作(创建节点、增加节点、删除节点、克隆节点)
- JavaScript对DOM节点进行操作(不使用第三方框架)
- 使用JavaScript操作DOM节点元素的常用方法(创建/删除/替换/复制等)
- javascript操作dom 建立 增加 删除 克隆 访问节点
- javascript对于dom的操作--得到兄弟节点 && getElementsByTagName使用方法
- javascript操作dom 建立 增加 删除 克隆 访问节点
- javascript操作dom 建立 增加 删除 克隆 访问节点
- JavaScript DOM_5 操作文本节点
- javascript对于dom的操作--得到兄弟节点 && getElementsByTagName使用方法
- Javascript里使用Dom操作Xml
- JavaScript操作DOM节点元素重排
- javascript 原生方法对dom节点的操作,创建、添加、删除、替换、插入、复制、移动等操作
- JavaScript之Dom节点操作
- JavaScript 用cloneNode方法克隆节点的代码
- js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
- 使用JavaScript在IE和Firefox下进行iframe的DOM操作
- JAVASCRIPT中使用DOM操作XML文档
- js之DOM操作(创建文本节点createTextNode)