Есть ли функция "существует" для jQuery?

Как я могу проверить наличие элемента в jQuery?

Текущий код, который у меня есть, таков:

if ($(selector).length > 0) {
    // Do something
}

Есть ли более элегантный способ подойти к этому? Возможно, плагин или функция?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2 883
0
791 723
44
Перейти к ответу Данный вопрос помечен как решенный

Ответы 44

Да!

jQuery.fn.exists = function(){ return this.length > 0; }

if ($(selector).exists()) {
    // Do something
}

Это ответ на: Подкаст Herding Code с Джеффом Этвудом

Я просто пишу: if ($ (selector) .length) {...} без '> 0'

vsync 24.11.2009 12:22

Ваш пример $.fn.exists заменяет поиск свойств (дешево!) Двумя вызовами функций, которые намного дороже, и один из этих вызовов функций воссоздает объект jQuery, который у вас уже есть, что просто глупо.

C Snover 30.05.2010 08:14

@redsquare: удобочитаемость кода - лучшее объяснение для добавления такой функции в jQuery. Если что-то под названием .exists читается чисто, тогда как .length читается как нечто семантически иное, даже если семантика совпадает с идентичным результатом.

Ben Zotto 03.08.2010 00:52

@quixoto, извините, но .length - это стандарт для многих языков, который не нуждается в переносе. Как еще вы интерпретируете .length?

redsquare 03.08.2010 04:13

На мой взгляд, это по крайней мере одно логическое косвенное указание от концепции «длина списка больше нуля» к концепции «элемента (ов), для которого я написал селектор». Да, технически это одно и то же, но концептуальная абстракция находится на другом уровне. Это заставляет некоторых людей предпочесть более явный индикатор, даже за счет некоторой потери производительности.

Ben Zotto 03.08.2010 04:29

Какой ужасный ответ. Что, если селектор соответствует сотням узлов и первому exists? Он должен немедленно вернуться в исходное состояние. Нет смысла возиться с остальным. пример: if ( $('div.tag:contains("nsfw")').exist() ) agecheck(); на имиджборде или что-то в этом роде

KitsuneYMG 05.03.2014 23:27

«Некоторые люди, столкнувшись с проблемой, думают:« Я знаю, я расширю базовую библиотеку ». Теперь у них две проблемы ». После того, как вы определили эту функцию и начнете использовать .exists() повсюду, весь этот код станет непереносимым из-за отсутствия такого определения функции. Похоже, это снизит ремонтопригодность.

cowbert 01.06.2015 12:06

Отличный ответ ... но попробуйте любое число, например: $ (666) .exists () // результат верный (неверный)

earnaz 16.09.2015 19:19

Коллекция jQuery будет «существовать» независимо от того, пуста она или нет. Вы не почувствуете необходимости в Array.prototype.exists = function() {return this.length;} для удобочитаемости кода.

AndFisher 24.08.2017 14:39

Вы можете использовать:

if ($(selector).is('*')) {
  // Do something
}

Возможно, маленький более элегантен.

Это слишком много для такой простой вещи. см. ответ Тима Бюта

vsync 24.11.2009 12:28

Это правильный ответ. Проблема метода length заключается в том, что он дает ложное срабатывание с любым числом, например: $ (666) .length // возвращает 1, но это недопустимый селектор

earnaz 16.09.2015 19:23

Это очень дорого для очень простой задачи. Просто посмотрите на реализацию jquery if .is (), и вы увидите, сколько кода нужно обработать, чтобы ответить вам на этот простой вопрос. Также не очевидно, что именно вы хотите сделать, поэтому оно такое же или, возможно, менее элегантное, чем рассматриваемое решение.

micropro.cz 22.02.2016 22:59

@earnaz отличный момент, хороший улов. Однако я не понимаю, где это действительно стоящее беспокойство. Разработчики, идентифицирующие элементы с помощью 666, вероятно, имеют множество других причин, по которым их код не работает. Хотя это недопустимый селектор, $ (666) .length действительный javascript: он оценивается как истинный, и, следовательно, должен удовлетворяет условию.

