#jquery
#jquery
Вопрос:
Если я передаю его selector
как parameter
в функцию.
// selector is an object
function(selector) {
selector.trigger('eventHere');
}
Очевидно, что event
никогда не сработает, если в selector
переданном в не было этого event
, но должен ли я выполнить некоторую проверку условий перед запуском события? Я имею в виду:
// selector is an object
if(selector === 'matched'){
// then fire the event
}
else{
// do nothing
}
или просто оставить его …?
Комментарии:
1. Селекторы jQuery — это простые строки (например,
"div.main h2"
), поэтому я предполагаю, что вы даете это название другой концепции. Можете ли вы уточнить?
Ответ №1:
Приятная особенность jQuery заключается в том, что он не будет выдавать исключение или вызывать ошибку, если селектор не совпадает. Таким образом, вам не нужно делать ничего дополнительного; это безопасная операция:
// selector **must** be a jQuery object
// the assumption here is that you've already done
// var selector = $('selectorString'); elsewhere
// and have invoked this function with selector
function(selector){
selector.trigger('eventHere');
}
Однако обратите внимание, что вы должны убедиться, что selector
это объект jQuery! В противном случае вы могли бы получить сообщение об ошибке, указывающее, что trigger
это не функция.
Редактировать
Адам Терлсон отмечает в комментариях «может быть, стоит проверить, является ли объект jquery нулевым или имеет длину 0, прежде чем выполнять функцию против него. То, что он не выдает ошибку, не означает, что производительность нельзя повысить, если не выполнять его в первую очередь (jQuery все еще пытается).«
Существует также тест jsperf, который показывает, что существует заметная разница в операциях в секунду для каждого метода (сейчас не время! Сначала это сбило меня с толку) — проверка объекта jQuery длиной null
/ 0
перед вызовом функции вместо простого вызова функции.
Комментарии:
1. В качестве примечания к вашему замечательному предложению, может быть, стоит проверить, является ли объект jquery нулевым или имеет длину 0, прежде чем выполнять функцию против него. То, что он не выдает ошибку, не означает, что производительность нельзя повысить, не выполняя его в первую очередь (jQuery все еще пытается).
2. @Adam Это звучит как хорошая идея, но я бы предположил, что поиск совпадений для строки селектора будет самой дорогостоящей операцией для jQuery. Вызов функции для элементов, однажды найденных, должен быть относительно недорогим. Мысли? Ссылки / числа, показывающие иное? Мне было бы интересно узнать, окажет ли положительное влияние добавление
if(selector)
в приведенный выше код.3. @NoGood — Влияние относительно невелико по сравнению с некоторыми проблемами производительности, но его стоит предпринять. Вот тест jsperf, чтобы доказать это: jsperf.com/… Я вижу улучшение на 19%, если сначала протестировать результат в Chrome.
4. @Adam Спасибо, что показали это — определенно стоит иметь в виду. Как вы думаете, замедление вызвано накладными расходами на обработку ошибок?
5. Скоро вам понадобится новое имя пользователя.
Ответ №2:
jQuery всегда возвращает массив элементов, даже если селектор вообще не вернул никаких элементов, он будет содержать пустой массив.
Вы все еще можете выполнить любую функцию в этом пустом массиве без того, чтобы jQuery выдавал ошибку, поэтому нет необходимости проверять, существуют ли возвращаемые элементы.
Если у элемента нет такого события для запуска, но вы пытаетесь его запустить, ничего не произойдет, исключение не будет выдано, опять же; проверять не нужно.
пожалуйста, также обратите внимание, что если вы настаиваете на передаче селектора вашему объекту, вам все равно нужно извлекать объекты с помощью селектора, прежде чем вы сможете что-либо с ними сделать.
function myTriggerFunction(selector)
{
var elements = $(selector);
elements.trigger('eventHere');
}
myTriggerFunction('.WeWillBeTriggered');
Ответ №3:
Просто запустите событие..
Но переменная selector на самом деле должна быть объектом jQuery (с используемым вами синтаксисом).
Ответ №4:
Если при создании объекта jQuery ни одному элементу не соответствовало, это все равно будет объект jQuery, но с нулевыми элементами внутри. Большинство методов, которые вы выполняете с объектом jQuery, могут обрабатывать любое количество элементов, включая ноль, поэтому, если вы просто хотите ничего не делать, вам не нужно выполнять какие-либо проверки.
Только если вы хотите сделать что-то особенное, когда коллекция пуста, вам нужно проверить это, и вы делаете это, проверяя length
свойство:
function(selection){
if (selection.length > 0) {
selection.trigger('eventHere');
} else {
// do something else because the selection was empty
}
}
Обратите внимание, что «селектор» — это строка, которая используется для указания, какие элементы помещать в объект jQuery, подобно строке #main
в коде $('#main')
, поэтому вызов объекта jQuery «селектор» может сбивать с толку.
Ответ №5:
Если вы хотите убедиться, что событие будет запущено только для определенного типа элемента, вы можете проверить это перед запуском события.
if (selector.is("type of element")) {
//then fire event
}
или, если вы хотите проверить его по имени тега
if (selector.get(0).tagName=="tag name") {
//then fire event
}
Комментарии:
1. разве весь смысл селекторов jquery не в том, что вы уже знаете это заранее?
2. Согласно OP, предполагается, что функция будет вызвана даже для селекторов (элементов), которые не поддерживают зарегистрированное событие.
3. в этом случае
selector.is("type of element")
всегда будет возвращать false в вашем примере, и его следует повторить.