读jQuery之十二(删除事件核心方法)
?
remove 所作的事情與上一篇提到的.add 剛好相反。且與.add中的處理代碼一一對(duì)應(yīng),即? .add 中有多少種添加事件的方式remove就有對(duì)應(yīng)的刪除方式。
remove 定義了四個(gè)參數(shù) elem, types, handler, pos 。從字面上看四個(gè)參數(shù)的意義很明了
- elem 為HTMLElement
- types 為String類型,事件名稱如'click'或'mouseover mouseout' ?
- handler 為Function類型,事件回調(diào)函數(shù)
- pos 為Number類型,指定數(shù)組位置
但remove內(nèi)部沒這么簡單,如
1. handler 有時(shí)會(huì)傳布爾類型false,這時(shí)會(huì)把handler賦值為另一個(gè)函數(shù)(此處的處理同.add)
if ( handler === false ) {handler = returnFalse; }?
2. types 有時(shí)會(huì)為一個(gè)對(duì)象,這時(shí)真正的handler是types.handler,types是types.type
// types is actually an event object here if ( types && types.type ) {handler = types.handler;types = types.type; }我們知道變量命名要具有意義,名副其實(shí)而避免誤導(dǎo)。從這個(gè)意義上講,jQuery中存在大量這樣的寫法,一個(gè)變量往往具有多種含義,晦澀難讀。如這里的types,應(yīng)該是String類型,但實(shí)際內(nèi)部對(duì)typeos為Object類型也做了處理。這是JS沒有類型檢查的原因?qū)е隆7催^來講這種語言會(huì)比較靈活,jQuery才如此 緊湊 ,內(nèi)聚。
閑言少敘,看看.remove方法都做了哪些事。
對(duì)應(yīng)的代碼如下
// Unbind all events for the element if ( !types || typeof types === "string" && types.charAt(0) === "." ) {types = types || "";for ( type in events ) {jQuery.event.remove( elem, type + types );}return; }我們發(fā)現(xiàn)for?in中是個(gè)遞歸調(diào)用。
如果這么調(diào)用
jQuery.event.remove(el, 'click', fn)
那么是不會(huì)走上面的遞歸的,而是直接進(jìn)入了while循環(huán)
?
while ( (type = types[ i++ ]) ) {...}這是標(biāo)準(zhǔn)的刪除事件的流程。大概步驟如下
jQuery事件管理數(shù)據(jù)結(jié)構(gòu)圖:
總結(jié)
以上是生活随笔為你收集整理的读jQuery之十二(删除事件核心方法)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KL距离
- 下一篇: Hadoop-HBASE案例分析-Had