Todd 08.03.2016 15:55

@earnaz, чтобы избежать этого конкретного случая, $.find(666).length работает.

Emile Bergeron 08.10.2016 03:41

Если вы использовали

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 ") читается как" если существуетэлементы ".

strager 14.01.2009 23:00

правда, но опять же, вы подразумеваете, что цепочка возможна, и если бы я попытался сделать что-то вроде $ (selector) .exists (). css ("color", "red"), это не сработало бы, и тогда я был бы = * (

Jon Erickson 15.01.2009 03:31

Уже есть методы, которые нельзя объединять в цепочку, например функции attr и data. Я все же понимаю вашу точку зрения и, чего бы это ни стоило, я в любом случае просто проверяю длину> 0.

Matthew Crumley 16.01.2009 08:42

Зачем вам это нужно связывать? $(".missing").css("color", "red") уже делает правильные вещи… (т.е. ничего)

Ben Blank 08.09.2010 10:43

Первый пример ($ ('. MySelector'). Length) работает нормально, нет необходимости создавать для него оболочку exists ().

nickb 14.09.2010 23:16

2-е изменение .... if ($ ('# myDiv') [0]) {..... неопределенный индекс 0. Вы не должны сравнивать результат напрямую, так как результата НЕТ. Вместо этого вам следует .... if (typeof $ ('# myDiv') [0]! = 'Undefined') ...

Christian 17.09.2010 11:18

Материал о цепочке - полная чушь - есть множество методов jQuery $.fn, которые возвращают что-то отличное от нового объекта jQuery и, следовательно, не связываются.

Alnitak 18.07.2014 12:12

$("<div></div>").length > 0 вернет true, создавая впечатление, что используемый селектор существует, но на самом деле это просто допустимая строка HTML. Чтобы этого избежать, $.find(selector).length > 0 выдает ошибку при недопустимом выражении селектора.

Emile Bergeron 08.10.2016 03:48

if ( $('#myDiv').size() > 0 ) { //do something }

size() подсчитывает количество элементов, возвращаемых селектором

@Furbeenator Я не знаю, откуда вы берете информацию, но .size() ничего не делает, кроме как возвращает .length. Есть причина, по которой он устарел

Ian 04.06.2013 01:41

Вы правы, но вызов .length как свойства требует немного меньше накладных расходов, чем вызов функции .size(). Виноват.

Furbeenator 05.06.2013 22:30
Ответ принят как подходящий

В JavaScript все «правдиво» или «ложно», и для чисел 0 означает false, все остальное true. Итак, вы могли написать:

if ($(selector).length)

Вам не нужна эта деталь >0.

@ abhirathore2006 Если вы используете селектор идентификатора, а элемент не существует, длина равна 0 и не вызывает исключений.

Robert 29.06.2017 23:35

Достаточно интересно NaN != false.

Robert 29.06.2017 23:52

@ Джеймс Это потому, что [].toString() === [].join(',') === "" и "" === "".

Ismael Miguel 09.07.2017 01:09

[].toString() == "" верен, [].join(',') == "" также верен, [].toString() == [].join(',') снова верен, [].toString() == "" && [].join(',') == "" все еще верен, но [].toString() == [].join(',') == "" неверен ... Я действительно не понимаю, почему последний неверен, когда все предыдущие верны.

debute 09.08.2017 16:54

@debute последний, вероятно, сравнивает true (логический результат первого ==) с "", который является false. То есть: [].toString() == [].join(',') == "" -> true == "" -> false

Sebastianb 25.08.2017 17:46

@ Роберт и typeof NaN == 'number'

oriadam 31.01.2018 14:06

Есть ли ощутимая польза от отказа от > 0? Мне так кажется более ясным.

Sinjai 14.02.2018 08:09

@Sinjai, как только вы немного привыкнете к программированию, вы спросите себя, есть ли ощутимая польза от включения> 0. Потому что без него это очень понятно и полностью законно.

jox 08.11.2020 19:15

@jox Я родом из страны относительного здравомыслия (не JavaScriptLand), где мы по-прежнему ценим семантику. Проверка существования элемента - это не то же самое, что проверка наличия у элемента длины, отличной от проверки того, что длина больше 0. JS может сохранять свои хаки. Дорогостоящая часть - это поддержание кода, а не его написание.

Sinjai 09.11.2020 21:13

@Sinjai Я тоже не из JavaScriptLand. :-) Но мне довелось путешествовать по нему. Я довольно много путешествовал по Вселенной. Спросить не-логическое значение правдиво или ложно - распространенная идиома, которая используется не только в JavaScriptLand. Даже в C вы можете (и с радостью делаете (ну, может быть, не вы ;-))) спрашивать целые числа, если они не равны нулю без какого-либо оператора (например, if (x) {}). И обычно другие вещи затрудняют сопровождение кода. Без обид, все хорошо. У каждого свои предпочтения.

jox 10.11.2020 03:45

@jox Вы правы, здесь виновата концепция правды / лжи. Полагаю, мое отвращение действительно к этому. Но, учитывая тот факт, что это действительно так, я стараюсь быть максимально ясным. Я понимаю, что индустрия в целом может со мной не согласиться, хотя это вызывает у меня слезы.

Sinjai 12.11.2020 19:24

Разве $(selector).first().length не был бы немного эффективнее? В противном случае, если совпадений много, jQuery создаст объект, содержащий все совпадения, даже если нам нужен только один или ни одного.

Cerin 18.11.2020 03:31

@Cerin хм, я бы подумал, что объект создается при выполнении $(...). Только после этого вы проверяете либо свойство длины, либо вызываете .first(), чтобы он не останавливал фактический поиск после первого, верно?

Tim Büthe 18.11.2020 10:46

@ TimBüthe Это хороший аргумент. Тогда, возможно, лучше было бы включить first в сам селектор? Нравится $('<selector>:first').length?

Cerin 18.11.2020 15:50

Вы можете использовать это:

// if element exists
if ($('selector').length){ /* do something */ }

// if element does not exist
if (!$('selector').length){ /* do something */ }

Разве вы не видели, что Тим Бют уже дал этот отвечать за 2 года до вас?

Th4t Guy 31.07.2014 21:28

Пффф, Тим никогда не показывал, как проверить, не существует ли элемента.

Jeremy W 05.08.2015 18:03

этот ответ и комментарии суммируют, как работает stackoverflow

aswzen 03.04.2018 11:48

На самом деле нет необходимости в jQuery. С обычным JavaScript проще и семантически правильно проверить:

if (document.getElementById("myElement")) {
    //Do something...
}

Если по какой-либо причине вы не хотите указывать идентификатор для элемента, вы все равно можете использовать любой другой метод JavaScript, предназначенный для доступа к DOM.

jQuery действительно крутой, но не позволяйте чистому JavaScript уйти в небытие ...

Я знаю: он не отвечает напрямую на исходный вопрос (который запрашивает функцию jquery), но в этом случае ответ будет «Нет» или «семантически неправильное решение».

amypellegrini 14.11.2011 18:24

Самый быстрый и семантически самообъясняющий способ проверки существования на самом деле - использовать простой 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 не может приблизиться к этому.

kikito 07.03.2012 20:30

Вы правы в том, что он не так широко применим, как селекторы. Однако в наиболее частом случае он выполняет свою работу достаточно хорошо (проверяя, существует ли единственный элемент). Аргументы в пользу самообъяснения и скорости остаются в силе.

Magne 10.05.2012 12:55

Хотя я предпочитаю метод JQuery, мне всегда нравится видеть исходный необработанный метод работы! Дает больше понимания, когда вы видите, что JQuery что-то делает.

PerryCS 10.02.2013 07:04

Может быть, что-то вроде if ('#foo a.special')[0]), если вы все еще хотите использовать селекторы jQuery? Хотя, я полагаю, это противоречит цели.

