Чи існує функція "існує" для jQuery?


2778

Як я можу перевірити наявність елемента в jQuery?

Поточний код, який у мене є, такий:

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

Чи є більш елегантний спосіб підійти до цього? Можливо, плагін чи функція?

Відповіді:


2489

У JavaScript все "truthy" або "falesy", а для цифр 0(і NaN) означає falseвсе інше true. Отже, ви можете написати:

if ($(selector).length)

Вам не потрібна ця >0частина.


52
@ abhirathore2006 Якщо ви використовуєте селектор ідентифікаторів, а елемент не існує, то довжина дорівнює 0 і не викидає винятків.
Роберт

14
Цікаво досить NaN != false.
Роберт

35
@Robert and [] + []= ""... ahh Я люблю javascript
Джеймс

9
@James Це тому, що [].toString() === [].join(',') === ""і "" === "".
Ісмаїл Мігель

5
@Robert andtypeof NaN == 'number'
oriadam

1356

Так!

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

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

Це у відповідь на: Підкаст Herding Code з Джеффом Едвудом


254
Я просто пишу: якщо ($ (селектор) .length) {...} без '> 0'
vsync

369
Ваш $.fn.existsприклад - це заміна пошуку властивостей (дешево!) Двома викликами функцій, які є значно дорожчими, і один з цих викликів функцій відтворює об’єкт jQuery, який у вас уже є, що просто нерозумно.
C Snover

212
@redsquare: читабельність коду є найкращим обґрунтуванням для додавання подібної функції у jQuery. Якщо щось називається, .existsчитається чисто, тоді як .lengthчитається як щось семантично інше, навіть якщо семантика збігається з ідентичним результатом.
Бен Зотто

48
@quixoto, вибачте, але .length - це стандарт для багатьох мов, який не потребує обгортання. Як ще ви інтерпретуєте .length?
redsquare

144
На мою думку, це хоча б одна логічна непрямість від поняття "довжина списку, що перевищує нуль", до поняття "елемент (и), для якого я написав селектор для існування". Так, технічно вони однакові, але концептуальна абстракція знаходиться на іншому рівні. Це призводить до того, що деякі люди віддають перевагу більш явним показником, навіть за певної вартості продуктивності.
Бен Зотто

377

Якщо ви використовували

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 немає значень, то отримання першого елемента в масиві повернеться невизначеним.

if ( $('#myDiv')[0] ) { /* Do something */ }

11
Перший метод читається краще. $ ("a"). postoji () читається як "якщо <a> елементи існують." $ .exists ("a") читається як "якщо існують елементи <a>."
страгер

