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

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

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

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

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

2444
задан Jake McGraw 27 авг. '08 в 22:49
источник поделиться
38 ответов
  • 1
  • 2

В JavaScript все "правдивое" или "ложное", а для чисел 0 (и NaN) означает false, все остальное true. Поэтому вы можете написать:

if ($(selector).length)

Вам не нужна эта часть >0.

2175
ответ дан Tim Büthe 25 февр. '09 в 22:16
источник поделиться

Да!

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

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

Это в ответ на: подкаст под патрон с Джеффом Этвудом

1281
ответ дан Jake McGraw 27 авг. '08 в 22:50
источник поделиться

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

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

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

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

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

В качестве альтернативы из часто задаваемых вопросов:

if ( $('#myDiv').length ) { /* Do something */ }

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

if ( $('#myDiv')[0] ) { /* Do something */ }
340
ответ дан Jon Erickson 14 янв. '09 в 22:46
источник поделиться

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

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

// if element does not exist
if(!$('selector').length){ /* do something */ }
109
ответ дан Yanni 03 апр. '11 в 15:17
источник поделиться

Самый быстрый и наиболее семантически понятный способ проверить существование на самом деле, используя простой JavaScript:

if (document.getElementById('element_id')) {
    // Do something
}

Это немного длиннее, чем альтернатива jQuery length, но выполняется быстрее, так как это собственный метод JS.

И это лучше, чем альтернатива написанию вашей собственной функции jQuery. Эта альтернатива медленнее, по причинам, указанным @snover. Но это также дало бы другим программистам впечатление, что функция exists() - это что-то, что присуще jQuery. JavaScript будет/должен понимать другие, редактирующие ваш код, без увеличения объема долговых обязательств.

Примечание. Обратите внимание на отсутствие "#" перед элементом element_id (так как это простой JS, а не jQuery).

82
ответ дан Magne 11 янв. '12 в 15:27
источник поделиться

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

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

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

58
ответ дан Salman A 18 янв. '14 в 12:04
источник поделиться

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

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

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

53
ответ дан Devon 17 сент. '08 в 20:53
источник поделиться

Этот плагин может использоваться в выражении if вроде if ($(ele).exist()) { /* DO WORK */ } или с использованием обратного вызова.

Plugin

;;(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

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

Имейте в виду, что использование варианта callback помогает поддерживать цепочку - возвращается элемент, и вы можете продолжать команды цепочки, как с любым другим методом 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    */
    }
})
52
ответ дан SpYk3HH 09 нояб. '12 в 20:47
источник поделиться

Я вижу, что большинство ответов здесь не являются точными, как они должны быть, они проверяют длину элемента, во многих случаях это может быть нормально, но не на 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
47
ответ дан Alireza 20 мая '17 в 12:21
источник поделиться

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

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

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

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

46
ответ дан amypellegrini 14 нояб. '11 в 17:20
источник поделиться

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

jQuery.fn.extend({
    exists: function() { return this.length }
});

if($(selector).exists()){/*do something*/}
41
ответ дан Amitābha 01 июня '13 в 10:20
источник поделиться

Причина, по которой все предыдущие ответы требуют параметра .length, состоит в том, что они в основном используют селектор jquery $(), у которого есть запросSelectorAll за шторами (или они используют его напрямую). Этот метод довольно медленный, поскольку ему необходимо проанализировать все дерево DOM, ища соответствия all к этому селектору и заполняя их массивом.

Параметр ['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.log(elementIfExists("#myid")); /* null */
console.log(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);
37
ответ дан technosaurus 12 авг. '14 в 2:42
источник поделиться

Я обнаружил, что if ($(selector).length) {} недостаточно. Он будет отключать ваше приложение, когда selector - пустой объект {}.

var $target = $({});        
console.log($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
32
ответ дан Oleg 06 февр. '12 в 23:37
источник поделиться

Вы можете проверить, что элемент присутствует или не использует длину в java script.  Если длина больше нуля, тогда элемент присутствует, если длина равна нулю, тогда  элемента нет

// 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
}
29
ответ дан Anurag Deokar 09 июля '15 в 15:39
источник поделиться

Является ли $.contains() тем, что вы хотите?

jQuery.contains( container, contained )

Метод $.contains() возвращает true, если элемент DOM, предоставленный вторым аргументом, является потомком элемента DOM, предоставленного первым аргументом, является ли он прямым потомком или вложен более глубоко. В противном случае возвращается false. Поддерживаются только узлы элементов; если второй аргумент является узлом текста или комментария, $.contains() вернет false.

Примечание. Первый аргумент должен быть элементом DOM, а не объектом jQuery или обычным объектом JavaScript.

29
ответ дан hiway 23 окт. '13 в 8:46
источник поделиться
$(selector).length && //Do something
25
ответ дан SJG 28 мая '12 в 15:58
источник поделиться

Проверка наличия элемента запечатлена на официальном сайте jQuery!

Используйте свойство length коллекции jQuery, возвращенной вашим селектор:

if ($("#myDiv").length) {
    $("#myDiv").show();
}

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

$("#myDiv").show();
25
ответ дан Tilak Maddy 22 марта '17 в 17:32
источник поделиться

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

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

if ($(selector).exists()) {
    // the element exists, now what?...
}
24
ответ дан Santiago Hernández 04 мая '15 в 6:31
источник поделиться

Попробуйте выполнить тестирование элемента DOM

if (!!$(selector)[0]) // do stuff
22
ответ дан guest271314 09 авг. '15 в 5:55
источник поделиться

Вдохновленный hiway answer Я придумал следующее:

$.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>
21
ответ дан Oliver 13 окт. '15 в 23:01
источник поделиться

Мне просто нравится использовать простой ванильный javascript для этого.

function isExists(selector){
  return document.querySelectorAll(selector).length>0;
}
19
ответ дан Sanu Uthaiah Bollera 19 июня '16 в 1:37
источник поделиться

Нет необходимости в jQuery

if(document.querySelector('.a-class')) {
  // do something
}
17
ответ дан Pawel 28 нояб. '16 в 13:43
источник поделиться

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

$.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
17
ответ дан Eternal1 28 июля '14 в 13:50
источник поделиться

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

// 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;
};
17
ответ дан jcreamer898 06 апр. '12 в 0:02
источник поделиться

Как насчет:

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

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

Это очень минимально и экономит время, когда вам нужно каждый раз заключать селектор $().

16
ответ дан GSTAR 05 марта '14 в 0:15
источник поделиться

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

    $.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/

12
ответ дан andy_314 02 авг. '12 в 0:56
источник поделиться

$("selector") дают объект с данными length. Если в селекторе есть элементы, которые вы определяете, вы получите их из объекта. Поэтому, если вы проверите длину, которую вы уже можете найти, существует ли какой-либо элемент. В javascript 0 == false также null == false. Если вы не получите 0, ваши коды будут работать.

if($("selector").length){
   //code in the case
} 
10
ответ дан Kamuran Sönecek 25 марта '16 в 14:05
источник поделиться

Вот мой любимый метод 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
    }
);
10
ответ дан ducdhm 08 марта '16 в 20:06
источник поделиться

Вам не нужно проверять, достаточно ли этого 0 как $(selector).length > 0, $(selector).length и элегантный способ проверить существование элементов. Я не думаю, что стоит написать функцию только для этого, если вы хотите сделать больше лишних вещей, да.

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
8
ответ дан Andrei Todorut 20 июня '17 в 12:43
источник поделиться
if ( $('#myDiv').size() > 0 ) { //do something }

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

8
ответ дан Mad_Hat 25 февр. '09 в 5:44
источник поделиться
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос