Подтвердить что ты не робот

События jquery на несуществующих элементах

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

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

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

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

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

4b9b3361

Ответ 1

Когда селектор 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().

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

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

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

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

Ответ 2

$("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()