2013-12-17 3 views
1

Является ли первая .on функция более эффективной, чем вторая?jQuery .on efficiency

$("div.container").on("click", "p", function(){ 
}); 

$("body").on("click", "p", function(){ 
}); 

Привет

+1

Возможно, поскольку событие не должно распространяться столько раз, сколько нужно, чтобы добраться до 'p.container', чтобы добраться до' body'. –

+1

* «Иерархические селекторы часто можно избежать, просто привязывая обработчик к более подходящей точке документа. Например, вместо' $ («body») .on («click», «#commentForm .addNew», addComment) 'use' $ ("#commentForm") .on ("click", ".addNew", addComment) '." * [jQuery Doc] (http://api.jquery.com/on/#event-performance) –

ответ

2

От самой документации JQuery о jQuery: .on():

JQuery может обрабатывать простые селекторы тега формы # id.class очень быстро, когда они используются для фильтрации делегированных события. Итак, «#myForm», «a.external» и «button» - это быстрые селектор. Делегированные события, которые используют более сложные селектора, особенно иерархические, могут быть в несколько раз медленнее - хотя они все еще достаточно быстры для большинства приложений. Иерархических селекторов часто можно избежать, просто привязывая обработчик к более подходящей точке документа. Например, вместо $ ("body") .on ("click", "#commentForm .addNew", addComment) используют $ ("#commentForm") .on ("click", ".addNew", addComment) ,

1

Чем уже первый селектор, тем лучше производительность.

Но первый пример не будет работать, я думаю,, потому что вы контролируете всех <p> сек контейнер в <p> с container имеющим класса и <p> не может содержать другой <p>, из-за будучи phrasing content.

+0

мой плохой, я его изменю – Tukkan

1

Несомненно, поскольку браузеру необходимо отслеживать только один абзац для событий click, а не для всей страницы.