Есть ли прирост производительности при увеличении специфичности привязки делегированных событий с помощью .on()
?
Как это проверить?
Например, является ли второй оператор более эффективным, чем первый:
$('.foo').on('mouseenter', ':has(.other)', function (e) {
console.log(e);
});
$('.bar').on('mouseenter', 'button:has(.other)', function (e) {
console.log(e);
});
$('.foo').on('mouseenter', ':has(.other)', function (e) {
console.log(e);
});
$('.bar').on('mouseenter', 'button:has(.other)', function (e) {
console.log(e);
});
.foo, .bar {
margin: 2em auto;
text-align: center;
}
<div class="foo">
<button type="button">Hello
<span class="other">World</span>
</button>
</div>
<div class="bar">
<button type="button">Hello
<span class="other">World</span>
</button>
</div>
Меня больше всего беспокоит то, что прослушивание событий mouseenter
с делегированием снижает производительность, и есть ли способ проверить производительность обработчика событий этого типа.
Обновить
Я должен уточнить, что я не пытаюсь понять последствия использования делегирования в целом для производительности. Я надеюсь понять влияние на производительность использования делегирования с помощью mouseenter
во время взаимодействия с пользователем (поскольку мышь пользователя вводит как делегированные, так и неделегированные элементы в связанный элемент), и если есть прирост производительности за счет использования более конкретного селектора для делегирования .
Я склонен предположить, что это не так, потому что каждое событие должно всплывать до связанного элемента, прежде чем оно будет проверено делегированным селектором.
Но есть ли способ проверить это?
mouseenter
и получить ли прирост производительности за счет использования более конкретного селектора для делегирования. Я склонен предположить, что это не так, потому что каждое событие должно всплывать до связанного элемента, прежде чем оно будет проверено делегированным селектором. Но есть ли способ проверить это? - person gfullam   schedule 13.02.2015:has
в вызовеclosest
(какon
делает за кулисами) будет иметь ужасную производительность. Я бы проверилbutton
в селекторе, а затем использовал метод.has()
в обратном вызове. - person lonesomeday   schedule 13.02.2015:has
selector не находится в вашем строка селектора. Это селектор jQuery, а не собственный браузер, поэтому он очень медленный. Вы используете его для каждого элемента дерева. Если вы сделаете еще один тест, напримерbutton
, а затем используйте.has
функцию для проверки этого элемента, он будет иметь гораздо более высокая производительность, поскольку он может лучше использовать встроенные возможности браузера. - person lonesomeday   schedule 13.02.2015:has
, потому что вы не можете связать.has
с делегированными селекторами — он может только цепочка к существующим элементам DOM, и во время привязки элементов нет. Именно из-за того, что я использую:has
, я беспокоюсь о других преимуществах производительности. Мне также важно понять, что происходит и как протестировать производительность в этой ситуации. - person gfullam   schedule 13.02.2015:has
из селектора и выполнить тест в обратном вызове события; у него будет гораздо лучшая производительность. См. эти два примера: они функционально эквивалентны, но первый имеет гораздо лучшую производительность. - person lonesomeday   schedule 13.02.2015:has
в селекторе чаще (в повторных тестах) более эффективно, чем использование.has
в обработчике; это также показывает, что увеличение специфичности, как вbutton:has
в селекторе, постоянно повышает производительность. См.: jsperf.com/has-filter-in-delegated-event-selector< /а> - person gfullam   schedule 03.05.2015