2013-02-14 58 views
73

我試圖找出什麼是

$(document).on('click', '#id', function(){}); 

的區別
$('#id').on('click', function(){}); 

我已經無法找到任何信息,如果有任何兩者之間的區別,如果有什麼差異可能是。

能有人請解釋,如果有什麼區別呢?

+2

您是否閱讀過文檔或在本網站上進行搜索?應該有幾百萬個答案可供選擇? – adeneo 2013-02-14 16:16:16

+0

在[本節](http://api.jquery.com/on/#direct-and-delegated-events)中的「.on()'的API文檔中閱讀關於事件委託的內容 – 2013-02-14 16:17:53

+6

得到「點飢餓」的河馬回答這個問題,儘管它有明確的記錄。第一個代碼說「當文檔被點擊時,如果它是#id的ID然後觸發這個代碼」。第二種說法是:「當點擊ID號的當前存在的任何內容時,觸發此代碼」。第一個是將事件分配給當時不存在的元素,但將來會做。第二個不會因後來添加的元素而觸發。 – Archer 2013-02-14 16:18:11

回答

55

第一個示例演示事件委託。事件處理程序綁定到DOM樹(在這種情況下爲document)上的一個元素,並在事件到達源自與選擇器匹配的元素的元素時執行。

這是可能的,因爲大多數DOM事件冒泡樹從起點。如果你點擊#id元素,產生點擊事件,將向上冒泡通過所有的祖先元素(邊注:這裏居然是在此之前一個階段,稱爲「捕獲階段」,當事件歸結樹到目標)。您可以在任何這些祖先中捕捉事件。

第二個例子直接結合事件處理程序的元件。這個事件仍然會冒泡(除非你在處理程序中阻止它),但由於處理程序綁定到了目標上,所以你不會看到這個過程的效果。

通過委派的事件處理程序,可以確保它是爲未在DOM在結合時存在的元素執行。如果您的第二個示例後創建了#id元素,則您的處理程序將永遠不會執行。通過在執行時綁定到一個你知道在DOM中的元素,你可以確保你的處理程序實際上會被附加到某個東西上,並且可以在稍後適當的時候執行。

+1

我想知道哪一個委託事件更快。我想提高我的jQuery代碼的質量。由於DOM中的委託事件比從#Element委派事件花費的時間少。請分享您的想法 – 2014-08-30 09:41:30

+1

@James Allardice - 使用後一種方法,'$(document).on('click',$('#id'),function()...'我怎樣才能使用'$(this) '引用'$('#id')'''$(this)'當前引用'document' - 我明白。 – cheshireoctopus 2014-09-17 22:24:18

11

請考慮下面的代碼

<ul id="myTask"> 
    <li>Coding</li> 
    <li>Answering</li> 
    <li>Getting Paid</li> 
</ul> 

現在,這裏有雲的區別

// Remove the myTask item when clicked. 
$('#myTask').children().click(function() { 
    $(this).remove() 
}); 

現在,如果我們再增加一個myTask?

$('#myTask').append('<li>Answer this question on SO</li>'); 

點擊此myTask項目不會從列表中刪除它,因爲它沒有綁定任何事件處理程序。如果相反,我們使用.on,這個新項目就可以在我們沒有任何額外的努力的情況下工作。這裏的。對版本是什麼樣子:

$('#myTask').on('click', 'li', function (event) { 
    $(event.target).remove() 
}); 

摘要:

.on().click()之間的差異將是,當與.click()事件相關聯的DOM元素在動態添加.click()可能無法正常工作稍後的時間點,而.on()可用於在以後的時間點動態生成與.on()調用關聯的DOM元素的情況。

+0

Bhushan,有沒有任何理由使用前者而不是後者? – 2016-01-08 22:09:34

+0

@SzilardMagyar I猜我已經回答了我在答案的摘要部分.. – 2016-01-10 03:48:25

+0

好信息! – 2017-04-08 08:08:34