2009-05-28 14 views
240

Qual è il modo migliore per rilevare se un jQuery-selector restituisce un oggetto vuoto. Se lo fai:Come posso rilevare se un selettore restituisce null?

alert($('#notAnElement')); 

si ottiene [object Object], in modo che il mio modo di farlo ora è:

alert($('#notAnElement').get(0)); 

che scriverà "indefinito", e così si può fare un controllo per quella. Ma sembra molto male. Quale altro modo c'è?

risposta

446

Il mio preferito è quello di estendere jQuery con questo piccolo vantaggio:

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

Usato come:

$("#notAnElement").exists(); 

più esplicito rispetto all'utilizzo di lunghezza.

+0

sembra molto dolce! Anche se ho contrassegnato questo come una risposta, mi piacerebbe ancora vedere altri suggerimenti ... (: – peirix

+3

Risposta molto migliore della mia +1 –

+0

Grazie per questo! Non è possibile ottenere più conveniente di quello! – Sneakyness

178
if ($("#anid").length) { 
    alert("element(s) found") 
} 
else { 
    alert("nothing found") 
} 
55

Il selettore restituisce una serie di oggetti jQuery. Se non vengono trovati elementi corrispondenti, restituisce una matrice vuota. È possibile controllare lo .length della raccolta restituita dal selettore o controllare se il primo elemento dell'array è 'indefinito'.

È possibile utilizzare qualsiasi i seguenti esempi all'interno di un'istruzione IF e tutti producono lo stesso risultato. È vero, se il selettore ha trovato un elemento corrispondente, falso altrimenti.

$('#notAnElement').length > 0 
$('#notAnElement').get(0) !== undefined 
$('#notAnElement')[0] !== undefined 
+3

+1 per spiegare la tua risposta invece di fornire alcuni esempi di codice. –

+0

Io uso '.length' a meno che il codice non sia caldo. È certamente il più chiaro con intento. Inoltre, ['.size()'] (http://api.jquery.com/size/) è deprecato ed è stato usato per anni (dal 1.8). Ho appena intenzione di modificare la tua risposta e rimuoverla, sentiti libera di aggiungerla di nuovo con una nota, ma è così vecchia, penso che sia andata meglio. –

+0

Tecnicamente restituisce un oggetto jQuery che non contiene nodi DOM. Dicendo che restituisce un array vuoto non è giusto. – Vigrant

33

mi piacerebbe fare qualcosa di simile:

$.fn.exists = function(){ 
    return this.length > 0 ? this : false; 
} 

Così allora si può fare qualcosa di simile:

var firstExistingElement = 
    $('#iDontExist').exists() ||  //<-returns false; 
    $('#iExist').exists() ||   //<-gets assigned to the variable 
    $('#iExistAsWell').exists();  //<-never runs 

firstExistingElement.doSomething(); //<-executes on #iExist 

http://jsfiddle.net/vhbSG/

+0

è il duplicato della risposta accettata –

+3

@Ehsan In realtà non è un duplicato della risposta accettata ... nota che la risposta accettata restituisce solo vero/falso mentre questa risposta restituisce * l'oggetto originale * ("questo") o falso. Questa risposta ti consente di fare cose aggiuntive con il valore di ritorno (come il concatenamento di funzioni aggiuntive) se non è falso. – RSW

+0

Ho esattamente lo stesso codice nel mio toolkit standard. Questo modulo è equivalente a object.presence in Rails e super utile nel costrutto fallthrough descritto da @CSharp. – inopinatus

6

La mia preferenza, e non ho idea del perché questo non è già presente in jQuery:

$.fn.orElse = function(elseFunction) { 
    if (!this.length) { 
    elseFunction(); 
    } 
}; 

Usato in questo modo:

$('#notAnElement').each(function() { 
    alert("Wrong, it is an element") 
}).orElse(function() { 
    alert("Yup, it's not an element") 
}); 

Oppure, come appare nelle CoffeeScript:

$('#notAnElement').each -> 
    alert "Wrong, it is an element"; return 
.orElse -> 
    alert "Yup, it's not an element" 
7

Mi piace usare presence, ispirato da Ruby on Rails:

$.fn.presence = function() { 
    return this.length !== 0 && this; 
} 

Il vostro esempio diventa:

alert($('#notAnElement').presence() || "No object found"); 

Lo trovo superiore al $.fn.exists proposto perché è ancora possibile utilizzare gli operatori booleani o if, ma il risultato della verità è più utile.Un altro esempio:

$ul = $elem.find('ul').presence() || $('<ul class="foo">').appendTo($elem) 
$ul.append('...') 
Problemi correlati