Esiste una funzione "esiste" per jQuery?


2778

Come posso verificare l'esistenza di un elemento in jQuery?

Il codice attuale che ho è questo:

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

C'è un modo più elegante per affrontare questo? Forse un plugin o una funzione?

Risposte:


2490

In JavaScript, tutto è "verità" o "falsità", e per numeri 0(e NaN) significa falsetutto il resto true. Quindi potresti scrivere:

if ($(selector).length)

Non hai bisogno di quella >0parte.


52
@ abhirathore2006 Se si utilizza un selettore ID e l'elemento non esiste, la lunghezza è 0 e non vengono generate eccezioni.
Robert,

14
Abbastanza interessante NaN != false.
Robert,

35
@Robert e [] + []= ""... ahh adoro javascript
James

9
@James Ecco perché [].toString() === [].join(',') === ""e "" === "".
Ismael Miguel,

5
@Robert etypeof NaN == 'number'
oriadam

1356

Sì!

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

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

Questo è in risposta a: Podcast Herding Code con Jeff Atwood


254
Scrivo solo: if ($ (selettore) .length) {...} senza lo '> 0'
vsync

369
Il tuo $.fn.existsesempio sta sostituendo una ricerca di proprietà (economica!) Con due chiamate di funzione, che sono molto più costose, e una di quelle chiamate di funzione ricrea un oggetto jQuery che hai già, che è semplicemente stupido.
C Snover,

212
@redsquare: la leggibilità del codice è la migliore logica per aggiungere questo tipo di funzione su jQuery. Avere qualcosa chiamato si .existslegge in modo pulito, mentre si .lengthlegge come qualcosa semanticamente diverso, anche se la semantica coincide con un risultato identico.
Ben Zotto,

48
@quixoto, scusa ma .length è uno standard in molte lingue che non ha bisogno di essere spostato. In che altro modo interpreti .length?
redsquare il

144
Secondo me, è almeno una indiretta logica dal concetto di "una lunghezza dell'elenco che è maggiore di zero" al concetto di "l'elemento / i per cui ho scritto un selettore". Sì, tecnicamente sono la stessa cosa, ma l'astrazione concettuale è a un livello diverso. Questo fa sì che alcune persone preferiscano un indicatore più esplicito, anche a un certo costo delle prestazioni.
Ben Zotto,

377

Se hai usato

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

vorresti dire che il concatenamento era possibile quando non lo è.

Questo sarebbe meglio:

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

In alternativa, dalle FAQ :

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

È inoltre possibile utilizzare quanto segue. Se non ci sono valori nella matrice di oggetti jQuery, ottenere il primo elemento nella matrice restituisce un valore indefinito.

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

11
Il primo metodo legge meglio. $ ("a"). exist () si legge come "se esistono <a> elementi." $ .exists ("a") legge "se esistono <a> elementi".
Strager

