1. 程式人生 > >jquery事件繫結和事件委託

jquery事件繫結和事件委託

參考文件: 
http://blog.csdn.net/xxd851116/article/details/8646899 
http://www.jb51.net/article/57827.htm 
http://www.jb51.net/article/67166.htm 
http://api.jquery.com/on/ 
http://api.jquery.com/delegate/ 
http://api.jquery.com/bind/ 
http://api.jquery.com/live/ 
http://www.cnblogs.com/aaronjs/p/3481075.html 
http://blog.jquery.com/2016/05/20/jquery-1-12-4-and-2-2-4-released/ 
http://blog.jquery.com/2016/06/09/jquery-3-0-final-released/
http://blog.csdn.net/aiolos1111/article/details/52047380

bind()的用法如下:

//繫結單個事件
$( "#foo" ).bind( "click", function() {
  alert( "User clicked on 'foo.'" );
});
//繫結多個事件
$( "#foo" ).bind( "mouseenter mouseleave", function() {
  $( this ).toggleClass( "entered" );
});


bind()存在的問題
我們用一個能夠看出bind()問題的程式碼來說明
$("div").bind("click", function () {
     alert($(this).text());
 })
這段程式碼的作用是:掃描整個html文件找出所有的$(‘div’)元素,並把alert函式繫結到每個元素的click事件上。
從這個程式碼中,我們可以發現bind()有如下問題:
    1、這裡用到了隱式迭代,如果匹配到的元素特別多的時候,比如頁面中有100個div元素,就得執行繫結100次。對於大量元素來說,影響到了效能。但是如果是id選擇器,因為id唯一,用bind()方法就很快捷了。
    2、bind()只能給呼叫它的時候已經存在的元素繫結事件,對於動態新增的元素無法使用該方法繫結事件。
    3、官網建議使用on()來替代bind()


delegate

