Как я могу проверить существование элемента в jQuery?
Текущий код, который у меня есть, это:
if ($(selector).length > 0) {
// Do something
}
Есть ли более элегантный способ подойти к этому? Возможно, плагин или функция?
javascript
jquery
Джейк МакГроу
источник
источник
NaN != false
.[] + []
=""
... ааа, я люблю javascript[].toString() === [].join(',') === ""
и"" === ""
.typeof NaN == 'number'
Да!
Это в ответ на: подкаст Herding Code с Джеффом Этвудом
источник
$.fn.exists
пример заменяет поиск свойства (дешево!) Двумя вызовами функций, которые намного дороже, и один из этих вызовов функций воссоздает объект jQuery, который у вас уже есть, что просто глупо..exists
читается чисто, тогда как.length
читается как что-то семантически другое, даже если семантика совпадает с идентичным результатом.Если вы использовали
Вы подразумеваете, что цепочка была возможна, когда это не так.
Это было бы лучше:
В качестве альтернативы из FAQ :
Вы также можете использовать следующее. Если в массиве объектов jQuery нет значений, то получение первого элемента в массиве вернет undefined.
источник
$(".missing").css("color", "red")
уже делает правильные вещи ... (т.е. ничего)$.fn
методов jQuery, которые возвращают что-то отличное от нового объекта jQuery и, следовательно, не связываются.Вы можете использовать это:
источник
Самый быстрый и наиболее семантически понятный способ проверки существования на самом деле - это использование обычного
JavaScript
:Это немного длиннее для записи, чем альтернатива длины jQuery, но выполняется быстрее, поскольку это нативный метод JS.
И это лучше, чем альтернатива написания собственной
jQuery
функции. Эта альтернатива медленнее, по причинам, указанным @snover. Но это также создало бы у других программистов впечатление, что этаexists()
функция присуща jQuery.JavaScript
будут / должны быть поняты другими, редактирующими ваш код, без увеличения долга знаний.NB: обратите внимание на отсутствие знака «#» перед
element_id
(поскольку это обычный JS, а неjQuery
).источник
$('#foo a.special')
. И он может вернуть более одного элемента.getElementById
не могу начать приближаться к этому.if(document.querySelector("#foo a.special"))
будет работать. Нет необходимости JQuery.Вы можете сохранить несколько байтов, написав:
Это работает, потому что каждый объект jQuery также маскируется как массив, поэтому мы можем использовать оператор разыменования массива, чтобы получить первый элемент из массива . Возвращается,
undefined
если в указанном индексе нет элемента.источник
jQuery.first()
илиjQuery.eq(0)
оба возвращают объекты, объекты являются правдивыми, даже если они пустые. Этот пример должен проиллюстрировать, почему эти функции нельзя использовать как есть:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
.eq(0)
возвращает просто еще один объект jQuery, усеченный до длины 1 или 0..first()
Это просто удобный метод для.eq(0)
. Но.get(0)
возвращает первый элемент DOM илиundefined
и так же, как[0]
. Первый элемент DOM в объекте jQuery хранится в свойстве обычного объекта с именем'0'
. Это простой доступ к свойству. Единственное приведение типов происходит от неявного преобразования числа0
в строку'0'
. Так что, если приведение типов является проблемой, вы можете использовать$.find(selector)['0']
вместо этого.Ты можешь использовать:
Чуть более элегантно, возможно.
источник
666
вероятно, имеют множество других причин, по которым их код не работает. Хотя это недопустимый селектор, $ (666) .length является допустимым javascript : он оценивается как правдивый и поэтому должен удовлетворять условию.$.find(666).length
работает.Этот плагин можно использовать в
if
выражении типаif ($(ele).exist()) { /* DO WORK */ }
или с помощью обратного вызова.Plugin
jsFiddle
Вы можете указать один или два обратных вызова. Первый будет срабатывать, если элемент существует, второй будет срабатывать, если элемент не существует. Однако, если вы решите передать только одну функцию, она будет срабатывать только тогда, когда элемент существует. Таким образом, цепь умрет, если выбранный элемент не существует. Конечно, если она существует, первая функция сработает и цепочка продолжится.
Имейте в виду, что использование варианта обратного вызова помогает поддерживать цепочечность - элемент возвращается, и вы можете продолжить цепочку команд, как и с любым другим методом jQuery!
Пример использования
источник
Has Items
обратный вызов фактически передать объект в качестве аргумента?Я вижу, что большинство ответов здесь не являются точными, как они должны быть, они проверяют длину элемента, во многих случаях это может быть нормально , но не на 100% , представьте, что вместо функции передается число, поэтому я создаю прототип функции, которая проверяет все условия и вернуть ответ так, как должно быть:
Это проверит длину и тип, теперь вы можете проверить это следующим образом:
источник
На самом деле нет необходимости в jQuery. С простым JavaScript легче и семантически правильно проверить:
Если по какой-либо причине вы не хотите добавлять идентификатор к элементу, вы все равно можете использовать любой другой метод JavaScript, предназначенный для доступа к DOM.
JQuery действительно крутой, но не позволяйте чистому JavaScript забыться ...
источник
:has()
?Вы можете использовать это:
источник
Причина, по которой все предыдущие ответы требуют этот
.length
параметр, заключается в том, что они в основном используют$()
селектор jquery, у которого querySelectorAll находится за занавесом (или они используют его напрямую). Этот метод довольно медленный, потому что ему нужно проанализировать все дерево DOM, найти все совпадения с этим селектором и заполнить им массив.Параметр ['length'] не нужен и не полезен, и код будет намного быстрее, если
document.querySelector(selector)
вместо этого использовать его напрямую , поскольку он возвращает первый соответствующий элемент или ноль, если не найден.Однако этот метод оставляет нас с фактическим возвращаемым объектом; что хорошо, если он не будет сохраняться как переменная и использоваться повторно (таким образом, сохраняя ссылку, если мы забудем).
В некоторых случаях это может быть желательно. Его можно использовать в цикле for следующим образом:
Если вам на самом деле не нужен элемент и вы хотите получить / сохранить только значение true / false, просто удвойте его! Это работает для обуви, которая развязана, так почему узел здесь?
источник
Это
$.contains()
то, что вы хотите?источник
Я обнаружил,
if ($(selector).length) {}
что недостаточно. Это будет молча сломать ваше приложение, когдаselector
пустой объект{}
.Мое единственное предложение - выполнить дополнительную проверку
{}
.Я все еще ищу лучшее решение, хотя это немного тяжело.
Редактировать: ВНИМАНИЕ! Это не работает в IE, когда
selector
это строка.источник
$()
пустой объект в качестве аргумента?{}
в$()
?Вы можете проверить наличие или отсутствие элемента в java-скрипте. Если длина больше нуля, то элемент присутствует, если длина равна нулю, то элемент отсутствует
источник
Проверка существования элемента четко документирована на самом официальном сайте jQuery!
источник
это очень похоже на все ответы, но почему бы не использовать
!
оператор дважды, чтобы вы могли получить логическое значение:источник
Boolean(x)
может быть более эффективным.источник
if
гдеif
они улучшат читабельность за счет 2 байтов.&&
для вас.Попробуйте проверить
DOM
элементисточник
Вдохновленный ответом хайвея, я придумал следующее:
jQuery.contains принимает два элемента DOM и проверяет, содержит ли первый элемент второй.
Использование
document.documentElement
в качестве первого аргумента удовлетворяет семантикеexists
метода, когда мы хотим применить его исключительно для проверки существования элемента в текущем документе.Ниже я соединил фрагмент , который сравнивает
jQuery.exists()
против$(sel)[0]
и$(sel).length
подходов , которые возвращаютtruthy
значения в$(4)
то время$(4).exists()
возвращаетсяfalse
. В контексте проверки существования элемента в DOM это, кажется, желаемый результат .Показать фрагмент кода
источник
Нет необходимости в jQuery (базовое решение)
Гораздо более производительный вариант ниже (обратите внимание на отсутствие точки перед классом).
querySelector использует правильный механизм сопоставления, такой как $ () (sizzle) в jQuery, и использует больше вычислительной мощности, но в 99% случаев все будет в порядке. Второй вариант более явный и сообщает коду, что именно делать. Это намного быстрее, согласно jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25
источник
Мне просто нравится использовать простой ванильный JavaScript для этого.
источник
Я наткнулся на этот вопрос, и я хотел бы поделиться фрагментом кода, который я сейчас использую:
И теперь я могу написать такой код -
Может показаться, что кода много, но когда он написан на CoffeeScript, он довольно маленький:
источник
У меня был случай, когда я хотел посмотреть, существует ли объект внутри другого, поэтому я добавил что-то в первый ответ, чтобы проверить селектор внутри селектора.
источник
Как насчет:
Это очень минимально и избавляет вас от необходимости включать селектор с
$()
каждым разом.источник
if($("#thing").exists(){}
читается как. Кроме того, это не способ JQuery.Я использую это:
Выполнять цепочку, только если существует элемент jQuery - http://jsfiddle.net/andres_314/vbNM3/2/
источник
Вот мой любимый
exist
метод в jQueryи другая версия, которая поддерживает обратный вызов, когда селектор не существует
Пример:
источник
$("selector"
) возвращает объект, который имеетlength
свойство. Если селектор найдет какие-либо элементы, они будут включены в объект. Поэтому, если вы проверите его длину, вы увидите, существуют ли какие-либо элементы. В JavaScript0 == false
, так что если вы не получите0
ваш код будет работать.источник
Вот полный пример различных ситуаций и способ проверить, существует ли элемент, используя direct, если на jQuery селектор может или не может работать, потому что он возвращает массив или элементы.
ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ
источник
Вам не нужно проверять, больше ли оно, чем
0
нравится$(selector).length > 0
,$(selector).length
достаточно и элегантного способа проверить наличие элементов. Я не думаю, что стоит написать функцию только для этого, если вы хотите сделать больше лишних вещей, да.источник