2009-05-28 11 views
240

¿Cuál es la mejor manera de detectar si un jQuery-selector devuelve un objeto vacío. Si lo hace:¿Cómo puedo detectar si un selector devuelve nulo?

alert($('#notAnElement')); 

se obtiene [object Object], por lo que la forma en que hago ahora es:

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

que escribir "indefinido", y lo que puede hacer un cheque por ese. Pero parece muy malo. ¿Qué otra manera hay?

Respuesta

446

Mi favorito es extender jQuery con esta pequeña conveniencia:

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

utilizado como:

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

más explícito que el uso de longitud.

+0

que se ve muy dulce! Aunque marqué esto como respondido, aún me gustaría ver más sugerencias ... (: – peirix

+3

Mejor respuesta que la mía +1 –

+0

¡Gracias por esto! ¡No puede ser más conveniente que eso! – Sneakyness

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

El selector devuelve una matriz de objetos jQuery. Si no se encuentran elementos coincidentes, devuelve una matriz vacía. Puede verificar el .length de la colección devuelta por el selector o verificar si el primer elemento de la matriz está 'indefinido'.

Puede usar cualquiera los siguientes ejemplos dentro de una instrucción IF y todos producen el mismo resultado. Es cierto, si el selector encontró un elemento coincidente, de lo contrario es falso.

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

+1 para explicar su respuesta en lugar de limitarse a proporcionar un código de ejemplo. –

+0

Uso '.length' a menos que el código esté caliente. Sin duda es el más claro con intención. Además, ['.size()'] (http://api.jquery.com/size/) está en desuso y lo ha sido durante años (desde 1.8). Voy a editar tu respuesta y eliminarla, no dudes en volver a agregarla con una nota, pero es tan antigua que creo que ya no existe. –

+0

Técnicamente devuelve un objeto jQuery que no contiene nodos DOM. Decir que devuelve una matriz vacía no es correcta. – Vigrant

33

me gustaría hacer algo como esto:

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

Así que usted puede hacer algo como esto:

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

es duplicado de la respuesta aceptada –

+3

@Ehsan En realidad no es un duplicado de la respuesta aceptada ... tenga en cuenta que la respuesta aceptada solo devuelve verdadero/falso mientras que esta respuesta devuelve * el objeto original * ("this") o falso. Esta respuesta le permite hacer cosas adicionales con el valor de retorno (como el encadenamiento de función adicional) si no es falso. – RSW

+0

Tengo exactamente el mismo código en mi kit de herramientas estándar. Esta forma es equivalente a object.presence en Rails y súper útil en la construcción de caída simultánea que describe @CSharp. – inopinatus

6

Mi preferencia, y no tengo ni idea de por qué esto no está ya en jQuery:

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

usados ​​como esto:

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

O, como se ve en CoffeeScript:

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

me gusta usar presence, inspirado en Ruby on Rails:

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

Su ejemplo se convierte en:

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

Lo encuentro superior al propuesto $.fn.exists porque todavía puede usar operadores booleanos o if, pero el resultado verdadero es más útil.Otro ejemplo:

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