第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

章節(jié)
問答
課簽
筆記
評論
占位
占位

幾種綁定

采用事件委托最直觀的感受就是,不需要給每一個指定的元素綁定事件,從而降低了繁瑣的綁定過程,節(jié)約了代碼量,同時也節(jié)約了內(nèi)存的開銷。綁定一個事件都是需要占用內(nèi)存消耗的,除了性能的差異,通過委托的事件還能很友好的支持動態(tài)綁定,只要 on 的 delegate 對象是 HTML 頁面原有的元素,由于是事件的觸發(fā)是通過 Javascript 的事件冒泡機制來監(jiān)測,所以對于所有子元素(包括后期通過 JS 生成的元素)所有的事件監(jiān)測均能有效,且由于不用對多個元素進行事件綁定,能夠有效的節(jié)省內(nèi)存的損耗。

那么 jQuery 對事件的綁定分別有幾種 API,具體有什么區(qū)別我們來了解一下:

bind方法

.bind()方法用于直接附加一個事件處理程序到元素上,處理程序附加到 jQuery 對象中當前選中的元素,所以在 .bind() 綁定事件的時候這些元素必須已經(jīng)存在,很明顯就是直接調(diào)用沒利用委托機制。

live方法

將委托的事件處理程序附加到一個頁面的 document 元素,從而簡化了在頁面上動態(tài)添加的內(nèi)容上事件處理的使用。

例如:

$('a').live('click', function() { alert("!")})

JQuery 把 alert 函數(shù)綁定到 $(document) 元素上,并使用 ’click’和 ’a’作為參數(shù)。任何時候只要有事件冒泡到 document 節(jié)點上,它就查看該事件是否是一個 click 事件,以及該事件的目標元素與’a’這一CSS 選擇器是否匹配,如果都是的話,則執(zhí)行函數(shù)。

因為更高版本的 jQuery 提供了更好的方法,沒有 .live() 方法的缺點,所以 .live() 方法不再推薦使用,特別是使用 .live() 出現(xiàn)的以下問題:

  1. 在調(diào)用 .live() 方法之前,jQuery 會先獲取與指定的選擇器匹配的元素,這一點對于大型文檔來說是很花費時間的。
  2. 不支持鏈式寫法。例如,$("a").find(".offsite, .external").live( ... ); 這樣的寫法是不合法的,并不能像期待的那樣起作用。
  3. 由于所有的 .live() 事件被添加到 document 元素上,所以在事件被處理之前,可能會通過最長最慢的那條路徑之后才能被觸發(fā)。
  4. 在移動 iOS (iPhone, iPad 和 iPod Touch) 上,對于大多數(shù)元素而言,click 事件不會冒泡到文檔 body 上,并且如果不滿足如下情況之一,就不能和 .live() 方法一起使用:使用原生的可被點擊的元素,例如, a 或 button,因為這兩個元素可以冒泡到 document。
  5. 在 document.body 內(nèi)的元素使用 .on() 或 .delegate() 進行綁定,因為移動 iOS 只有在 body 內(nèi)才能進行冒泡。
  6. 需要 click 冒泡到元素上才能應(yīng)用的 CSS 樣式 cursor:pointer (或者是父元素包含document.documentElement)。但是依然需要注意的是,這樣會禁止元素上的復(fù)制/粘貼功能,并且當點擊元素時,會導(dǎo)致該元素被高亮顯示。
  7. 在事件處理中調(diào)用 event.stopPropagation() 來阻止事件處理被添加到 document 之后的節(jié)點中,是效率很低的,因為事件已經(jīng)被傳播到 document 上。
  8. .live() 方法與其它事件方法的相互影響是會令人感到驚訝的。例如,$(document).unbind("click") 會移除所有通過 .live() 添加的 click 事件!
     

delegate方法

為了突破單一 .bind() 方法的局限性,實現(xiàn)事件委托,jQuery 1.3引入了.live()方法。后來,為解決“事件傳播鏈”過長的問題,jQuery 1.4又支持為 .live() 方法指定上下文對象。而為了解決無謂生成元素集合的問題,jQuery 1.4.2干脆直接引入了一個新方法 .delegate()

使用 .delegate(),前面的例子可以這樣寫:

$('#element).delegate('a', 'click', function() { alert("!!!") });

jQuery 掃描文檔查找(‘#element’),并使用 click 事件和’a’這一CSS選擇器作為參數(shù)把 alert 函數(shù)綁定到(‘#element)上。

任何時候只要有事件冒泡到$(‘#element)上,它就查看該事件是否是click事件,以及該事件的目標元素是否與CCS選擇器相匹配。如果兩種檢查的結(jié)果都為真的話,它就執(zhí)行函數(shù)。

可以注意到,這一過程與.live()類似,但是其把處理程序綁定到具體的元素而非document這一根上。

那么 (′a′).live()==(document).delegate('a') ?

可見,.delegate() 方法是一個相對完美的解決方案。但在DOM結(jié)構(gòu)簡單的情況下,也可以使用.live()。

on方法

其實 .bind(), .live(), .delegate()都是通過.on()來實現(xiàn)的,.unbind(), .die(), .undelegate()也是一樣的都是通過.off()來實現(xiàn)的,提供了一種統(tǒng)一綁定事件的方法。

總結(jié):

在下列情況下,應(yīng)該使用 .live()或 .delegate(),而不能使用 .bind():

1. 為DOM中的很多元素綁定相同事件;
2. 為DOM中尚不存在的元素綁定事件;
3. 用.bind()的代價是非常大的,它會把相同的一個事件處理程序hook到所有匹配的DOM元素上
4. 不要再用.live()了,它已經(jīng)不再被推薦了,而且還有許多問題
5. .delegate()會提供很好的方法來提高效率,同時我們可以添加一事件處理方法到動態(tài)添加的元素上

我們可以用 .on() 來代替上述的 3 種方法。

不足點也是有的:

1. 并非所有的事件都能冒泡,如load, change, submit, focus, blur
2. 加大管理復(fù)雜
3. 不好模擬用戶觸發(fā)事件
4. 如何取舍就看項目實際中運用了

 

任務(wù)

?不會了怎么辦
||

提問題

寫筆記

公開筆記
提交
||

請驗證,完成請求

由于請求次數(shù)過多,請先驗證,完成再次請求

加群二維碼

打開微信掃碼自動綁定

您還未綁定服務(wù)號

綁定后可得到

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

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

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

邀請您關(guān)注公眾號
關(guān)注后,及時獲悉本課程動態(tài)

舉報

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

手記推薦

更多

本次提問將花費2個積分

你的積分不足,無法發(fā)表

為什么扣積分?

本次提問將花費2個積分

繼續(xù)發(fā)表請點擊 "確定"

為什么扣積分?