在jquery中,事件代理的意思是把事件繫結到父級元素,等待事件通過DOM冒泡到該元素時再執行的行為;事件代理就是利用事件冒泡的原理把事件加到父級上,通過判斷事件來源,執行相應的子元素的操作,可以極大減少事件繫結次數,提高效能。
本教學操作環境:windows10系統、jquery3.6.0版本、Dell G3電腦。
在jQuery中,事件代理是指:把事件繫結到父級元素,然後等待事件通過DOM冒泡到該元素時再執行。
事件代理就是利用事件冒泡的原理(事件冒泡就是事件會向它的父級一級一級傳遞),把事件加到父級上,通過判斷事件來源,執行相應的子元素的操作,事件代理首先可以極大減少事件繫結次數,提高效能;其次可以讓新加入的子元素也可以擁有相同的操作。
在事件偵聽過程中有兩種觸發事件的方式:事件捕獲和事件冒泡。事件冒泡更快,效率更高。
事件捕獲:事件在DOM中向後代元素下沉。
事件冒泡:事件從發生事件的源元素通過DOM向上冒泡。
jQuery使用事件冒泡的方式處理所有的事件。jQuery庫提供了3個方法來繫結元素的事件處理常式,分別是bind()、live()、delegate()。
1、使用.bind()繫結事件處理常式:必須提供兩個引數,第一個是事件型別,第二個是事件處理常式。
.bind(event type,event handle)
如:
$(document).ready(function(){ $(".selector").bind("click",alertMe); function alertMe(){ alert("Hello world!"); } });
.bind()方法僅適用於為DOM中已經存在的元素繫結事件處理常式。對於後來通過操作指令碼時新增的DOM元素,則不起作用。
設想:在DOM中有一個.box元素,你希望某個連結在每次被單機時複製這個元素,並把它新增到DOM中。首先,我們可以為這個連結繫結一個適當的click事件處理常式。每單擊這個連結一次,.clone()方法就會呼叫一次,複製box元素並把它追加到相應的容器中:
$(document).ready(function(){ $('.box').bind('click',function(){ $(this).clone().appendTo('.container'); }); }); <div class="container"> <div class="box">click me</div> </div>
在瀏覽器執行,結果是單擊這個連結,會追加元素。但是單擊除了第一個連結的元素時,並不會執行click事件。
因此:繫結的click事件不能作用於這些剛剛被新增到DOM中的新元素。只有繫結事件那一刻DOM中存在的元素才會成功繫結click事件。click事件僅僅被繫結到第一個元素上,因此雖然能不斷克隆第一個元素,而被克隆出來的這些元素卻沒有一個能夠受click事件影響。如果想這個克隆出來的元素能夠受click事件影響,可以使用.live()繫結。
2、使用.live()繫結事件處理常式
.live()方法提供了一種相當靈活地捕獲事件的方式。它的用法與.bind()極為相似。唯一不同點是.live()方法不僅作用於DOM中當前存在的元素,還作用於將來可能存在(動態生成)的元素。
.live(event type,event handle)
修改上面的例子:
$(document).ready(function(){ $('.box').live('click',function(){ $(this).clone().appendTo('.container'); }); }); <div class="container"> <div class="box">click me</div> </div>
3、使用.delegate()繫結事件處理常式
.delegate(selector,event type,event handler)
修改以上例子:
<script type="text/javascript"> $(document).ready(function(){ $('.container').delegate('.box','click',function(){ $(this).clone().appendTo('.container:first'); }); }); </script> <body> <div class="container"> <div class="box">click me</div> </div> <div class="container"> <div class="box">click me</div> </div> <div class="container"> <div class="box">click me</div> </div> </body>
於用.live()繫結事件處理常式執行效果一樣。但是用.delegate()繫結事件處理常式要比用.live()效率更高。jQuery庫有關係結的部分原始碼
bind: function( types, data, fn ) { return this.on( types, null, data, fn ); }, unbind: function( types, fn ) { return this.off( types, null, fn ); }, live: function( types, data, fn ) { alert(this.context); //新增一行 jQuery( this.context ).on( types, this.selector, data, fn ); return this; }, die: function( types, fn ) { jQuery( this.context ).off( types, this.selector || "**", fn ); return this; }, delegate: function( selector, types, data, fn ) { alert(this); //新增一行 return this.on( types, selector, data, fn ); }, undelegate: function( selector, types, fn ) { // ( namespace ) or ( selector, types [, fn] ) return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn ); },
分別在live和delegate方法內增加了一行,瀏覽器執行後,使用.live(),彈出是document,也就是說用.live()繫結事件,它的源頭是document。使用.delegate(),彈出的是object,也就是說用.delegate()繫結事件,它的源頭是具體系結的元素。因此,使用.delegate()要比使用.live()效率更高。
從原始碼可以看出,用.bind()繫結事件處理常式,可以使用unbind()取消事件繫結。
用.live()繫結事件處理常式,可以使用die()取消事件繫結。
用.delegate()繫結事件處理常式,可以使用undelegate()取消事件繫結。
視訊教學推薦:
以上就是jquery事件代理的意思是什麼的詳細內容,更多請關注TW511.COM其它相關文章!