Noz 28.05.2013 00:21

Даже когда вы это писали в 2012 году, аргументы скорости не стоял из-за изменения стандарты технологии. Аргумент скорость в движках JavaScript мертв уже много лет.

SpYk3HH 02.10.2013 21:26

@Noz if (document.querySelector("#foo a.special")) подойдет. Не требуется jQuery.

Blue Skies 08.12.2013 04:43

Аргумент скорости в движках JS мертв только в сознании людей, которые не могут работать без jQuery, поскольку это аргумент, который они не могут выиграть.

Blue Skies 08.12.2013 04:45

Помните старые добрые времена, когда у нас было все, что у нас было document.getElementById? И я всегда забывал документ. и не мог понять, почему это не сработало. И я всегда писал неправильно и неправильно использовал регистр символов.

JustJohn 19.11.2014 00:05

Я бы бросил писать JavaScript, если бы мне пришлось: 1) работать без консоли отладки или 2) работать с getElementById.

AGamePlayer 05.03.2016 06:33

Очевидно, что ванильные методы JS работают быстрее, но обратите внимание, что в вопросе не указан выбор по идентификатору элемента, поэтому на самом деле вам нужен document.querySelector(), и даже он не может обрабатывать все селекторы, которые может jQuery. Таким образом, при вызове единственной собственной JS-функции для этой цели - хороший, в некоторых случаях вам придется писать дополнительный код. (Кроме того, if ($(selector).length) не требует пояснений - я действительно не думаю, что это могло бы сбить с толку кого-либо с опытом работы с JS.)

