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

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

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

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

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

2549
27 авг. '08 в 22:49
источник поделиться
40 ответов
  • 1
  • 2

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

if ($(selector).length)

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

2286
25 февр. '09 в 22:16
источник

Связанные вопросы


Похожие вопросы

Да!

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

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

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

1311
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 */ }
356
14 янв. '09 в 22:46
источник

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

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

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

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

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

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

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

NB: обратите внимание на отсутствие element_id # перед element_id (поскольку это обычный JS, а не jQuery).

90
11 янв. '12 в 15:27
источник

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

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

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

64
18 янв. '14 в 12:04
источник

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

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

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

58
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    */
    }
})
58
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
54
20 мая '17 в 12:21
источник

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

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

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

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

52
14 нояб. '11 в 17:20
источник

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

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

if($(selector).exists()){/*do something*/}
48
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);
41
12 авг. '14 в 2:42
источник

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

jQuery.contains( container, contained )

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

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

36
23 окт. '13 в 8:46
источник

Я обнаружил, что 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
36
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
}
34
09 июля '15 в 15:39
источник

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

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

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

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

$("#myDiv").show();
31
22 марта '17 в 17:32
источник

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

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

if ($(selector).exists()) {
    // the element exists, now what?...
}
28
04 мая '15 в 6:31
источник
$(selector).length && //Do something
27
28 мая '12 в 15:58
источник

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

if (!!$(selector)[0]) // do stuff
26
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>
25
13 окт. '15 в 23:01
источник

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

function isExists(selector){
  return document.querySelectorAll(selector).length>0;
}
24
19 июня '16 в 1:37
источник

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

if(document.querySelector('.a-class')) {
  // do something
}
23
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
21
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;
};
18
06 апр. '12 в 0:02
источник

Как насчет:

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

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

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

16
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/

14
02 авг. '12 в 0:56
источник

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

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

if($("selector").length){
   //code in the case
} 
13
25 марта '16 в 14:05
источник

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

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
10
20 июня '17 в 12:43
источник

Вот полный пример различных ситуаций и способ проверить, существует ли элемент с помощью direct, если на селекторе jQuery может работать или нет, потому что он возвращает массив или элементы.

var a = null;

var b = []

var c = undefined ;

if(a) { console.log(" a exist")} else { console.log("a doesn't exit")}
// output: a doesn't exit

if(b) { console.log(" b exist")} else { console.log("b doesn't exit")}
// output: b exist

if(c) { console.log(" c exist")} else { console.log("c doesn't exit")}
// output: c doesn't exit

ЗАКЛЮЧИТЕЛЬНОЕ РЕШЕНИЕ

if($("#xysyxxs").length){ console.log("xusyxxs exist")} else { console.log("xusyxxs doesnn't exist") }
//output : xusyxxs doesnn't exist

if($(".xysyxxs").length){ console.log("xusyxxs exist")} else { console.log("xusyxxs doesnn't exist") }
    //output : xusyxxs doesnn't exist
10
31 июля '16 в 9:42
источник
  • 1
  • 2

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