События jquery для несуществующих элементов - PullRequest
12 голосов
/ 21 сентября 2011

Разве плохо связывать события с идентификаторами, которых нет на странице при определенных обстоятельствах (на основе PHP)? Это вызовет ошибки кода и медлительность, или jQuery автоматически их игнорирует?

Должен ли я вместо этого поместить что-то вроде следующего в каждый элемент, которого там может не быть?

if ( $('#element') ){
    $('#element').click(function(event) {}
}

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

В настоящий момент все файлы js для страницы находятся в одном файле с несколькими функциями.

Ответы [ 2 ]

16 голосов
/ 21 сентября 2011

Когда селектор jQuery не возвращает никаких элементов, никакие события не связываются. Таким образом, вы не причиняете вреда, не написав if заявление.

Это означает, что внутренне jQuery привязывает обработчик событий ко всем соответствующим элементам. Когда их нет, никакой обработчик не будет привязан ни к какому элементу. Это означает: вам не нужно проверять существование элемента в вашем коде.

Ссылка на будущее

Всякий раз, когда вы делаете

if ( $('#element') ){
    $('#element').click(function(event) { /* blah blah */ });
}

Вы должны скорее сохранить результаты селектора

var result = $('#element');

// check number of elements (zero equals false, anything else equals true)
if (result.length) {
    result.click(function(event) {
        // blah blah
    });
}

result.length равно то же , что и result.size().

Привязка обработчиков событий к несуществующим элементам

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

Примечание : Начиная с jQuery 1.7, метод .delegate () был заменен методом .on () . Однако для более ранних версий это остается наиболее эффективным способом использования делегирования событий.

См. Документация jQuery .

3 голосов
/ 21 сентября 2011

$("selector") всегда будет возвращать объект jquery со списком элементов, которые соответствуют вашему селектору.

if($("#nonexistantelement")) { /* this always happens*/ }

Все, что находится внутри вашего if, всегда будет истинным, потому что Objects истинно.Если вы действительно хотите сделать это, то вы бы хотели сказать что-то вроде:

if($("#nonexistantelement").length > 0) { /* this only happens if you have something */ }

Это скажет вам, действительно ли вы соответствовали своим элементам.Но нет ничего страшного в простом вызове .click(function) для пустого набора jquery.Потому что все, что делает jquery - это перебирает элементы, соответствующие селектору, и применяет этот слушатель.Если в наборе нет элементов, он не будет применен, и, по сути, это просто noop.

Теперь, если вы хотите привязать обратные вызовы к элементам, которые не существуют пока , тогдасмотреть в .live() и delegate()

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