亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

章節
問答
課簽
筆記
評論
占位
占位

克隆

所有類型節點都會有一個方法就是cloneNode,也就是克隆節點。克隆的操作也是我們常常需要使用的,本來就是一個很簡單的接口,但是還是有一些細節問題需要處理。

cloneNode不會復制javascript屬性,比如事件,這個方法只會復制特性。當然IE有這個BUG它會復制事件處理程序。cloneNode(a)方法接受一個布爾值參數,表示是否深拷貝。

true:表示執行深拷貝,復制本節點以及整個子節點樹。

false:淺拷貝,只復制節點本身。

復制后返回的節點副本屬于文檔所有,但是并沒有父節點。除非使用 appendChild,insertChild(),replaceChild()將它添加到文檔。

關于事件的處理

IE舊版會克隆原生的事件,所以我們需要做克隆的時候先移除掉,當然2.1.1版本是不再兼容低級版本了。所以我們考慮的是jQuery體系的處理,因為這里還沒有涉及到事件的原理,所以我們暫時先初步理解下,jQuery的事件處理是非常nice的,利用了數據緩存的機制,把數據都緩存在內存中而不直接跟dom元素綁定,這樣的好處很多,具體我們在事件交互那一章會超詳細講解。

cloneNode(true)的時候是遍歷的節點,但是不會把對應的事件與數據給復制,但是jQuery.clone方法克隆的時候,是會把該節點上的事件與數據給一并復制過去的,這樣的機制是建立在數據分離的基礎上。簡單來說,jQuery在DOM上做了一個uuid的標記,然后把與這個dom相關聯的所有數據都放到一個內存區域,通過這個uuid映射,這樣我們在深度拷貝 dom 的時候自然也可以把內存的數據給復制一份了,當然這里要注意一個問題,事件是不能被復制的,需要重新綁定了。

因為操作都是跟data_priv與data_user掛鉤的所以我模擬的話實現的代碼量太大了,這里就直接給大概的流程吧。

首先我們elem.cloneNode(true)直接給這個元素克隆一份,我們要做的就是把克隆后的元素加入事件與數據。

jQuery內部的數據都緩存在data_priv中,包括事件,data_user是提供給用戶操作的,用戶的數據。

所以就需要把這個2個緩存給找出來然后混入到新的克隆節點中,jQuery都是提供接口data_priv.access,data_priv.set。

值得注意的事件的復制是需要重新jQuery.event.add綁定的,如果節點是有嵌套的話,需要遍歷每一個元素節點,在每個節點上都要處理事件與數據。

 

任務

?不會了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務號

綁定后可得到

  • · 粉絲專屬優惠福利
  • · 大咖直播交流干貨
  • · 課程更新,問題答復提醒
  • · 賬號支付安全提醒

收藏課程后,能更快找到我哦~

使用 Ctrl+D 可將課程添加到書簽

邀請您關注公眾號
關注后,及時獲悉本課程動態

舉報

0/150
提交
取消
全部 精華 我要發布
全部 我要發布
最熱 最新
只看我的

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發表

為什么扣積分?

本次提問將花費2個積分

繼續發表請點擊 "確定"

為什么扣積分?