Что происходит, если вызывается прослушиватель событий Javascript и отсутствует целевой элемент? - PullRequest
1 голос
/ 28 марта 2012

На данный момент мы загружаем прослушиватели событий для всего сайта из единого файла common.js для проекта Rails. Мы знаем (большинство) компромиссов, вовлеченных там, и просто пытаемся смягчить их. Как только наша базовая архитектура вступит в силу, мы можем переместить их в отдельные файлы по контроллеру или по виду.

На данный момент быстрый вопрос заключается в том, как мы можем активировать их только при необходимости, что порождает искаженный, псевдодзен-вопрос:

если прослушиватель событий объявляется в лесу, когда его никто не слышит, издает ли он звук?

Другими словами, если кто-то объявляет базового слушателя (т. Е. Ничего такого постоянного, как .live() или .delegate()) в javascript для данной страницы, и целевой элемент фактически не присутствует на этой данной странице, делает что-нибудь действительно происходит, кроме нескольких циклов, посвященных его оценке и проверке DOM на элемент? Он активен в памяти, ищет этот элемент? Что-то другое? Кажется, что никогда не выдается ошибка, что интересно, учитывая, что в других контекстах такой вызов вызовет нулевой / ноль / недопустимый тип ошибки.

Например:

  $(document).ready(function () {
      $('#element').bind('blur keyup', function);
    }

Предположим, что #element нет. Что-нибудь действительно происходит? Кроме того, лучше обернуть его в предварительный фильтр, например:

  $(document).ready(function () {
    if ($('#element')) {
      $('#element').bind('blur keyup', function);
    }

Или интерпретаторы .js в браузерах достаточно умны, чтобы просто игнорировать базовый прослушиватель, объявленный для элемента, которого нет в $(document).ready? Должны ли мы просто объявить начальную простую форму выше и оставить ее при этом, или проверка первого элемента каким-то образом сэкономит нам несколько ценных ресурсов и / или позволит избежать некоторых скрытых ошибок, которые мы не видим? Или я пропускаю другой угол?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

JQuery был разработан для работы с 0+ выбранными элементами.
Если элементы не были выбраны, ничего не произойдет.

Обратите внимание, что при использовании селектора jQuery вы никогда не получите ноль.Например:

$('#IDontExist') // != null
$('#IDontExist').length === 0 // true (it's ajQuery object with 
                              //       zero selected elements).

В документах указано:

Если ни один элемент не соответствует предоставленному селектору, новый объект jQuery будет пустым;то есть он не содержит элементов и имеет свойство .length 0.

2 голосов
/ 28 марта 2012

$('#element') если результат окажется пустым, jQuery ничего не сделает.

Поскольку jQuery всегда возвращает объект, мы можем также вызывать методы для пустого набора, но внутренне он выполнит проверку перед применением своей логики.

Даже если вы хотите проверить, существует ли элемент, прежде чем присоединять обработчик событий, вы можете использовать свойство length объекта jQuery.

if ($('#element').length > 0) {
    $('#element').bind('blur keyup', function);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...