nnnnnn 08.07.2016 06:31

Удачи в тестировании :visible или любого другого пользовательского селектора jquery.

eithed 23.08.2016 18:59

Я счел 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 22.12.2014 14:24

@nnnnnn На самом деле никогда (я больше не использую jQuery). Но я думаю, 3 года назад у меня был случай, когда я раскрыл API, который брал бы селектор и возвращал количество элементов для этого селектора. Если другой разработчик передаст пустой объект, он неправильно ответит 1.

Oleg 22.12.2014 18:03

Зачем вам передавать пустой объект {} на $()?

All Workers Are Essential 26.03.2015 18:46

@cpburnz, почему ты меня спрашиваешь? Я был всего лишь поставщиком API ... Люди передают API всякие глупости.

Oleg 26.03.2015 18:48

Только что заметил, ветка проблемы jquery, на которую ссылается @FagnerBrack, была обновлена ​​вскоре после его комментария; похоже, что это все-таки никуда не денется.

Joseph Gabriel 19.04.2016 00:09

У меня был случай, когда я хотел увидеть, существует ли объект внутри другого, поэтому я добавил что-то к первому ответу, чтобы проверить наличие селектора внутри селектора ..

// 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 байтов.

Emile Bergeron 08.10.2016 03:35

Кроме того, минификаторы сделают все эти && за вас.

user7892745 23.05.2017 00:46

Ха-ха, 8 лет спустя, это так часто встречается в React JS ?

Tilak Maddy 12.07.2020 15:53

Я использую это:

    $.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);

jsFiddle

Вы можете указать один или два обратных вызова. Первый сработает, если элемент существует, второй сработает, если элемент нет существует. Однако, если вы решите передать только одну функцию, она будет срабатывать только тогда, когда элемент существует. Таким образом, цепочка умрет, если выбранный элемент нет существует. Конечно, если он существует, сработает первая функция и цепочка продолжится.

Имейте в виду, что при использовании вариант обратного вызова помогает поддерживать цепочку - элемент возвращается, и вы можете продолжить связывание команд, как с любым другим методом 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 действительно передавать объект в качестве аргумента?

Chris Marisic 16.06.2016 20:46

Вы можете использовать это:

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.

Это не принимает селектор, что означает, что ему придется его выбрать, а это значит, что он может просто проверить результат своего выбора.

user1106925 04.06.2016 16:28

Вы можете сэкономить несколько байтов, написав:

if ($(selector)[0]) { ... }

Это работает, потому что каждый объект jQuery также маскируется под массив, поэтому мы можем использовать оператор разыменования массива, чтобы получить первый элемент из множество. Он возвращает undefined, если по указанному индексу нет элемента.