上述bind()的前2個問題,用delegate可以解決。
delegate()的用法如下:
$('#container').delegate('a', 'click', function() { alert("That tickles!") }); 
這段程式碼的作用是:掃描文件查詢$(‘#Container’),並使用click事件和’a’這一CSS選擇器作為引數把alert函式繫結到$(‘#container’)上。任何時候只要有事件冒泡到$(‘#container’)上,它就檢視該事件是否是click事件,以及該事件的目標元素是否與CCS選擇器(即’a’元素)相匹配。如果兩種檢查的結果都為真的話,它就執行函式。


delegate()的特點

    1、直接將目標元素選擇符("a")、事件("click")及處理程式與“委託方”$("#container")繫結,不額外收集元素、事件傳播路徑縮短、語義明確;
    2、支援鏈式呼叫,即支援如$("table").find("#info").delegate(...)的程式碼來精確控制;
    3、使用事件委託時,如果註冊到目標元素上的其他事件處理程式使用.stopPropagation()阻止了事件傳播,那麼事件委託就


使用delegate()而不是bind()的原因
1、為了把處理程式附加到可能還未存在於DOM中的DOM元素之上。因為bind是直接把處理程式繫結到各個元素上,它不能把處理程式繫結到還未存在於頁面中的元素之上。
2、如果你運行了$(‘a’).bind(…),而後新的連結經由AJAX加入到了頁面中,則你的bind處理程式對於這些新加入的連結來說是無效的。而另一方面delegate則是被繫結到另一個祖先節點上,因此其對於任何目前或是將來存在於該祖先元素之內的元素都是有效的。
3、或者為了把處理程式附加到單個元素上或是一小組元素之上,監聽後代元素上的事件而不是迴圈遍歷並把同一個函式逐個附加到DOM中的100個元素上。把處理程式附加到一個(或是一小組)祖先元素上而不是直接把處理程式附加到頁面中的所有元素上,這種做法帶來了效能上的好處。


on
通過檢視jQuery的原始碼(我檢視的版本是1.12.4),可以發現無論bind()還是delegate()都是通過on()方法實現的,只是引數不同
直接繫結和事件委託
      我們直接看官網對直接繫結和事件委託的介紹
      大多數瀏覽器的事件冒泡,都是從文件的最深、最內層發生事件的元素(也稱為event target——事件目標),一路向上到達body或document元素上。在IE8和之前的版本上,少數事件例如change、submit不支援原生的事件冒泡,但jQuery模擬並建立了一致的、跨瀏覽器的事件冒泡行為。      


      如果on()方法的selector 引數為空,事件處理程式就被稱為直接繫結。每當在被繫結元素上(如下例中被繫結的document元素,譯者注)發生事件時,無論這個事件發生在這個元素上還是從內層元素經冒泡而來,該處理程式都會被呼叫。


      並且,如果on()方法的selector 引數為空,它與bind()方法相同——只能繫結頁面已有元素的事件。
  如果on()方法的selector 引數不為空,事件處理程式就被稱為委託。當事件直接發生在被繫結的元素上(如下例中繫結到document上,譯者注)時,該程式不會被呼叫,而只有當事件發生在與選擇器匹配的內部元素上(如下例中click事件發生在button上,譯者注)時,才會呼叫該程式。
      


jQuery的事件委託是將事件從事件的發生者(即event target,譯者注)一直向上冒泡到綁定了事件處理程式的元素上(例如從最內層元素向上冒泡到最外層元素),併為冒泡“沿路”過程中匹配的所有選擇器執行事件處理程式。


事件委託的優點 
      1、能處理來自於內層子元素的事件,這些內層子元素是在稍後時間裡被新增的文件中的。通過選擇一個在繫結事件委託處理程式時肯定存在的元素,就可以使用事件委託來避免 需要頻繁的新增和刪除事件處理程式的操作。 
      這個元素可以是MVC模式下的一個檢視容器元素或者是document元素(如果事件處理程式需要監聽文件中的全部冒泡事件)。在載入任何html程式碼之前,document元素已經在html文件的頭部存在了,所以無需等待dom ready就可以在document這個元素上繫結事件了,這是安全可靠的。


      2、除了可以處理尚未建立的內層子元素的事件,事件委託的另一個優點是:當需要監聽很多元素時,事件委託的效能更好。

相關推薦

jquery事件事件委託

參考文件: http://blog.csdn.net/xxd851116/article/details/8646899  http://www.jb51.net/article/57827.htm  http://www.jb51.net/article/67166.ht

原生js事件事件委託

最近常在移動端開發,由於不是大型站點,不需要使用vue等庫,也不需要引用jquery和zepto等。 寫得最多得就是各種元素選擇器和事件繫結,操作下來也是有點煩人。這時候懷念起jquery的美好來了,但是僅為了這個引用這麼大個庫,實在時下不了手,思考了一下,直

JS的事件事件流模型

一、JS事件 (一)JS事件分類 1.滑鼠事件: click/dbclick/mouseover/mouseout 2.HTML事件: onload/onunload/onsubmit/onresize/onchange/onfoucs/onscroll 3.鍵盤事件

原生js事件事件移除

/** * @description 事件繫結,相容各瀏覽器 * @param target 事件觸發物件 * @param type 事件 * @param func 事件處理函式 */ function addEvents(target, type

jQuery事件委託例項

本文例項講述了jQuery事件繫結和委託。分享給大家供大家參考。具體方法如下: jQuery事件的繫結和委託可以用多種方法實現,on()  、 bind()  、 live()  、 delegate() ,還有one()。   有時我們可能會像下面這樣繫結一個事件: 複製程式碼 程式碼如下: $("#di

JQuery事件事件委託

1、事件委託與事件繫結概念 事件繫結:將普通的事件event繫結在DOM節點上,當DOM節點被選中時,將事件與之繫結,方便使用者提供相應的操作。比如:在button按鈕上繫結click滑鼠事件,在input中繫結focusin焦點事件等等,具體的例如:常常在

JS事件機制:事件事件監聽、事件委託(代理)事件執行順序總結

JS 對於使用者的操作做出響應,就必須對DOM元素繫結事件處理函式 事件繫結  1、在DMO中直接繫結事件 <input type="button" value="click me"

理解Javascript中的事件事件委託(轉載)

最近在深入實踐js中,遇到了一些問題,比如我需要為動態建立的DOM元素繫結事件,那麼普通的事件繫結就不行了,於是通過上網查資料瞭解到事件委託,因此想總結一下js中的事件繫結與事件委託。 事件繫結 最直接的事件繫結:HTML事件處理程式 如下示例程式碼,通過節點屬性顯式宣

JS事件事件監聽,事件委託

        在JavaScript的學習中,我們經常會遇到JavaScript的事件機制,例如,事件繫結、事件監聽、事件委託(事件代理)等。這些名詞是什麼意思呢,有什麼作用呢? 事件繫結 要想讓 JavaScript 對使用者的操作

angularjs培訓之重新理解雙向事件詳解

雙向繫結是angularjs亮點之一,在前面的《angularjs培訓之helloworld》篇中大概介紹了下雙向繫結,現在我們“舊事重提”,先看下下面的程式碼片段: view中: <input type=’button’ ng-click=”set

js中事件普通事件的區別

簡單來說,普通事件中的onclick只支援單個事件,會被其他onclick事件覆蓋,而事件繫結中的addEventListener可以新增多個事件,而不用擔心被覆蓋。並且普通方式繫結事件後,不可以取消。addEventListener繫結後則可以用removeEvenList

jquery迴圈click事件

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title> </head> <script

解決jQuery元素toggle事件後元素變成隱藏的問題

原因分析 很簡單,toggle功能在1.9版本之後發生變化了。不再支援多個事件輪流切換。摘一段官網說明: Note: This method signature was deprecated in jQuery 1.8 and removed in jQuery 1.

js事件冒泡、事件事件監聽、事件委託

點選連結 事件機制 事件繫結 首先要對 DOM 元素繫結事件處理函式。所謂事件處理函式,就是處理使用者操作的函式,不同的操作對應不同的名稱。 事件繫結的辦法: 1.直接在HTML元素繫結,在標籤後加onclick = function(){}等

js事件事件監聽、事件委託

一、JavaScript事件:事件是文件或瀏覽器中發生的特定互動瞬間! 事件流: 1、事件冒泡:事件冒泡即事件最開始由最具體的元素(文件中巢狀層次最深的那個節點)接收,然後逐級向上傳播至最不具體的節點(文件)。 text–>div–&

【已解決】jquery append click事件失效解決方案

因為要非同步載入一些東西,並且需要在使用append新增的元素上繫結click方法,就出現了失效的情況。 <div style="background-color: #ffffff;" class="addresstop"> &

深入理解JS的事件事件流模型

https://www.jb51.net/article/139997.htm 一、JS事件 (一)JS事件分類 1.滑鼠事件: click/dbclick/mouseover/mouseout 2.HTML事件:  onload/onunload/onsubmit/onresize/o

事件事件處理程式)

事件處理程式(事件繫結):響應某個事件的函式就叫做事件處理程式(或事件偵聽器)。 為事件指定處理程式的方式: 1.HTML 事件處理程式:某個元素支援的每種事件,都可以使用一個與相應事件處理程式同名的 HTML 特性來指定。這個特性的值應該是能夠執行的 JavaScript 程式

按鈕點選事件--onClick事件

例子:給按鈕新增繫結事件:<button type="submit" id="btn">btn</button>第一種:$("#btn").click(function(even

JavaScript事件事件解除、DOM載入完成,相容IE8+

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-e