События jquery на несуществующих элементах
Неправильно ли привязывать события к идентификаторам, которые не находятся на странице в определенных обстоятельствах (на основе PHP)? Это вызовет ошибки кода и медленность, или jQuery автоматически проигнорирует их?
Должен ли я вместо этого добавить что-то вроде следующего для каждого элемента, который может быть не там?
if ( $('#element') ){
$('#element').click(function(event) {}
}
Настройка моей страницы - это определенное поле для редактирования, которое не загружается при определенных условиях, чтобы функции не проверялись. Я установил его с условным php include, потому что он основан на обстоятельствах в базе данных, которые я действительно не хочу перейдите к интерфейсу.
В настоящий момент все js для страницы находятся в одном файле с рядом функций.
Ответы
Ответ 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()