16
правда, але знову ж таки, ви маєте на увазі, що ланцюжок можливий, і якби я спробував зробити щось на зразок $ (selector) .exists (). css ("color", "red"), воно не працюватиме, і тоді я був би = * (
Джон Еріксон

19
Вже є методи, які неможливо вибрати, наприклад, attr та функції даних. Я бачу вашу думку, але, для чого це варто, я просто перевіряю на довжину> 0 все одно.
Меттью Крамлі

39
Чому на землі вам потрібно це зав'язати? $(".missing").css("color", "red")вже робить правильно ... (тобто нічого)
Бен Бланк

15
Матеріал про ланцюжку завершення Тош - є багато з Jquery $.fnметоди , які повертають щось інше , ніж новий об'єкт JQuery і , отже , НЕ ланцюга.
Альнітак

136

Ви можете скористатися цим:

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

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

134
Ви не бачили, що Тім Бют вже дав цю відповідь за 2 роки до вас?
Th4t Гай

101
Pfft, Тім ніколи не показав, як перевірити, якщо елемент не існує.
Jeremy W

1
Ви маєте на увазі життя "ще"? Мій Q такий: помилка, він повинен існувати або селектор не відповідає. Довжина зайва.
RichieHH

26
ця відповідь та коментарі підсумовує, як працює
stackoverflow

101

Найшвидший і семантично самостійно пояснюючий спосіб перевірити наявність - це насправді за допомогою простого JavaScript:

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

Писати трохи довше, ніж альтернатива довжини jQuery, але виконується швидше, оскільки це нативний метод JS.

І це краще, ніж альтернатива написання власної jQueryфункції. Ця альтернатива є повільнішою з причин @snover. Але це також дало б уявлення іншим програмістам, що exists()функція - щось властиве jQuery. JavaScriptповинні / повинні розуміти інші, хто редагує ваш код, без збільшення боргу за знання.

Примітка: Помітьте відсутність "#" перед element_id(оскільки це звичайний JS, ні jQuery).


56
Зовсім не те саме. Селектори JQuery можна використовувати для будь-якого правила CSS - наприклад $('#foo a.special'). І може повернути більше одного елемента. getElementByIdне можу почати до цього наближатися.
кікіто

7
Ви вірні в тому, що це не так широко застосовується, як селектори. Однак він виконує цю роботу досить добре в найбільш поширеному випадку (перевірка наявності одного елемента). Аргументи самопояснення та швидкості все ще стоять.
Магне

29
@Noz if(document.querySelector("#foo a.special"))буде працювати. Не потрібно jQuery.
Blue Skies

34
Аргумент швидкості в двигунах JS лише мертвий на увазі людей, які не можуть функціонувати без jQuery, оскільки це аргумент, який вони не можуть перемогти.
Синє небо

22
Пам’ятаєте старі добрі часи, коли було у нас document.getElementById? І я завжди забував документ. і не міг зрозуміти, чому це не працює. І я завжди написав це неправильно і неправильно розкрив кожух персонажа.
JustJohn

73

Ви можете зберегти кілька байт, написавши:

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

Це працює, тому що кожен об’єкт jQuery також маскується як масив, тому ми можемо використовувати оператор перенаправлення масиву, щоб отримати перший елемент з масиву . Він повертається, undefinedякщо у вказаному індексі немає елемента.


1
Я прийшов сюди, щоб опублікувати цю точну відповідь ... обов'язкова скрипка: jsfiddle.net/jasonwilczak/ekjj80gy/2
JasonWilczak

3
@JasonWilczak Обережно коментувати, чому б не замість цього: .eq [0] або .first () позначити перший знайдений елемент, а не типовий кастинг?
Жан Пол АКА el_vete

5
Ні, jQuery.first()або jQuery.eq(0)обидва повертаються об'єкти, об'єкти є truthy, навіть якщо вони порожні. Цей приклад повинен ілюструвати, чому ці функції не можна використовувати як є:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
Salman A

1
Правильно. .eq(0)повертає ще один обрізаний об'єкт jQuery на довжину 1 або 0. .first()це просто зручний метод .eq(0). Але .get(0)повертає перший елемент DOM або undefinedі є таким же, як [0]. Перший елемент DOM в об'єкті jQuery зберігається у властивості звичайного об'єкта з ім'ям '0'. Це простий доступ до власності. Кастинг єдиного типу походить від неявного перетворення числа 0в рядок '0'. Тож якщо кастинг типів є проблемою, яку ви можете використовувати $.find(selector)['0']замість цього.
Роберт

66

Ви можете використовувати:

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

Трохи більш елегантно, можливо.


38
Це занадто багато для такої простої речі. дивіться відповідь Тіма Б’юте
vsync

Це правильна відповідь. Метод 'length' має проблему з тим, що він дає хибний позитив з будь-яким числом, наприклад: $ (666) .length // повертає 1, але це не допустимий вибір
Earnaz

Це надзвичайно дорого для дуже простого завдання. Просто перегляньте реалізацію jquery, якщо .is (), і ви побачите, скільки коду потрібно обробити, щоб відповісти на це просте запитання. Крім того, не очевидно, що саме ви хочете зробити, тому це те саме або, можливо, менш елегантне, тоді як питання, про яке йдеться.
micropro.cz

1
@earnaz чудовий момент, приємний улов. Я не бачу, де це насправді вартий турботи. Елементи, що ідентифікують розробники, мають, 666мабуть, багато інших причин, коли їх код зламаний Хоча це недійсний селектор, $ (666) .length є дійсним javascript : він оцінюється як truthy, а тому повинен задовольняти умові.
Тодд

@earnaz, щоб уникнути конкретного випадку, $.find(666).lengthпрацює.
Еміль Бержерон

66

Цей плагін може бути використаний у 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    */
    }
})

1
Чи не повинен у зворотному варіанті Has Itemsзворотний виклик передаватися в об'єкт як аргумент?
Кріс Марісіч

62

Я бачу, що більшість відповідей тут не точні, як вони повинні бути, вони перевіряють довжину елементів, це може бути нормально у багатьох випадках, але не 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

55

Насправді немає необхідності в jQuery. За допомогою простого JavaScript простіше перевірити:

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

Якщо з якоїсь причини ви не хочете вводити ідентифікатор до елемента, ви все одно можете використовувати будь-який інший метод JavaScript, призначений для доступу до DOM.

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


5
Я знаю: він не відповідає безпосередньо на початкове запитання (яке запитує функцію jquery), але в такому випадку відповідь буде "Ні" або "не семантично правильне рішення".
amypellegrini

Що робити, якщо вам потрібен вибір батьків :has()?
Константин Ван

54

Ви можете скористатися цим:

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

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

43

Причина, що всі попередні відповіді вимагають цього .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.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);

40

Це $.contains()те, що ти хочеш?

jQuery.contains( container, contained )

