2012-01-11 19 views
7

Parece que el método .find() de jQuery siempre devuelve true. Pero eso no es realmente útil porque también debe verificar la longitud del objeto devuelto para ver si realmente existe.¿Por qué .find() siempre devuelve verdadero?

¿Alguien tiene una buena explicación para ese comportamiento?

+0

duplicado posible de esa pregunta sobre la comparación en Javascript –

+0

¿qué quieres decir con eso? –

+0

Hay una pregunta famosa por ahí que puedo consultar ahora mismo acerca de cómo la comparación de Javascript es débil, y solo porque tu 'si' tenga éxito no significa que' '.find()' devuelve verdadero ". Estaba medio en broma sugiriendo que esto es un duplicado de eso. –

Respuesta

6

¿Alguien tiene una buena explicación para ese hábito?

Si .find() eran para devolver un valor booleano en lugar de un objeto jQuery, no se podía utilizar para el encadenamiento que es uno de los objetivos generales de jQuery.

+0

Exactamente.! Además, es posible que vea el uso de '.has()' también, ya que en muchos casos puede ser más útil verificar si un elemento tiene ascendencias específicas. – kontur

13

No se cumple. Devuelve un conjunto vacío de elementos, que es verdadero si lo haces ==. Debe verificar .length y verificar si se devolvieron 0 elementos.

+0

bien, pero ¿por qué es útil de alguna manera? Es solo más código de todos modos y puedo verificar la longitud de todos modos así que ¿por qué se necesita .find() incluso? –

+0

¿qué quieres decir? de qué manera es .find() no es necesario? – ub1k

+2

@EvilP Find() es muy útil. Parece que ha entendido mal el uso de la misma, eche un vistazo a la documentación. http://api.jquery.com/find/ – Filip

6

Ejemplo cómo comprobar si cualquier elemento donde encontrados:

if ($('body').find('li').length) { 
    // at least one li was found 
} else { 
    // no li's where found 
} 

$() y el selector de métodos como find() y filter() siempre devuelven un objeto jQuery. Esto es para que pueda encadenar métodos. Puede hacer algo como

$('body').find('li').add('<p>') 

Esto encuentra todos los elementos de lista en el cuerpo y agrega un párrafo a todos. Si $('body').find('li') devolviera false porque no contenía ningún li, el método add() arrojaría un error, porque no puede hacer false.add().

+0

* "[...] no iba a funcionar." * - No es sólo que, en realidad sería lanzar una 'TypeError' (en este caso, probablemente algo así como * "falso objeto no tiene un método 'añadir'" * – PPvG

3

.find() método de jQuery devuelve jQuery objeto, que podría ser evaluado para true en algunos casos. Pero de hecho, la comparación estricta (===) con true fallará (la comparación devolverá false).

Esta es la razón por usted debe usar la comparación estricta (=== en lugar de ==) y cheque por .length propiedad cuando se cuentan elementos devueltos (Esto es cierto también alrededor de Array objetos).

Es completamente razonable, ya que el objeto jQuery es solo un contenedor para los elementos que ha encontrado. Debe tener los métodos jQuery (los que puede invocar en el resultado de .find()), por lo tanto, no debe ser un booleano.

0

Recuerde

$('selector').find('subselector') 

devolverá el mismo resultado en forma

$('subselector', 'selector') or $('selector subselector') 

Una de las utilidades de find() reside en el encadenamiento

$('div table').css('width', '100px') 
       .find('tr').css('background-color', 'Red'); 
Cuestiones relacionadas