Как я могу проверить наличие элемента в jQuery?
Текущий код, который у меня есть, таков:
if ($(selector).length > 0) {
// Do something
}
Есть ли более элегантный способ подойти к этому? Возможно, плагин или функция?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Да!
jQuery.fn.exists = function(){ return this.length > 0; }
if ($(selector).exists()) {
// Do something
}
Это ответ на: Подкаст Herding Code с Джеффом Этвудом
Ваш пример $.fn.exists заменяет поиск свойств (дешево!) Двумя вызовами функций, которые намного дороже, и один из этих вызовов функций воссоздает объект jQuery, который у вас уже есть, что просто глупо.
@redsquare: удобочитаемость кода - лучшее объяснение для добавления такой функции в jQuery. Если что-то под названием .exists читается чисто, тогда как .length читается как нечто семантически иное, даже если семантика совпадает с идентичным результатом.
@quixoto, извините, но .length - это стандарт для многих языков, который не нуждается в переносе. Как еще вы интерпретируете .length?
На мой взгляд, это по крайней мере одно логическое косвенное указание от концепции «длина списка больше нуля» к концепции «элемента (ов), для которого я написал селектор». Да, технически это одно и то же, но концептуальная абстракция находится на другом уровне. Это заставляет некоторых людей предпочесть более явный индикатор, даже за счет некоторой потери производительности.
Какой ужасный ответ. Что, если селектор соответствует сотням узлов и первому exists? Он должен немедленно вернуться в исходное состояние. Нет смысла возиться с остальным. пример: if ( $('div.tag:contains("nsfw")').exist() ) agecheck(); на имиджборде или что-то в этом роде
«Некоторые люди, столкнувшись с проблемой, думают:« Я знаю, я расширю базовую библиотеку ». Теперь у них две проблемы ». После того, как вы определили эту функцию и начнете использовать .exists() повсюду, весь этот код станет непереносимым из-за отсутствия такого определения функции. Похоже, это снизит ремонтопригодность.
Отличный ответ ... но попробуйте любое число, например: $ (666) .exists () // результат верный (неверный)
Коллекция jQuery будет «существовать» независимо от того, пуста она или нет. Вы не почувствуете необходимости в Array.prototype.exists = function() {return this.length;} для удобочитаемости кода.
Вы можете использовать:
if ($(selector).is('*')) {
// Do something
}
Возможно, маленький более элегантен.
Это слишком много для такой простой вещи. см. ответ Тима Бюта
Это правильный ответ. Проблема метода length заключается в том, что он дает ложное срабатывание с любым числом, например: $ (666) .length // возвращает 1, но это недопустимый селектор
Это очень дорого для очень простой задачи. Просто посмотрите на реализацию jquery if .is (), и вы увидите, сколько кода нужно обработать, чтобы ответить вам на этот простой вопрос. Также не очевидно, что именно вы хотите сделать, поэтому оно такое же или, возможно, менее элегантное, чем рассматриваемое решение.
@earnaz отличный момент, хороший улов. Однако я не понимаю, где это действительно стоящее беспокойство. Разработчики, идентифицирующие элементы с помощью 666, вероятно, имеют множество других причин, по которым их код не работает. Хотя это недопустимый селектор, $ (666) .length действительный javascript: он оценивается как истинный, и, следовательно, должен удовлетворяет условию.
@earnaz, чтобы избежать этого конкретного случая, $.find(666).length работает.
Если вы использовали
jQuery.fn.exists = function(){return ($(this).length > 0);}
if ($(selector).exists()) { }
вы бы подразумевали, что цепочка возможна, хотя это не так.
Лучше бы:
jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }
В качестве альтернативы из FAQ:
if ( $('#myDiv').length ) { /* Do something */ }
Вы также можете использовать следующее. Если в массиве объектов jQuery нет значений, то получение первого элемента в массиве вернет undefined.
if ( $('#myDiv')[0] ) { /* Do something */ }
Первый метод лучше читается. $ ("a"). exists () читается как "если элементы существуют. "$ .exists (" a ") читается как" если существуетэлементы ".
правда, но опять же, вы подразумеваете, что цепочка возможна, и если бы я попытался сделать что-то вроде $ (selector) .exists (). css ("color", "red"), это не сработало бы, и тогда я был бы = * (
Уже есть методы, которые нельзя объединять в цепочку, например функции attr и data. Я все же понимаю вашу точку зрения и, чего бы это ни стоило, я в любом случае просто проверяю длину> 0.
Зачем вам это нужно связывать? $(".missing").css("color", "red") уже делает правильные вещи… (т.е. ничего)
Первый пример ($ ('. MySelector'). Length) работает нормально, нет необходимости создавать для него оболочку exists ().
2-е изменение .... if ($ ('# myDiv') [0]) {..... неопределенный индекс 0. Вы не должны сравнивать результат напрямую, так как результата НЕТ. Вместо этого вам следует .... if (typeof $ ('# myDiv') [0]! = 'Undefined') ...
Материал о цепочке - полная чушь - есть множество методов jQuery $.fn, которые возвращают что-то отличное от нового объекта jQuery и, следовательно, не связываются.
$("<div></div>").length > 0 вернет true, создавая впечатление, что используемый селектор существует, но на самом деле это просто допустимая строка HTML. Чтобы этого избежать, $.find(selector).length > 0 выдает ошибку при недопустимом выражении селектора.
if ( $('#myDiv').size() > 0 ) { //do something }
size() подсчитывает количество элементов, возвращаемых селектором
@Furbeenator Я не знаю, откуда вы берете информацию, но .size() ничего не делает, кроме как возвращает .length. Есть причина, по которой он устарел
Вы правы, но вызов .length как свойства требует немного меньше накладных расходов, чем вызов функции .size(). Виноват.
В JavaScript все «правдиво» или «ложно», и для чисел 0 означает false, все остальное true. Итак, вы могли написать:
if ($(selector).length)
Вам не нужна эта деталь >0.
@ abhirathore2006 Если вы используете селектор идентификатора, а элемент не существует, длина равна 0 и не вызывает исключений.
Достаточно интересно NaN != false.
@ Джеймс Это потому, что [].toString() === [].join(',') === "" и "" === "".
[].toString() == "" верен, [].join(',') == "" также верен, [].toString() == [].join(',') снова верен, [].toString() == "" && [].join(',') == "" все еще верен, но [].toString() == [].join(',') == "" неверен ... Я действительно не понимаю, почему последний неверен, когда все предыдущие верны.
@debute последний, вероятно, сравнивает true (логический результат первого ==) с "", который является false. То есть: [].toString() == [].join(',') == "" -> true == "" -> false
@ Роберт и typeof NaN == 'number'
Есть ли ощутимая польза от отказа от > 0? Мне так кажется более ясным.
@Sinjai, как только вы немного привыкнете к программированию, вы спросите себя, есть ли ощутимая польза от включения> 0. Потому что без него это очень понятно и полностью законно.
@jox Я родом из страны относительного здравомыслия (не JavaScriptLand), где мы по-прежнему ценим семантику. Проверка существования элемента - это не то же самое, что проверка наличия у элемента длины, отличной от проверки того, что длина больше 0. JS может сохранять свои хаки. Дорогостоящая часть - это поддержание кода, а не его написание.
@Sinjai Я тоже не из JavaScriptLand. :-) Но мне довелось путешествовать по нему. Я довольно много путешествовал по Вселенной. Спросить не-логическое значение правдиво или ложно - распространенная идиома, которая используется не только в JavaScriptLand. Даже в C вы можете (и с радостью делаете (ну, может быть, не вы ;-))) спрашивать целые числа, если они не равны нулю без какого-либо оператора (например, if (x) {}). И обычно другие вещи затрудняют сопровождение кода. Без обид, все хорошо. У каждого свои предпочтения.
@jox Вы правы, здесь виновата концепция правды / лжи. Полагаю, мое отвращение действительно к этому. Но, учитывая тот факт, что это действительно так, я стараюсь быть максимально ясным. Я понимаю, что индустрия в целом может со мной не согласиться, хотя это вызывает у меня слезы.
Разве $(selector).first().length не был бы немного эффективнее? В противном случае, если совпадений много, jQuery создаст объект, содержащий все совпадения, даже если нам нужен только один или ни одного.
@Cerin хм, я бы подумал, что объект создается при выполнении $(...). Только после этого вы проверяете либо свойство длины, либо вызываете .first(), чтобы он не останавливал фактический поиск после первого, верно?
@ TimBüthe Это хороший аргумент. Тогда, возможно, лучше было бы включить first в сам селектор? Нравится $('<selector>:first').length?
Вы можете использовать это:
// if element exists
if ($('selector').length){ /* do something */ }
// if element does not exist
if (!$('selector').length){ /* do something */ }
Разве вы не видели, что Тим Бют уже дал этот отвечать за 2 года до вас?
Пффф, Тим никогда не показывал, как проверить, не существует ли элемента.
этот ответ и комментарии суммируют, как работает stackoverflow
На самом деле нет необходимости в jQuery. С обычным JavaScript проще и семантически правильно проверить:
if (document.getElementById("myElement")) {
//Do something...
}
Если по какой-либо причине вы не хотите указывать идентификатор для элемента, вы все равно можете использовать любой другой метод JavaScript, предназначенный для доступа к DOM.
jQuery действительно крутой, но не позволяйте чистому JavaScript уйти в небытие ...
Я знаю: он не отвечает напрямую на исходный вопрос (который запрашивает функцию jquery), но в этом случае ответ будет «Нет» или «семантически неправильное решение».
Самый быстрый и семантически самообъясняющий способ проверки существования на самом деле - использовать простой JavaScript:
if (document.getElementById('element_id')) {
// Do something
}
Это немного дольше для записи, чем альтернатива длины jQuery, но выполняется быстрее, поскольку это собственный метод JS.
И это лучше, чем альтернатива написанию собственной функции jQuery. Эта альтернатива медленнее по причинам, указанным @snover. Но это также создало бы у других программистов впечатление, что функция exists() является чем-то присущим jQuery. JavaScript будет / должен быть понят другим, редактирующим ваш код, без увеличения долга в знаниях.
NB: Обратите внимание на отсутствие символа «#» перед element_id (поскольку это простой JS, а не jQuery).
Совершенно не одно и то же. Селекторы JQuery можно использовать для любого правила CSS - например, $('#foo a.special'). И он может возвращать более одного элемента. getElementById не может приблизиться к этому.
Вы правы в том, что он не так широко применим, как селекторы. Однако в наиболее частом случае он выполняет свою работу достаточно хорошо (проверяя, существует ли единственный элемент). Аргументы в пользу самообъяснения и скорости остаются в силе.
Хотя я предпочитаю метод JQuery, мне всегда нравится видеть исходный необработанный метод работы! Дает больше понимания, когда вы видите, что JQuery что-то делает.
Может быть, что-то вроде if ('#foo a.special')[0]), если вы все еще хотите использовать селекторы jQuery? Хотя, я полагаю, это противоречит цели.
Даже когда вы это писали в 2012 году, аргументы скорости не стоял из-за изменения стандарты технологии. Аргумент скорость в движках JavaScript мертв уже много лет.
@Noz if (document.querySelector("#foo a.special")) подойдет. Не требуется jQuery.
Аргумент скорости в движках JS мертв только в сознании людей, которые не могут работать без jQuery, поскольку это аргумент, который они не могут выиграть.
Помните старые добрые времена, когда у нас было все, что у нас было document.getElementById? И я всегда забывал документ. и не мог понять, почему это не сработало. И я всегда писал неправильно и неправильно использовал регистр символов.
Я бы бросил писать JavaScript, если бы мне пришлось: 1) работать без консоли отладки или 2) работать с getElementById.
Очевидно, что ванильные методы JS работают быстрее, но обратите внимание, что в вопросе не указан выбор по идентификатору элемента, поэтому на самом деле вам нужен document.querySelector(), и даже он не может обрабатывать все селекторы, которые может jQuery. Таким образом, при вызове единственной собственной JS-функции для этой цели - хороший, в некоторых случаях вам придется писать дополнительный код. (Кроме того, if ($(selector).length) не требует пояснений - я действительно не думаю, что это могло бы сбить с толку кого-либо с опытом работы с JS.)
Удачи в тестировании :visible или любого другого пользовательского селектора jquery.
Я счел if ($(selector).length) {} недостаточным. Когда selector является пустым объектом {}, приложение будет незаметно нарушено.
var $target = $({});
console.info($target, $target.length);
// Console output:
// -------------------------------------
// [▼ Object ] 1
// ► __proto__: Object
Единственное, что я предлагаю - выполнить дополнительную проверку {}.
if ($.isEmptyObject(selector) || !$(selector).length) {
throw new Error('Unable to work with the given selector.');
}
Я все еще ищу лучшее решение, так как это немного тяжеловато.
Обновлено: ПРЕДУПРЕЖДЕНИЕ! Это не работает в IE, когда selector является строкой.
$.isEmptyObject('hello') // FALSE in Chrome and TRUE in IE
Как часто вы вызываете $() с пустым объектом в качестве аргумента?
@nnnnnn На самом деле никогда (я больше не использую jQuery). Но я думаю, 3 года назад у меня был случай, когда я раскрыл API, который брал бы селектор и возвращал количество элементов для этого селектора. Если другой разработчик передаст пустой объект, он неправильно ответит 1.
Зачем вам передавать пустой объект {} на $()?
@cpburnz, почему ты меня спрашиваешь? Я был всего лишь поставщиком API ... Люди передают API всякие глупости.
Только что заметил, ветка проблемы jquery, на которую ссылается @FagnerBrack, была обновлена вскоре после его комментария; похоже, что это все-таки никуда не денется.
У меня был случай, когда я хотел увидеть, существует ли объект внутри другого, поэтому я добавил что-то к первому ответу, чтобы проверить наличие селектора внутри селектора ..
// Checks if an object exists.
// Usage:
//
// $(selector).exists()
//
// Or:
//
// $(selector).exists(anotherSelector);
jQuery.fn.exists = function(selector) {
return selector ? this.find(selector).length : this.length;
};
$(selector).length && //Do something
Я ненавижу эти хитрые способы избежать использования if, где if улучшит читаемость за счет 2 байтов.
Кроме того, минификаторы сделают все эти && за вас.
Ха-ха, 8 лет спустя, это так часто встречается в React JS ?
Я использую это:
$.fn.ifExists = function(fn) {
if (this.length) {
$(fn(this));
}
};
$("#element").ifExists(
function($this){
$this.addClass('someClass').animate({marginTop:20},function(){alert('ok')});
}
);
Выполнять цепочку, только если существует элемент jQuery - http://jsfiddle.net/andres_314/vbNM3/2/
Этот плагин можно использовать в операторе if, например if ($(ele).exist()) { /* DO WORK */ }, или с помощью обратного вызова.
;;(function($) {
if (!$.exist) {
$.extend({
exist: function() {
var ele, cbmExist, cbmNotExist;
if (arguments.length) {
for (x in arguments) {
switch (typeof arguments[x]) {
case 'function':
if (typeof cbmExist == "undefined") cbmExist = arguments[x];
else cbmNotExist = arguments[x];
break;
case 'object':
if (arguments[x] instanceof jQuery) ele = arguments[x];
else {
var obj = arguments[x];
for (y in obj) {
if (typeof obj[y] == 'function') {
if (typeof cbmExist == "undefined") cbmExist = obj[y];
else cbmNotExist = obj[y];
}
if (typeof obj[y] == 'object' && obj[y] instanceof jQuery) ele = obj[y];
if (typeof obj[y] == 'string') ele = $(obj[y]);
}
}
break;
case 'string':
ele = $(arguments[x]);
break;
}
}
}
if (typeof cbmExist == 'function') {
var exist = ele.length > 0 ? true : false;
if (exist) {
return ele.each(function(i) { cbmExist.apply(this, [exist, ele, i]); });
}
else if (typeof cbmNotExist == 'function') {
cbmNotExist.apply(ele, [exist, ele]);
return ele;
}
else {
if (ele.length <= 1) return ele.length > 0 ? true : false;
else return ele.length;
}
}
else {
if (ele.length <= 1) return ele.length > 0 ? true : false;
else return ele.length;
}
return false;
}
});
$.fn.extend({
exist: function() {
var args = [$(this)];
if (arguments.length) for (x in arguments) args.push(arguments[x]);
return $.exist.apply($, args);
}
});
}
})(jQuery);
Вы можете указать один или два обратных вызова. Первый сработает, если элемент существует, второй сработает, если элемент нет существует. Однако, если вы решите передать только одну функцию, она будет срабатывать только тогда, когда элемент существует. Таким образом, цепочка умрет, если выбранный элемент нет существует. Конечно, если он существует, сработает первая функция и цепочка продолжится.
Имейте в виду, что при использовании вариант обратного вызова помогает поддерживать цепочку - элемент возвращается, и вы можете продолжить связывание команд, как с любым другим методом jQuery!
if ($.exist('#eleID')) { /* DO WORK */ } // param as STRING
if ($.exist($('#eleID'))) { /* DO WORK */ } // param as jQuery OBJECT
if ($('#eleID').exist()) { /* DO WORK */ } // enduced on jQuery OBJECT
$.exist('#eleID', function() { // param is STRING && CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element EXIST */
}, function() { // param is STRING && CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element DOES NOT EXIST */
})
$('#eleID').exist(function() { // enduced on jQuery OBJECT with CALLBACK METHOD
/* DO WORK */
/* This will ONLY fire if the element EXIST */
})
$.exist({ // param is OBJECT containing 2 key|value pairs: element = STRING, callback = METHOD
element: '#eleID',
callback: function() {
/* DO WORK */
/* This will ONLY fire if the element EXIST */
}
})
В версии обратного вызова не должен ли обратный вызов Has Items действительно передавать объект в качестве аргумента?
Вы можете использовать это:
jQuery.fn.extend({
exists: function() { return this.length }
});
if ($(selector).exists()){/*do something*/}
$.contains() то, что вы хотите?
jQuery.contains( container, contained )The
$.contains()method returns true if the DOM element provided by the second argument is a descendant of the DOM element provided by the first argument, whether it is a direct child or nested more deeply. Otherwise, it returns false. Only element nodes are supported; if the second argument is a text or comment node,$.contains()will return false.Note: The first argument must be a DOM element, not a jQuery object or plain JavaScript object.
Это не принимает селектор, что означает, что ему придется его выбрать, а это значит, что он может просто проверить результат своего выбора.
Вы можете сэкономить несколько байтов, написав:
if ($(selector)[0]) { ... }
Это работает, потому что каждый объект jQuery также маскируется под массив, поэтому мы можем использовать оператор разыменования массива, чтобы получить первый элемент из множество. Он возвращает undefined, если по указанному индексу нет элемента.
Я пришел сюда, чтобы опубликовать этот точный ответ ... обязательная рабочий пример: jsfiddle.net/jasonwilczak/ekjj80gy/2
@JasonWilczak Не забудьте прокомментировать, почему бы вместо этого: .eq [0] или .first () для ссылки на первый найденный элемент, а не на приведение типа?
Нет, 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'].
Как насчет:
function exists(selector) {
return $(selector).length;
}
if (exists(selector)) {
// do something
}
Он очень минимален и избавляет вас от необходимости каждый раз заключать селектор с $().
Это читается как «если существует вещь» вместо «если вещь существует», как if ($("#thing").exists(){}. Кроме того, это не способ jQuery.
Я наткнулся на этот вопрос и хотел бы поделиться фрагментом кода, который я использую в настоящее время:
$.fn.exists = function(callback) {
var self = this;
var wrapper = (function(){
function notExists () {}
notExists.prototype.otherwise = function(fallback){
if (!self.length) {
fallback.call();
}
};
return new notExists;
})();
if (self.length) {
callback.call();
}
return wrapper;
}
И теперь я могу писать такой код -
$("#elem").exists(function(){
alert ("it exists");
}).otherwise(function(){
alert ("it doesn't exist");
});
Это может показаться большим количеством кода, но когда он написан на CoffeeScript, он довольно мал:
$.fn.exists = (callback) ->
exists = @length
callback.call() if exists
new class
otherwise: (fallback) ->
fallback.call() if not exists
Я считаю, что оригинальный подход OP не только гораздо более минималистичен, но и более элегантен, чем этот. Кажется излишним писать столько кода, когда метод OP короче и не включает обратные вызовы.
Для простых случаев - ты прав. Но для более сложных ситуаций, требующих большого количества кода в обоих случаях, я думаю, что мой подход лучше.
В какой сложной ситуации этот подход был бы лучше простого оператора if / else?
Причина, по которой для всех предыдущих ответов требуется параметр .length, заключается в том, что они в основном используют селектор jquery $(), который имеет querySelectorAll за кулисами (или они используют его напрямую). Этот метод довольно медленный, потому что ему нужно проанализировать все дерево DOM в поисках совпадений все с этим селектором и заполнить ими массив.
Параметр ['length'] не нужен или полезен, и код будет намного быстрее, если вы напрямую используете вместо него document.querySelector(selector), потому что он возвращает первый элемент, которому он соответствует, или null, если он не найден.
function elementIfExists(selector){ //named this way on purpose, see below
return document.querySelector(selector);
}
/* usage: */
var myelement = elementIfExists("#myid") || myfallbackelement;
Однако этот метод оставляет нас с фактическим возвращаемым объектом; что нормально, если он не будет сохраняться как переменная и использоваться повторно (таким образом, сохраняя ссылку, если мы забудем).
var myel=elementIfExists("#myid");
// now we are using a reference to the element which will linger after removal
myel.getParentNode.removeChild(myel);
console.info(elementIfExists("#myid")); /* null */
console.info(myel); /* giant table lingering around detached from document */
myel=null; /* now it can be garbage collected */
В некоторых случаях это может быть желательно. Его можно использовать в цикле for следующим образом:
/* locally scoped myel gets garbage collected even with the break; */
for (var myel; myel = elementIfExist(sel); myel.getParentNode.removeChild(myel))
if (myel == myblacklistedel) break;
Если вам действительно не нужен элемент и вы хотите получить / сохранить только истинное / ложное значение, просто не удвойте его !! Это подходит для развязанной обуви, так зачем же здесь завязывать узел?
function elementExists(selector){
return !!document.querySelector(selector);
}
/* usage: */
var hastables = elementExists("table"); /* will be true or false */
if (hastables){
/* insert css style sheet for our pretty tables */
}
setTimeOut(function (){if (hastables && !elementExists("#mytablecss"))
alert("bad table layouts");},3000);
это очень похоже на все ответы, но почему бы не использовать оператор ! дважды, чтобы получить логическое значение:
jQuery.fn.exists = function(){return !!this.length};
if ($(selector).exists()) {
// the element exists, now what?...
}
Потому что Boolean(x) может быть более эффективным иногда.
Вы можете проверить, присутствует ли элемент или нет, используя длину в java-скрипте. Если длина больше нуля, то элемент присутствует, если длина равна нулю, то элемент отсутствует
// These by Id
if ($("#elementid").length > 0) {
// Element is Present
} else {
// Element is not Present
}
// These by Class
if ($(".elementClass").length > 0) {
// Element is Present
} else {
// Element is not Present
}
Вам не нужно проверять, что длина weather больше 0, если ($ ('# elementid'). Length) {} будет достаточно.
Вы действительно прочитали вопрос? Это точно такой же метод, который использует OP.
Попробуйте протестировать элемент DOM
if (!!$(selector)[0]) // do stuff
Вдохновленный привет ответ, я придумал следующее:
$.fn.exists = function() {
return $.contains( document.documentElement, this[0] );
}
jQuery.contains берет два элемента DOM и проверяет, содержит ли первый второй.
Использование document.documentElement в качестве первого аргумента соответствует семантике метода exists, когда мы хотим применить его исключительно для проверки существования элемента в текущем документе.
Ниже я собрал фрагмент, который сравнивает jQuery.exists() с подходами $(sel)[0] и $(sel).length, оба из которых возвращают значения truthy для $(4), а $(4).exists() возвращает false. В контексте проверка на существование элемента в DOM кажется, что это желаемый результат.
$.fn.exists = function() {
return $.contains(document.documentElement, this[0]);
}
var testFuncs = [
function(jq) { return !!jq[0]; },
function(jq) { return !!jq.length; },
function(jq) { return jq.exists(); },
];
var inputs = [
["$()",$()],
["$(4)",$(4)],
["$('#idoexist')",$('#idoexist')],
["$('#idontexist')",$('#idontexist')]
];
for( var i = 0, l = inputs.length, tr, input; i < l; i++ ) {
input = inputs[i][1];
tr = "<tr><td>" + inputs[i][0] + "</td><td>"
+ testFuncs[0](input) + "</td><td>"
+ testFuncs[1](input) + "</td><td>"
+ testFuncs[2](input) + "</td></tr>";
$("table").append(tr);
}td { border: 1px solid black }<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "idoexist">#idoexist</div>
<table style>
<tr>
<td>Input</td><td>!!$(sel)[0]</td><td>!!$(sel).length</td><td>$(sel).exists()</td>
</tr>
</table>
<script>
$.fn.exists = function() {
return $.contains(document.documentElement, this[0]);
}
</script>Вот мой любимый метод exist в jQuery
$.fn.exist = function(callback) {
return $(this).each(function () {
var target = $(this);
if (this.length > 0 && typeof callback === 'function') {
callback.call(target);
}
});
};
и другая версия, которая поддерживает обратный вызов, когда селектор не существует
$.fn.exist = function(onExist, onNotExist) {
return $(this).each(function() {
var target = $(this);
if (this.length > 0) {
if (typeof onExist === 'function') {
onExist.call(target);
}
} else {
if (typeof onNotExist === 'function') {
onNotExist.call(target);
}
}
});
};
Пример:
$('#foo .bar').exist(
function () {
// Stuff when '#foo .bar' exists
},
function () {
// Stuff when '#foo .bar' does not exist
}
);
$("selector") возвращает объект со свойством length. Если селектор найдет какие-либо элементы, они будут включены в объект. Поэтому, если вы проверите его длину, вы увидите, существуют ли какие-либо элементы. В JavaScript 0 == false, поэтому, если вы не получите 0, ваш код будет работать.
if ($("selector").length){
//code in the case
}
«дать массив» - нет. Он дает вам объект jQuery (который разделяет некоторые свойства с массивом). Ваш ответ по сути такой же, как и у Тима Бете из 2009 года.
Мне просто нравится использовать для этого простой ванильный javascript.
function isExists(selector){
return document.querySelectorAll(selector).length>0;
}
Да Лучший способ сделать это:
По JQuery:
if ($("selector").length){
//code in the case
}
selector может быть ElementID ИЛИ ElementClass
ИЛИ ЖЕ
Если вы не хотите использовать библиотеку jQuery, вы можете добиться этого с помощью Core JavaScript:
По JavaScript:
if (document.getElementById("ElementID")) {
//Do something...
}
если «ElementID» не существует, тогда он не выдаст ошибку в условии if?
Вот полный пример различных ситуаций и способ проверить, существует ли элемент с помощью прямого выбора, если селектор jQuery может работать или не работать, потому что он возвращает массив или элементы.
var a = null;
var b = []
var c = undefined ;
if (a) { console.info(" a exist")} else { console.info("a doesn't exit")}
// output: a doesn't exit
if (b) { console.info(" b exist")} else { console.info("b doesn't exit")}
// output: b exist
if (c) { console.info(" c exist")} else { console.info("c doesn't exit")}
// output: c doesn't exit
ОКОНЧАТЕЛЬНОЕ РЕШЕНИЕ
if ($("#xysyxxs").length){ console.info("xusyxxs exist")} else { console.info("xusyxxs doesnn't exist") }
//output : xusyxxs doesnn't exist
if ($(".xysyxxs").length){ console.info("xusyxxs exist")} else { console.info("xusyxxs doesnn't exist") }
//output : xusyxxs doesnn't exist
console.info("existing id", $('#id-1').length)
console.info("non existing id", $('#id-2').length)
console.info("existing class single instance", $('.cls-1').length)
console.info("existing class multiple instance", $('.cls-2').length)
console.info("non existing class", $('.cls-3').length)<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "id-1">
<div class = "cls-1 cls-2"></div>
<div class = "cls-2"></div>
</div>Вы можете попробовать $ ("# xysyxxs") в своем отладчике, и вы увидите, что jquery не возвращает null или undefined. Таким образом, окончательное решение не сработает
Используйте следующий синтаксис, чтобы проверить, действительно ли элемент существует, с помощью jQuery.
let oElement = $(".myElementClass");
if (oElement[0]) {
// Do some jQuery operation here using oElement
}
else {
// Unable to fetch the object
}
Нет необходимости в jQuery (базовое решение)
if (document.querySelector('.a-class')) {
// do something
}
Гораздо более производительный вариант ниже (обратите внимание на отсутствие точки перед классом а).
if (document.getElementsByClassName('a-class')[0]) {
// do something
}
querySelector использует надлежащий механизм сопоставления, такой как $ () (sizzle) в jQuery, и использует большую вычислительную мощность, но в 99% случаев подойдет. Второй вариант более явный и точно указывает коду, что делать. Это намного быстрее согласно jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25
Проверка на наличие элемента аккуратно задокументирован на самом официальном сайте jQuery!
Use the .length property of the jQuery collection returned by your selector:
if ($("#myDiv").length) { $("#myDiv").show(); }Note that it isn't always necessary to test whether an element exists. The following code will show the element if it exists, and do nothing (with no errors) if it does not:
$("#myDiv").show();
Я вижу, что большинство ответов здесь - это не точный, как и должно быть, они проверяют длину элемента, во многих случаях это может быть Ok, но не 100%, представьте, если вместо этого число передается в функцию, поэтому я прототипирую функцию, которая проверяет все условия и возвращает ответ как и должно быть:
$.fn.exists = $.fn.exists || function() {
return !!(this.length && (this[0] instanceof HTMLDocument || this[0] instanceof HTMLElement));
}
Это проверит как длину, так и тип. Теперь вы можете проверить это следующим образом:
$(1980).exists(); //return false
$([1,2,3]).exists(); //return false
$({name: 'stackoverflow', url: 'http://www.stackoverflow.com'}).exists(); //return false
$([{nodeName: 'foo'}]).exists() // returns false
$('div').exists(); //return true
$('.header').exists(); //return true
$(document).exists(); //return true
$('body').exists(); //return true
Вам не нужно проверять, превышает ли он 0, например $(selector).length > 0, $(selector).length, этого достаточно, и это элегантный способ проверить наличие элементов. Не думаю, что стоит писать функцию только для этого, если вы хотите делать больше лишних вещей, то да.
if ($(selector).length){
// true if length is not 0
} else {
// false if length is 0
}
Простая служебная функция как для идентификатора, так и для селектора класса.
function exist(IdOrClassName, IsId) {
var elementExit = false;
if (IsId) {
elementExit = $("#" + "" + IdOrClassName + "").length ? true : false;
} else {
elementExit = $("." + "" + IdOrClassName + "").length ? true : false;
}
return elementExit;
}
вызов этой функции, как показано ниже
$(document).ready(function() {
$("#btnCheck").click(function() {
//address is the id so IsId is true. if address is class then need to set IsId false
if (exist("address", true)) {
alert("exist");
} else {
alert("not exist");
}
});
});
Таким образом вы поместите его в глобальное пространство имен. Что вы, возможно, захотите пересмотреть.
Все ответы: нет работает пуленепробиваемый, чтобы проверить наличие элемента в jQuery. После многих лет кодирования только это решение не выдает никаких предупреждений о существовании или отсутствии:
if ($(selector).get(0)) { // Do stuff }
Или вместо этого внести залог в начале вашей функции:
if (!$(selector).get(0)) return;
Объяснил
В этом случае вам не придется иметь дело с нулем | проблемы с нулевой длиной. Это заставляет извлекать элемент, а не считать их.
Вход не будет иметь значения, если он не существует. Попробуй это...
if ($(selector).val())
Попробуй это.
просто и короткая и можно использовать во всем проекте:
jQuery.fn.exists=function(){return !!this[0];}; //jQuery Plugin
Использование:
console.info($("element-selector").exists());
_________________________________
ИЛИ ДАЖЕ КОРОЧЕ: (когда вы не хотите определять плагин jQuery):
if (!!$("elem-selector")[0]) ...;
или даже
if ($("elem-selector")[0]) ...;
Используйте querySelectorAll с forEach, нет необходимости в if и дополнительном назначении:
document.querySelectorAll('.my-element').forEach((element) => {
element.classList.add('new-class');
});
как противоположность:
const myElement = document.querySelector('.my-element');
if (myElement) {
element.classList.add('new-class');
}
Я использую это:
if ($("#element").length > 0){
//the element exists in the page, you can do the rest....
}
Найти элемент очень просто и легко.
Ваш ответ не добавляет новой информации к тому, что уже было опубликовано. Это просто подмножество информации в принятый ответ.
Просто проверьте длину селектора, если она больше 0, то она вернет true, в противном случае - false.
Для ID:
if ( $('#selector').length ) // use this if you are using id to check
{
// it exists
}
Для класса:
if ( $('.selector').length ) // use this if you are using class to check
{
// it exists
}
Для раскрывающегося списка:
if ( $('#selector option').size() ) { // use this if you are using dropdown size to check
// it exists
}
С jQuery вам не нужен >0, это все, что вам нужно:
if ($(selector).length)
С vanilla JS вы можете сделать то же самое с:
if (document.querySelector(selector))
Если вы хотите превратить его в функцию, возвращающую bool:
const exists = selector => !!document.querySelector(selector);
if (exists(selector)){
// some code
}
По умолчанию - Нет.
Есть свойство length, которое обычно используется для того же результата следующим образом:
if ($(selector).length)
Здесь «селектор» должен быть заменен фактическим селектором, который вас интересует, существует он или нет. Если он существует, свойство length выведет целое число больше 0, и, следовательно, оператор if станет истинным и, следовательно, выполнит блок if. Если этого не произойдет, будет выведено целое число «0», и, следовательно, блок if не будет выполнен.
конечно, есть и другие элегантные способы получить тот же результат, но это один из самых простых и эффективных
Выяснил, что это самый способ jQuery, ИМХО. Расширение функции по умолчанию легко и может быть выполнено в глобальном файле расширения.
$.fn.exist = function(){
return !!this.length;
};
console.info($("#yes").exist())
console.info($("#no").exist())<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "yes">id = yes</div>Есть странность, известная как кондиционирование при коротком замыкании. Не многие заявляют об этой функции, поэтому позвольте мне объяснить!
//you can check if it isnt defined or if its falsy by using OR
console.info( $(selector) || 'this value doesnt exist' )
//or run the selector if its true, and ONLY true
console.info( $(selector) && 'this selector is defined, now lemme do somethin!' )
//sometimes I do the following, and see how similar it is to SWITCH
console.info(
({ //return something only if its in the method name
'string':'THIS is a string',
'function':'THIS is a function',
'number':'THIS is a number',
'boolean':'THIS is a boolean'
})[typeof $(selector)]||
//skips to this value if object above is undefined
'typeof THIS is not defined in your search')
Последний бит позволяет мне видеть, какой тип ввода имеет мой typeof и работает в этом списке. Если есть значение вне моего списка, я использую оператор OR (||) для пропуска и обнуления. Он имеет ту же производительность, что и Switch Case, и считается несколько лаконичным. Тестирование выполнения условных выражений и использования логических операторов.
Боковое примечание: объект-функция вроде как должна быть переписана>.
Я просто пишу: if ($ (selector) .length) {...} без '> 0'