2012-07-03 31 views
10

是更好/事件偵聽器內更快地使用thisevent.target優勢*此*在event.target

我一直在寫這樣的代碼(例如是jQuery的):

jQuery('input').bind('keyup', function (e) { 
var j = jQuery(e.target); 
foo(j.attr('id') , j.val()); 
}); 

我被告知用this替換e.target,因爲它「更好」。其中一個或另一個真的有優勢嗎?

我使用的目標,因爲它是一個更通用的解決方案,因爲它適用於委派事件。我在基準測試中遇到了麻煩,因爲我的測試與綁定混亂(雖然,顯然,在這種情況下,差異太小無論如何)

+0

使用委託,'this'返回與選擇器匹配的元素。 'target'返回事件冒泡的元素。 – ColBeseder

+1

'this'在這種情況下速度更快:http://jsperf.com/this-and-event-target – Mageek

+0

這會稍微快一點,因爲它不需要解析object的屬性。但那是如此的微不足道,甚至不值得討論。如果您出於性能原因考慮此問題,請首先查看'this.id'到'j.attr('id')'。 (簡稱:真的沒關係!) – rodneyrehm

回答

16

的一個並不比其他更好的,但他們做不同的事情:這個指到事件所附的元素,而event.target是調用事件的元素。

例如

div id=foo 
    div id=bar 

當點擊附接到FOO,和杆被點擊時,該事件將冒泡到foo。在事件將把event.target酒吧

在這取決於你需要處理哪些元素結束。

api.jquery.com/event.target上有一個小例子,它演示了event.target。下面是一個使用該示例的小示例,但它也顯示http://jsbin.com/adifan/edit#javascript,html,live

+1

在委託事件上,'this'仍然指向與'event.target'相同的地方。例如'$('#foo')。('click','#bar',function(e){..});' –

+1

'

foo

'點擊'p'會導致event.originalTarget指向'span '如果你點擊「foo」這個詞。 – rodneyrehm

+0

@ GabyakaG.Petrioli在你的例子中,你綁定了選擇器「#bar」,而不是foo,所以* this *的確是bar。如果你綁定到#foo,*這個*應該是foo。我使用了http://api.jquery.com/event.target/中的示例,並將* this *的顯示添加到顯示中以說明本示例中的兩個示例:http://jsbin.com/adifan /編輯#預覽 –