16
vero ma, di nuovo, stai insinuando che il concatenamento è possibile e se provassi a fare qualcosa come $ (selettore) .exists (). css ("color", "red") non funzionerebbe e quindi sarei = * (
Jon Erickson,

19
Esistono già metodi che non sono concatenabili, come attr e funzioni di dati. Però vedo il tuo punto e, per quel che vale, cerco comunque una lunghezza> 0.
Matthew Crumley,

39
Perché mai dovresti incatenarlo? $(".missing").css("color", "red")fa già la cosa giusta ... (cioè niente)
Ben Blank

15
La roba sul concatenamento è completa - ci sono molti$.fn metodi jQuery che restituiscono qualcosa di diverso da un nuovo oggetto jQuery e quindi non si incatenano.
Alnitak,

136

Puoi usare questo:

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

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

134
Non hai visto che Tim Büthe aveva già dato questa risposta 2 anni prima di te?
Th4t Guy

101
Pfft, Tim non ha mai mostrato come testare se l'elemento non esiste.
Jeremy W,

1
Intendi la vita "altro"? La mia Q è questa: err, deve esistere o il selettore non corrisponde. La lunghezza è superflua.
RichieHH,

26
questa risposta e commenti
riassumono il

101

Il modo più veloce e semanticamente autoesplicativo per verificare l'esistenza è in realtà usando plain JavaScript:

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

È un po 'più lungo da scrivere rispetto all'alternativa di lunghezza jQuery, ma viene eseguito più velocemente poiché è un metodo JS nativo.

Ed è meglio dell'alternativa di scrivere la tua jQueryfunzione. Questa alternativa è più lenta, per i motivi dichiarati da @snover. Ma darebbe anche agli altri programmatori l'impressione che la exists()funzione sia inerente a jQuery. JavaScriptsarebbe / dovrebbe essere compreso da altri che modificano il tuo codice, senza aumentare il debito di conoscenza.

NB: Nota la mancanza di un '#' prima del element_id(dato che questo è semplicemente JS, non jQuery).


56
Totalmente non è la stessa cosa. I selettori JQuery possono essere utilizzati per qualsiasi regola CSS, ad esempio $('#foo a.special'). E può restituire più di un elemento. getElementByIdnon posso iniziare ad avvicinarmi a questo.
kikito,

7
Hai ragione in quanto non è ampiamente applicabile come i selettori. Tuttavia, fa il lavoro abbastanza bene nel caso più comune (controllando se esiste un singolo elemento). Gli argomenti di auto-spiegazione e velocità sono ancora validi.
Magne,

29
@Noz if(document.querySelector("#foo a.special"))avrebbe funzionato. Non è necessario jQuery.
Blue Skies

34
L'argomento della velocità nei motori JS è morto solo nella mente delle persone che non possono funzionare senza jQuery, poiché è un argomento che non possono vincere.
Blue Skies l'

22
Ricordi i bei vecchi tempi in cui document.getElementById era tutto ciò che avevamo? E ho sempre dimenticato il documento. e non riuscivo a capire perché non funzionasse. E l'ho sempre scritto male e ho sbagliato il case del personaggio.
Just John

73

È possibile salvare alcuni byte scrivendo:

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

Questo funziona perché ogni oggetto jQuery si maschera anche come un array, quindi possiamo usare l'operatore di dereferencing dell'array per ottenere il primo elemento dall'array . Restituisce undefinedse non ci sono articoli nell'indice specificato.


1
Sono venuto qui per pubblicare questa risposta esatta ... violino obbligatorio: jsfiddle.net/jasonwilczak/ekjj80gy/2
JasonWilczak

3
@JasonWilczak Vuoi commentare perché non invece: .eq [0] o .first () per fare riferimento a un primo elemento trovato anziché digitare casting?
Jean Paul AKA el_vete,

5
No, jQuery.first()o jQuery.eq(0)entrambi restituiscono oggetti, gli oggetti sono veritieri anche se sono vuoti. Questo esempio dovrebbe illustrare perché queste funzioni non possono essere utilizzate così come sono:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
Salman A

1
Corretta. .eq(0)restituisce solo un altro oggetto jQuery troncato alla lunghezza 1 o 0. .first()è solo un metodo conveniente per .eq(0). Ma .get(0)restituisce il primo elemento DOM o undefineded è uguale a [0]. Il primo elemento DOM in un oggetto jQuery è archiviato nella proprietà dell'oggetto normale con il nome '0'. Questo è un semplice accesso alla proprietà. L'unico tipo di casting deriva dalla conversione implicita del numero 0in stringa '0'. Quindi, se il casting di tipo è un problema, puoi $.find(selector)['0']invece usarlo .
Robert,

66

Puoi usare:

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

Un po ' più elegante, forse.


38
Questo è troppo per una cosa così semplice. vedi Tim Büthe risposta
vsync

Questa è la risposta corretta Il metodo 'length' ha il problema di dare falsi positivi con qualsiasi numero, ad esempio: $ (666) .length // restituisce 1, ma non è un selettore valido
guadaz

Questo è estremamente costoso per compiti molto semplici. Guarda l'implementazione di jquery se .is () e vedrai quanto codice deve elaborare per rispondere a questa semplice domanda. Inoltre non è ovvio che cosa vuoi fare esattamente, quindi è uguale o forse meno elegante della soluzione in questione.
micropro.cz,

1
@earnaz ottimo punto, bella cattura. Tuttavia, non vedo dove sia effettivamente una preoccupazione degna di nota. Gli sviluppatori che identificano gli elementi con 666probabilmente hanno molte altre ragioni per cui il loro codice è rotto. Sebbene sia un selettore non valido, $ (666) .length è javascript valido : valuta veritiero e quindi dovrebbe soddisfare la condizione.
Todd

@earnaz per evitare quel caso specifico, $.find(666).lengthfunziona.
Emile Bergeron,

66

Questo plugin può essere utilizzato in ifun'istruzione simile if ($(ele).exist()) { /* DO WORK */ }o utilizzando un callback.

Collegare

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

È possibile specificare uno o due callback. Il primo si attiverà se l'elemento esiste, il secondo si attiverà se l'elemento non esiste. Tuttavia, se si sceglie di passare solo una funzione, si attiverà solo quando l'elemento esiste. Pertanto, la catena morirà se l'elemento selezionato non esiste. Naturalmente, se esiste, la prima funzione si attiverà e la catena continuerà.

Ricorda che l'uso della variante di callback aiuta a mantenere la catenabilità : l'elemento viene restituito e puoi continuare a concatenare i comandi come con qualsiasi altro metodo jQuery!

Esempio di utilizzo

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
Nella versione di callback, il Has Itemscallback non dovrebbe effettivamente passare l'oggetto come argomento?
Chris Marisic,

62

Vedo che la maggior parte delle risposte qui non sono accurate come dovrebbero essere, controllano la lunghezza dell'elemento, in molti casi può essere OK , ma non al 100% , immagino invece se il numero passa alla funzione, quindi prototipo una funzione che controlla tutto condizioni e restituire la risposta come dovrebbe essere:

$.fn.exists = $.fn.exists || function() { 
  return !!(this.length && (this[0] instanceof HTMLDocument || this[0] instanceof HTMLElement)); 
}

Questo controllerà sia la lunghezza che il tipo, ora puoi verificarlo in questo modo:

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

Non c'è davvero bisogno di jQuery. Con JavaScript semplice è più facile e semanticamente corretto verificare:

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

Se per qualsiasi motivo non desideri inserire un ID nell'elemento, puoi comunque utilizzare qualsiasi altro metodo JavaScript progettato per accedere al DOM.

jQuery è davvero interessante, ma non lasciare che JavaScript puro cada nell'oblio ...


5
Lo so: non risponde direttamente alla domanda originale (che richiede una funzione jquery), ma in quel caso la risposta sarebbe "No" o "non una soluzione semanticamente corretta".
amypellegrini,

Cosa succede se hai bisogno di un selettore genitore :has()?
Константин Ван

54

Puoi usare questo:

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

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

43

Il motivo per cui tutte le risposte precedenti richiedono il .lengthparametro è che usano principalmente il $()selettore di jquery che ha querySelectorAll dietro le tende (o lo usano direttamente). Questo metodo è piuttosto lento perché deve analizzare l'intero albero DOM cercando tutte le corrispondenze a quel selettore e popolando un array con esse.

Il parametro ['length'] non è necessario o utile e il codice sarà molto più veloce se document.querySelector(selector)invece lo usi direttamente , perché restituisce il primo elemento corrispondente o nullo se non trovato.

function elementIfExists(selector){  //named this way on purpose, see below
    return document.querySelector(selector);
}
/* usage: */
var myelement = elementIfExists("#myid") || myfallbackelement;

Tuttavia questo metodo ci lascia con l'oggetto reale che viene restituito; che va bene se non verrà salvato come variabile e usato ripetutamente (mantenendo così il riferimento in giro se lo dimentichiamo).

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

In alcuni casi questo può essere desiderato. Può essere usato in un ciclo for in questo modo:

/* locally scoped myel gets garbage collected even with the break; */
for (var myel; myel = elementIfExist(sel); myel.getParentNode.removeChild(myel))
    if (myel == myblacklistedel) break;

Se in realtà non hai bisogno dell'elemento e vuoi ottenere / memorizzare solo un vero / falso, basta raddoppiarlo !! Funziona con le scarpe sciolte, quindi perché fare un nodo qui?

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()quello che vuoi?

jQuery.contains( container, contained )

Il $.contains()metodo restituisce true se l'elemento DOM fornito dal secondo argomento è un discendente dell'elemento DOM fornito dal primo argomento, sia esso figlio diretto o nidificato in modo più approfondito. Altrimenti, restituisce false. Sono supportati solo i nodi elemento; se il secondo argomento è un nodo di testo o commento, $.contains()restituirà false.

Nota : il primo argomento deve essere un elemento DOM, non un oggetto jQuery o un semplice oggetto JavaScript.


3
Questo non accetta un selettore, il che significa che dovrebbe selezionarlo, il che significa che potrebbe semplicemente controllare il risultato della sua selezione.

39

Ho trovato if ($(selector).length) {}insufficiente. Si romperà silenziosamente la tua app quando selectorè un oggetto vuoto {}.

var $target = $({});        
console.log($target, $target.length);

// Console output:
// -------------------------------------
// [▼ Object              ] 1
//    ► __proto__: Object

Il mio unico suggerimento è di eseguire un controllo aggiuntivo per {}.

if ($.isEmptyObject(selector) || !$(selector).length) {
    throw new Error('Unable to work with the given selector.');
}

Sto ancora cercando una soluzione migliore, dato che questa è un po 'pesante.

Modifica: ATTENZIONE! Questo non funziona in IE quando selectorè una stringa.

$.isEmptyObject('hello') // FALSE in Chrome and TRUE in IE

12
Quanto spesso ti ritrovi a chiamare $()con un oggetto vuoto come argomento?
nnnnnn,

@nnnnnn In realtà mai (non uso più jQuery). Ma suppongo che 3 anni fa ho avuto il caso di esporre un'API che avrebbe preso un selettore e restituito il numero di elementi per quel selettore. Se un altro sviluppatore passasse in un oggetto vuoto, risponderebbe erroneamente con 1.
Oleg

3
Perché mai si dovrebbe passare un oggetto vuoto {}per $()?
Tutti i lavoratori sono essenziali il

7
@cpburnz perché me lo chiedi? Ero solo un fornitore di API ... Le persone trasmettono ogni genere di cose stupide alle API.
Oleg,

4
Ho appena notato che il thread relativo a jquery a cui fa riferimento @FagnerBrack è stato aggiornato poco dopo il suo commento; dopo tutto sembra che non se ne vada.
Joseph Gabriel,

38

Puoi controllare che l'elemento sia presente o che non usi la lunghezza nello script java. Se la lunghezza è maggiore di zero, l'elemento è presente se la lunghezza è zero, allora l'elemento non è presente

// 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
Non è necessario verificare che la lunghezza del tempo sia maggiore di 0, se ($ ('# elementid'). Length) {} sarà sufficiente.
Pranav Labhe,

13
Hai davvero letto la domanda? È esattamente lo stesso metodo utilizzato da OP.
A1rPun

34

Il controllo dell'esistenza di un elemento è documentato ordinatamente nel sito Web ufficiale di jQuery stesso!

Utilizzare la proprietà .length della raccolta jQuery restituita dal selettore:

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

Si noti che non è sempre necessario verificare l'esistenza di un elemento. Il codice seguente mostrerà l'elemento se esiste e non farà nulla (senza errori) in caso contrario:

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

31

questo è molto simile a tutte le risposte, ma perché non usare l' !operatore due volte in modo da ottenere un valore booleano:

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

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

2
Perché a volteBoolean(x) può essere più efficiente.

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

19
Odio questi modi intelligenti di evitare di usare un ifdove ifmigliorare la leggibilità al costo di 2 byte.
Emile Bergeron,

Inoltre, i minificatori faranno tutto questo &&per te.

27

Prova a testare l' DOMelemento

if (!!$(selector)[0]) // do stuff

27

Ispirato dalla risposta di Hiway, ho pensato a quanto segue:

$.fn.exists = function() {
    return $.contains( document.documentElement, this[0] );
}

jQuery.contains accetta due elementi DOM e controlla se il primo contiene il secondo.

L'uso document.documentElementcome primo argomento soddisfa la semantica del existsmetodo quando vogliamo applicarlo esclusivamente per verificare l'esistenza di un elemento nel documento corrente.

Di seguito, ho messo insieme uno snippet che si confronta jQuery.exists()con gli approcci $(sel)[0]e $(sel).lengthche entrambi restituiscono truthyvalori per $(4)mentre $(4).exists()restituisce false. Nel contesto del controllo dell'esistenza di un elemento nel DOM, questo sembra essere il risultato desiderato .


26

Non è necessario per jQuery (soluzione di base)

if(document.querySelector('.a-class')) {
  // do something
}

Opzione molto più performante di seguito (nota la mancanza di un punto prima di una classe).

if(document.getElementsByClassName('a-class')[0]) {
  // do something
}

querySelector utilizza un motore di corrispondenza adeguato come $ () (sfrigolare) in jQuery e utilizza più potenza di calcolo, ma nel 99% dei casi andrà benissimo. La seconda opzione è più esplicita e dice al codice esattamente cosa fare. È molto più veloce secondo jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25


25

Mi piace solo usare javascript semplice alla vaniglia per fare questo.

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

23

Mi sono imbattuto in questa domanda e vorrei condividere uno snippet di codice che attualmente uso:

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

E ora posso scrivere codice come questo -

$("#elem").exists(function(){
    alert ("it exists");
}).otherwise(function(){
    alert ("it doesn't exist");
});

Potrebbe sembrare molto codice, ma quando è scritto in CoffeeScript è piuttosto piccolo:

$.fn.exists = (callback) ->
    exists = @length
    callback.call() if exists        
    new class
       otherwise: (fallback) ->            
            fallback.call() if not exists

9
Trovo che l'approccio originale di OP non solo sia molto più minimale, ma più elegante di così. Sembra eccessivo scrivere questo codice quando il metodo di OP è più breve e non comporta callback.
Lev

Per casi semplici: hai ragione. Ma per situazioni più complesse che coinvolgono molto codice in entrambi i casi, penso che il mio approccio sia migliore.
Eterno1

4
In quale situazione complessa questo approccio sarebbe migliore di una semplice istruzione if / else?
Jarvl,

19

Ho avuto un caso in cui volevo vedere se esiste un oggetto all'interno di un altro, quindi ho aggiunto qualcosa alla prima risposta per verificare la presenza di un selettore all'interno del selettore.

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

Che ne dite di:

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

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

È molto minimale e ti evita di dover racchiudere il selettore $()ogni volta.


3
Questo si legge come "se esiste cosa" invece di "se esiste" che si if($("#thing").exists(){}legge come. Inoltre, non è il modo jQuery.
1j01

15

Sto usando questo:

    $.fn.ifExists = function(fn) {
      if (this.length) {
        $(fn(this));
      }
    };
    $("#element").ifExists( 
      function($this){
        $this.addClass('someClass').animate({marginTop:20},function(){alert('ok')});               
      }
    ); 

Esegui la catena solo se esiste un elemento jQuery - http://jsfiddle.net/andres_314/vbNM3/2/


14

Ecco il mio existmetodo preferito in jQuery

$.fn.exist = function(callback) {
    return $(this).each(function () {
        var target = $(this);

        if (this.length > 0 && typeof callback === 'function') {
            callback.call(target);
        }
    });
};

e un'altra versione che supporta il callback quando il selettore non esiste

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

Esempio:

$('#foo .bar').exist(
    function () {
        // Stuff when '#foo .bar' exists
    },
    function () {
        // Stuff when '#foo .bar' does not exist
    }
);

14

$("selector") restituisce un oggetto che ha la lengthproprietà. Se il selettore trova degli elementi, verranno inclusi nell'oggetto. Quindi, se controlli la sua lunghezza, puoi vedere se esistono elementi. In JavaScript 0 == false, quindi se non ottieni il 0tuo codice verrà eseguito.

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

5
"dare un array" - No, non lo fa. Ti dà un oggetto jQuery (che condivide alcune proprietà con un array). Anche la tua risposta è sostanzialmente la stessa di Tim Büthe del 2009.
Quentin,

11

Ecco l'esempio completo di diverse situazioni e modi per verificare se esiste un elemento usando direct if on il selettore jQuery può o meno funzionare perché restituisce array o elementi.

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

SOLUZIONE FINALE

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

Puoi provare $ ("# xysyxxs") nel tuo debugger, vedrai che jquery non restituisce null o indefinito. Quindi la soluzione finale non funzionerebbe
Béranger il

11

Non devi controllare se è più grande di 0come $(selector).length > 0, $(selector).lengthè abbastanza ed un modo elegante per verificare l'esistenza di elementi. Non penso che valga la pena scrivere una funzione solo per questo, se vuoi fare altre cose extra, sì.

if($(selector).length){
  // true if length is not 0
} else {
  // false if length is 0
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.