$.contains()Метод повертає істину , якщо DOM елемент , передбачений другим аргументом є нащадком елемента DOM , наданого першим аргументом, чи є це прямим нащадком або більш глибоко вкладеним. В іншому випадку воно повертається хибним. Підтримуються лише вузли елементів; якщо другий аргумент - це текст або коментарний вузол, $.contains()поверне помилковим.

Примітка . Перший аргумент повинен бути елементом DOM, а не об'єктом jQuery або простим об’єктом JavaScript.


3
Це не приймає селектора, це означає, що йому доведеться його вибрати, а це означає, що він може просто перевірити результат свого вибору.

39

Я визнав 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

12
Як часто $()в якості аргументу ви виявляєте дзвінок із порожнім об'єктом?
nnnnnn

@nnnnnn Насправді ніколи (jQuery вже не використовую). Але я думаю, що 3 роки тому у мене був випадок відкриття API, який би взяв селектор і повернув кількість елементів для цього селектора. Якщо інший диявол перейшов би в порожній об’єкт, він би неправильно відповів з 1.
Олег

3
Чому на землі ви б передати порожній об'єкт {}в $()?
Усі працівники мають важливе значення

7
@cpburnz Чому ти мене питаєш? Я був просто постачальником API ... Люди передають API всілякі дурні речі.
Олег

4
Щойно зауважив, потік проблеми jquery, на який посилається @FagnerBrack, був оновлений незабаром після його коментаря; схоже, що він не зникне зрештою.
Джозеф Габріель

38

Ви можете перевірити наявність елемента або не використовувати довжину в сценарії 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
}

4
Вам не потрібно перевіряти, що довжина погоди перевищує 0, якщо ($ ('# elementid'). Довжина) {} буде достатньо.
Пранів Лабхе

13
Ви насправді читали питання? Це точно той самий метод, що і ОП.
A1rPun

34

Перевірка наявності елемента зафіксована акуратно на офіційному веб-сайті jQuery!

Використовуйте властивість .length колекції jQuery, повернуту вашим селектором:

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

Зауважте, що не завжди потрібно перевіряти, чи існує елемент. Наступний код покаже елемент, якщо він існує, і нічого не робити (без помилок), якщо він не:

$("#myDiv").show();

31

це дуже схоже на всі відповіді, але чому б не використати !оператора двічі, щоб ви могли отримати булевий:

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

if ($(selector).exists()) {
    // the element exists, now what?...
}

2
Тому що інодіBoolean(x) може бути ефективніше.

28
$(selector).length && //Do something

19
Я ненавиджу ці розумні способи уникнути використання значень, ifде ifполіпшення читабельності варто за 2 байти.
Еміль Бержерон

Плюс мініфікери зроблять усе це &&за вас.


27

Надихнувшись відповіді hiway, я придумав таке:

$.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 це, мабуть, є бажаним результатом .


26

Не потрібно 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


25

Мені просто подобається використовувати для цього звичайний JavaScript ванілі.

function isExists(selector){
  return document.querySelectorAll(selector).length>0;
}

23

Я натрапив на це питання, і я хотів би поділитися фрагментом коду, яким я зараз користуюся:

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

9
Я вважаю, що оригінальний підхід ОП не тільки набагато менший, але й елегантніший за цей. Здається, що надмірне вміння писати стільки коду, коли метод ОП коротший, і не передбачає зворотних викликів.
Лев

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

4
У якій складній ситуації цей підхід був би кращим за просту заяву if / else?
Jarvl

19

У мене був випадок, коли я хотів побачити, чи існує об’єкт всередині іншого, тому я додав щось до першої відповіді, щоб перевірити наявність селектора всередині селектора.

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

Як щодо:

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

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

Це дуже мінімально і економить вам, що потрібно $()щоразу вкладати селектор .


3
Це звучить як "якщо існує річ", а не "якщо річ існує", яка if($("#thing").exists(){}читається як. Крім того, це не спосіб jQuery.
1j01

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

Ось мій улюблений 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
    }
);

14

$("selector") повертає об'єкт, який має lengthвластивість. Якщо селектор знайде якісь елементи, вони будуть включені в об’єкт. Тож якщо ви перевірите його довжину, то можете побачити, чи існують якісь елементи. У JavaScript 0 == false, тому якщо ви не отримаєте, 0ваш код запуститься.

if($("selector").length){
   //code in the case
} 

5
"Надати масив" - Ні, це не так. Він дає вам об'єкт jQuery (який розділяє деякі властивості з масивом). Ваша відповідь по суті така ж, як і у Тіма Бютта з 2009 року.
Квентін

11

Ось повний приклад різних ситуацій та спосіб перевірити, чи існує елемент, використовуючи 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

Ви можете спробувати $ ("# xysyxxs") у своєму відладчику, ви побачите, що jquery не повертається до нуля або не визначено. Тож остаточне рішення не спрацювало
Беранже

11

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

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.