Я пришел сюда, чтобы опубликовать этот точный ответ ... обязательная рабочий пример: jsfiddle.net/jasonwilczak/ekjj80gy/2

JasonWilczak 25.03.2015 18:08

@JasonWilczak Не забудьте прокомментировать, почему бы вместо этого: .eq [0] или .first () для ссылки на первый найденный элемент, а не на приведение типа?

Jean Paul A.K.A el_vete 21.07.2015 16:51

Нет, jQuery.first() или jQuery.eq(0) оба возвращают объекты, объекты правдивы, даже если они пустые. Этот пример должен проиллюстрировать, почему эти функции нельзя использовать как есть: if (jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")

Salman A 21.07.2015 18:16

Правильный. .eq(0) возвращает просто еще один объект jQuery, усеченный до длины 1 или 0. .first() - это просто удобный метод для .eq(0). Но .get(0) возвращает первый элемент DOM или undefined и совпадает с [0]. Первый элемент DOM в объекте jQuery хранится в свойстве обычного объекта с именем '0'. Это простой доступ к собственности. Единственное приведение типа происходит из неявного преобразования числа 0 в строку '0'. Поэтому, если приведение типа является проблемой, вы можете вместо этого использовать $.find(selector)['0'].

Robert 29.06.2017 23:20

Как насчет:

function exists(selector) {
    return $(selector).length;
}

if (exists(selector)) {
    // do something
}

Он очень минимален и избавляет вас от необходимости каждый раз заключать селектор с $().

Это читается как «если существует вещь» вместо «если вещь существует», как if ($("#thing").exists(){}. Кроме того, это не способ jQuery.

1j01 22.06.2015 00:48

Я наткнулся на этот вопрос и хотел бы поделиться фрагментом кода, который я использую в настоящее время:

$.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 короче и не включает обратные вызовы.

Lev 05.08.2014 11:31

Для простых случаев - ты прав. Но для более сложных ситуаций, требующих большого количества кода в обоих случаях, я думаю, что мой подход лучше.

Eternal1 05.08.2014 11:38

В какой сложной ситуации этот подход был бы лучше простого оператора if / else?

Jarvl 24.06.2016 21:55

Причина, по которой для всех предыдущих ответов требуется параметр .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) может быть более эффективным иногда.

user7892745 23.05.2017 00:47

Вы можете проверить, присутствует ли элемент или нет, используя длину в 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) {} будет достаточно.

Pranav Labhe 22.08.2015 14:22

Вы действительно прочитали вопрос? Это точно такой же метод, который использует OP.

A1rPun 16.03.2016 19:01

Попробуйте протестировать элемент 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 года.

Quentin 27.04.2016 15:33

Мне просто нравится использовать для этого простой ванильный 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?

Star 10.08.2017 16:20

Вот полный пример различных ситуаций и способ проверить, существует ли элемент с помощью прямого выбора, если селектор 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. Таким образом, окончательное решение не сработает

Béranger 09.09.2016 15:27

Используйте следующий синтаксис, чтобы проверить, действительно ли элемент существует, с помощью 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");
    }
  });
});

Таким образом вы поместите его в глобальное пространство имен. Что вы, возможно, захотите пересмотреть.

Roland 14.11.2017 11:46

Все ответы: нет работает пуленепробиваемый, чтобы проверить наличие элемента в 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....
 }

Найти элемент очень просто и легко.

Ваш ответ не добавляет новой информации к тому, что уже было опубликовано. Это просто подмножество информации в принятый ответ.

faintsignal 12.01.2019 02:07

Просто проверьте длину селектора, если она больше 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 не будет выполнен.

конечно, есть и другие элегантные способы получить тот же результат, но это один из самых простых и эффективных

Amit Sharma 11.03.2020 08:09

Выяснил, что это самый способ 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, и считается несколько лаконичным. Тестирование выполнения условных выражений и использования логических операторов.

Боковое примечание: объект-функция вроде как должна быть переписана>.

Ресурсы: Логическое И (с оценкой короткого замыкания)

Другие вопросы по теме