javascript dom操作之cloneNode文本節(jié)點(diǎn)克隆使用技巧
更新時(shí)間:2009年12月27日 00:22:36 作者:
文本克隆函數(shù)cloneNode他有兩個(gè)參數(shù)——true or false
true:完全的復(fù)制一個(gè)節(jié)點(diǎn),什么叫完全呢,就是復(fù)制一切,包括他的子節(jié)點(diǎn),以至于文本節(jié)點(diǎn),凡是有的,一律克隆,所謂完全
false:只克隆當(dāng)前節(jié)點(diǎn),不克隆任何的子節(jié)點(diǎn),當(dāng)然也不會(huì)克隆他所包裹的文本,因?yàn)槿魏挝谋径加兄赶蛩墓?jié)點(diǎn)(文本節(jié)點(diǎn))
當(dāng)然有時(shí)候兩者是可以通用的哦,如果要復(fù)制的節(jié)點(diǎn)沒(méi)有任何的子節(jié)點(diǎn),這是二者全等;比如 img...
為了讓大家理解的更為深刻,舉個(gè)小例子吧:
<div>
<span>Shadow</span> |No Shadow
</div>
我定義一個(gè)變量用于指向span節(jié)點(diǎn)
var element = document.getElementsByTagName('span')[0];
那么
var t1 = element.cloneNode(false).innerHTML;//不復(fù)制子節(jié)點(diǎn)
var t2 = element.cloneNode(true).innerHTML;//copy all
alert(t1);
alert(t2);
這是會(huì)依次輸出 (空)“”和Shadow ;
var textnode = element.firstChild;//指向文本節(jié)點(diǎn)
var t1 = textnode.cloneNode(false).nodeValue;
var t2 = textnode.cloneNode(true).nodeValue;
alert(t1);
alert(t2);
這是他們會(huì)同時(shí)輸出Shadow。
【cloneNode的bug】
在上面多級(jí)聯(lián)動(dòng)中說(shuō)到,會(huì)用cloneNode復(fù)制容器,但cloneNode在ie中有一個(gè)bug:
在ie用attachEvent給dom元素綁定事件,在cloneNode之后會(huì)把事件也復(fù)制過(guò)去。
而用addEventListener添加的事件就不會(huì),可以在ie和ff測(cè)試下面的代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在ie和ff點(diǎn)擊第一個(gè)div都會(huì)觸發(fā)alert,關(guān)鍵是第二個(gè)div,在ff不會(huì)觸發(fā),而ie就會(huì)。
當(dāng)然這個(gè)是不是bug還不清楚,或許attachEvent本來(lái)就是這樣設(shè)計(jì)的也說(shuō)不定。
但第一版就是由于這個(gè)bug,而沒(méi)有用cloneNode。
在找解決方法之前,再擴(kuò)展這個(gè)問(wèn)題,看看直接添加onclick事件會(huì)不會(huì)有同樣的bug。
首先測(cè)試在元素里面添加onclick:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
結(jié)果在ie和ff都會(huì)復(fù)制事件。
再測(cè)試在js添加onclick:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
結(jié)果在ie和ff都不會(huì)復(fù)制事件,看來(lái)只有attachEvent會(huì)引起這個(gè)bug。
下面是解決方法:
用John Resig在《精通JavaScript》推薦的Dean Edwards寫(xiě)的addEvent和removeEvent方法來(lái)添加/移除事件。
它的好處就不用說(shuō)了,而且它能在ie解決上面說(shuō)到的cloneNode的bug。
因?yàn)樗膶?shí)現(xiàn)原理是在ie用onclick來(lái)綁定事件,而上面的測(cè)試也證明用onclick綁定的事件是不會(huì)被cloneNode復(fù)制的。
false:只克隆當(dāng)前節(jié)點(diǎn),不克隆任何的子節(jié)點(diǎn),當(dāng)然也不會(huì)克隆他所包裹的文本,因?yàn)槿魏挝谋径加兄赶蛩墓?jié)點(diǎn)(文本節(jié)點(diǎn))
當(dāng)然有時(shí)候兩者是可以通用的哦,如果要復(fù)制的節(jié)點(diǎn)沒(méi)有任何的子節(jié)點(diǎn),這是二者全等;比如 img...
為了讓大家理解的更為深刻,舉個(gè)小例子吧:
復(fù)制代碼 代碼如下:
<div>
<span>Shadow</span> |No Shadow
</div>
我定義一個(gè)變量用于指向span節(jié)點(diǎn)
var element = document.getElementsByTagName('span')[0];
那么
復(fù)制代碼 代碼如下:
var t1 = element.cloneNode(false).innerHTML;//不復(fù)制子節(jié)點(diǎn)
var t2 = element.cloneNode(true).innerHTML;//copy all
alert(t1);
alert(t2);
這是會(huì)依次輸出 (空)“”和Shadow ;
復(fù)制代碼 代碼如下:
var textnode = element.firstChild;//指向文本節(jié)點(diǎn)
var t1 = textnode.cloneNode(false).nodeValue;
var t2 = textnode.cloneNode(true).nodeValue;
alert(t1);
alert(t2);
這是他們會(huì)同時(shí)輸出Shadow。
【cloneNode的bug】
在上面多級(jí)聯(lián)動(dòng)中說(shuō)到,會(huì)用cloneNode復(fù)制容器,但cloneNode在ie中有一個(gè)bug:
在ie用attachEvent給dom元素綁定事件,在cloneNode之后會(huì)把事件也復(fù)制過(guò)去。
而用addEventListener添加的事件就不會(huì),可以在ie和ff測(cè)試下面的代碼:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
在ie和ff點(diǎn)擊第一個(gè)div都會(huì)觸發(fā)alert,關(guān)鍵是第二個(gè)div,在ff不會(huì)觸發(fā),而ie就會(huì)。
當(dāng)然這個(gè)是不是bug還不清楚,或許attachEvent本來(lái)就是這樣設(shè)計(jì)的也說(shuō)不定。
但第一版就是由于這個(gè)bug,而沒(méi)有用cloneNode。
在找解決方法之前,再擴(kuò)展這個(gè)問(wèn)題,看看直接添加onclick事件會(huì)不會(huì)有同樣的bug。
首先測(cè)試在元素里面添加onclick:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
結(jié)果在ie和ff都會(huì)復(fù)制事件。
再測(cè)試在js添加onclick:
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁(yè)面才能執(zhí)行]
結(jié)果在ie和ff都不會(huì)復(fù)制事件,看來(lái)只有attachEvent會(huì)引起這個(gè)bug。
下面是解決方法:
用John Resig在《精通JavaScript》推薦的Dean Edwards寫(xiě)的addEvent和removeEvent方法來(lái)添加/移除事件。
它的好處就不用說(shuō)了,而且它能在ie解決上面說(shuō)到的cloneNode的bug。
因?yàn)樗膶?shí)現(xiàn)原理是在ie用onclick來(lái)綁定事件,而上面的測(cè)試也證明用onclick綁定的事件是不會(huì)被cloneNode復(fù)制的。
相關(guān)文章
javascript數(shù)組中的map方法和filter方法
這篇文章主要介紹了javascript數(shù)組中的map方法和filter方法,文章內(nèi)容介紹詳細(xì),具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助2022-03-03
基于JS快速實(shí)現(xiàn)導(dǎo)航下拉菜單動(dòng)畫(huà)效果附源碼下載
這是一個(gè)帶變形動(dòng)畫(huà)特效的下拉導(dǎo)航菜單特效。該導(dǎo)航菜單在菜單項(xiàng)之間切換時(shí),下拉菜單會(huì)快速的根據(jù)菜單內(nèi)容的大小來(lái)動(dòng)態(tài)變形,顯示合適的下拉菜單大小,效果非常棒,對(duì)導(dǎo)航下拉菜單效果感興趣的朋友一起通過(guò)本文學(xué)習(xí)吧2016-10-10
js實(shí)現(xiàn)網(wǎng)頁(yè)右上角滑出會(huì)自動(dòng)消失大幅廣告的方法
這篇文章主要介紹了js實(shí)現(xiàn)網(wǎng)頁(yè)右上角滑出會(huì)自動(dòng)消失大幅廣告的方法,是javascript廣告特效的典型應(yīng)用,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-02-02
H5+css3+js搭建帶驗(yàn)證碼的登錄頁(yè)面
這篇文章主要為大家詳細(xì)介紹了H5+css3+js搭建帶驗(yàn)證碼的登錄頁(yè)面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
JS實(shí)現(xiàn)文字向下滾動(dòng)完整實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)文字向下滾動(dòng)的方法,以一個(gè)完整實(shí)例形式詳細(xì)分析了html頁(yè)面布局、css樣式及對(duì)應(yīng)的js滾動(dòng)功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2015-02-02
uniapp實(shí)現(xiàn)上拉加載更多功能的全過(guò)程
我們?cè)陧?xiàng)目中經(jīng)常使用到上拉加載更多,下面這篇文章主要給大家介紹了關(guān)于uniapp實(shí)現(xiàn)上拉加載更多功能的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10

