JQuery .live () более интенсивно использует память? - PullRequest
2 голосов
/ 06 января 2011

Является ли jQuery .live () более требовательным к памяти, чем простой .click () .hover () или .keyup ()?

Я полагаю, что будет, но в какой степени?

Ответы [ 2 ]

7 голосов
/ 06 января 2011

Я бы предположил, что он требует меньше памяти, но требует больше ресурсов процессора, поскольку он назначает одну функцию-обработчик для каждого события / селектора, но для этого необходимо запустить тест для сопоставлять с этим селектором для каждого события такого типа, которое происходит на странице, чтобы проверить, соответствует ли оно.

На самом деле, хотя я не углубился в то, как это работает, я бы подумал, что ему нужно будет запустить тест на совпадение с селектором для каждого элемента из e.target на до document (или до тех пор, пока он не найдет совпадение), чтобы увидеть, соответствует ли что-нибудь по пути селектору. Кто-то другой может исправить меня, если я ошибаюсь.

Тем не менее, когда вы делаете $('.someClass').click(function() {}), он тоже использует только одну функцию-обработчик. Так что если есть 100 элементов с .someClass, все они будут использовать одну и ту же функцию, но jQuery действительно должен создать уникальную запись в jQuery.cache для каждого элемента, который получает этот обработчик, и поэтому должен управлять ими так, как если бы они были отдельными.

Метод .delegate() - хороший компромисс между ними.

Он ведет себя так же, как и .live(), за исключением того, что вы назначаете его локальной части страницы, поэтому он обрабатывает только клики в этом разделе. Поэтому не нужно учитывать каждое событие, которое происходит на странице. Скорее только те, которые происходят внутри этого контейнера.


РЕДАКТИРОВАТЬ: Улучшено выражение того, что делает двигатель селектора, с учетом @ Šime Vidas .

4 голосов
/ 06 января 2011

Это зависит от того, чего вы пытаетесь достичь.Почти каждый случай, с которым я столкнулся, где я использовал live(), в конечном итоге был лучше решен delegate().(они похожи, но имеют ключевое различие) live() делегирует корень всего дерева DOM и проверяет каждое указанное вами событие.Использование delegate() позволяет вам указать другой корень, который будет следить за событиями, что в итоге будет работать намного эффективнее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...