Как проверить, соответствует ли селектор чему-либо в jQuery? [Дубликат]

361

В Mootools я просто запустил if ($('target')) { ... }. Работает ли if ($('#target')) { ... } в jQuery одинаково?

Теги:
jquery-selectors

11 ответов

662
Лучший ответ

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

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

Если вы абсолютно должны иметь функцию exists(), которая будет медленнее, вы можете сделать:

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

Затем в вашем коде вы можете использовать

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

Как ответил here

  • 1
    какой смысл в этом, когда .length делает то же самое?
  • 7
    Это один из самых глупых плагинов, которые я когда-либо видел ...
Показать ещё 12 комментариев
70

нет, jquery всегда возвращает объект jquery независимо от того, был ли выбран селектор или нет. Вам нужно использовать .length

if ( $('#someDiv').length ){

}
  • 0
    Это более практично, чем второе предложение принятого ответа. (Зачем вы предлагаете более медленную и длинную альтернативу простой проверке длины!). Также отмечу, что ваш ответ был ранее +1 :)
19

если вы использовали:

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

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

Это было бы лучше

jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }
  • 1
    Не могли бы вы привести пример, в котором цепочка невозможна?
  • 0
    @TomasM: Ну, .exist() возвращает bool, для которого нельзя вызывать методы jQuery, см. Комментарии ниже этого ответа .
15

Еще один способ:

$('#elem').each(function(){
  // do stuff
});
  • 3
    Хороший, более чистый подход, если вы не хотите делать ничего особенного, если #elem не существует.
  • 0
    Поскольку идентификатор может существовать только один раз, а JS и jQuery игнорируют его дубликаты, это может привести к путанице, если вы не объясните, что это 0 или 1 ситуация :)
Показать ещё 1 комментарий
14

Я думаю, что большинство людей, отвечающих здесь, не совсем поняли вопрос, иначе я ошибаюсь.

Вопрос заключается в том, "как проверить, существует ли селектор в jQuery".

Большинство людей приняли это за "как проверить, существует ли элемент в DOM с помощью jQuery". Вряд ли взаимозаменяемый.

jQuery позволяет создавать пользовательские селектора, но смотрите здесь, что происходит, когда вы пытаетесь использовать на e перед его инициализацией;

$(':YEAH');
"Syntax error, unrecognized expression: YEAH"

После этого я понял, что это просто проверка

if ($.expr[':']['YEAH']) {
    // Query for your :YEAH selector with ease of mind.
}

Приветствия.

  • 2
    Примечание: вопрос был изменен, чтобы означать, что они намеревались после того, как это было опубликовано, поэтому этот ответ больше не имеет значения здесь :)
12
if ($('#elem')[0]) {
  // do stuff
}
  • 0
    Мне нравится это для краткости. Кто-нибудь может сказать, будет ли он работать везде. Длина будет работать?
  • 0
    Единственный случай, которого не было бы, - это если бы jQuery давал вам массив с, например, нулевым (или иначе «ложным») содержимым вместо объектов элемента DOM, что было бы удивительно.
3

В качестве альтернативы:

if( jQuery('#elem').get(0) ) {}
  • 0
    Это не короче. .length (и медленнее). $('#elem')[0] сделает то же самое.
1
jQuery.fn.exists = function(selector, callback) {
    var $this = $(this);
    $this.each(function() {
        callback.call(this, ($(this).find(selector).length > 0));
    });
};
  • 0
    Зачем вам когда-либо делать each и обратный вызов, если вы просто хотите знать, было ли совпадение ноль или более? Теперь я чувствую себя более глупо, чем прежде, чем я прочитал это! -1.
1

Я предпочитаю

    if (jQuery("#anyElement").is("*")){...}

Что в основном проверяет, являются ли эти элементы своего рода "*" (любой элемент). Просто более чистый синтаксис и "есть" имеет больше смысла внутри "if"

  • 3
    звучит как много усилий, по сравнению с просто чтением существующего свойства
  • 0
    Это значительно медленнее, чем альтернативы, и, возможно, менее читабельно. Вы не будете вводить разбор для проверки длины массива, а объект jQuery ведет себя так же, как массив.
-2

Для меня .exists не работает, поэтому я использую индекс:

if ($("#elem").index() ! = -1) {}
  • 5
    Вы должны создать функцию существующие ()
  • 1
    Это длиннее и медленнее, чем использование .length . Этот ответ лучше всего удалить (голосование за удаление).
-5

сначала создайте функцию:

$.fn.is_exists = function(){ return document.getElementById(selector) }

затем

if($(selector).is_exists()){ ... }
  • 3
    Это предполагает, что селектор был идентификатором, а не селектором jQuery, как требуется. Лучше всего удалить этот ответ, поскольку он вводит в заблуждение. -1 и голосование за удаление

Ещё вопросы

Сообщество Overcoder
Наверх
Меню