¿Existe una función "existe" para jQuery?
¿Cómo puedo comprobar la existencia de un elemento en jQuery?
El código actual que tengo es este:
if ($(selector).length > 0) {
// Do something
}
¿Existe una forma más elegante de abordar esto? ¿Quizás un complemento o una función?
En JavaScript, todo es "verdadero" o "falso", y en el caso de los números 0
significa false
todo lo demás true
. Entonces podrías escribir:
if ($(selector).length)
No necesitas esa >0
parte.
¡Sí!
jQuery.fn.exists = function(){ return this.length > 0; }
if ($(selector).exists()) {
// Do something
}
Esto es en respuesta a: Podcast de Herding Code con Jeff Atwood
si usaste
jQuery.fn.exists = function(){return ($(this).length > 0);}
if ($(selector).exists()) { }
daría a entender que el encadenamiento era posible cuando no lo es.
Esto sería mejor:
jQuery.exists = function(selector) {return ($(selector).length > 0);}
if ($.exists(selector)) { }
Alternativamente, desde las preguntas frecuentes :
if ( $('#myDiv').length ) { /* Do something */ }
También puedes usar lo siguiente. Si no hay valores en la matriz de objetos jQuery, obtener el primer elemento de la matriz devolvería un valor indefinido.
if ( $('#myDiv')[0] ) { /* Do something */ }
La forma más rápida y semánticamente autoexplicativa de comprobar la existencia es mediante el uso de JavaScript simple:
if (document.getElementById('element_id')) {
// Do something
}
Es un poco más largo de escribir que la alternativa de longitud de jQuery, pero se ejecuta más rápido ya que es un método JS nativo.
Y es mejor que la alternativa de escribir su propia función jQuery. Esa alternativa es más lenta, por las razones que afirmó @snover. Pero también daría a otros programadores la impresión de que la función existe() es algo inherente a jQuery. JavaScript sería/debería ser entendido por otras personas que editen su código, sin aumentar la deuda de conocimientos.
NB: Observe la falta de un '#' antes de element_id (ya que es JS simple, no jQuery).
Puedes ahorrar algunos bytes escribiendo:
if ($(selector)[0]) { ... }
Esto funciona porque cada objeto jQuery también se hace pasar por una matriz, por lo que podemos usar el operador de desreferenciación de matriz para obtener el primer elemento de la matriz . Devuelve undefined
si no hay ningún elemento en el índice especificado.
Puedes usar:
if ($(selector).is('*')) {
// Do something
}
Un poco más elegante, tal vez.