¿Cómo puedo verificar la existencia de un elemento en jQuery?
El código actual que tengo es este:
if ($(selector).length > 0) {
// Do something
}
¿Hay una manera más elegante de abordar esto? ¿Quizás un complemento o una función?
javascript
jquery
Jake McGraw
fuente
fuente
NaN != false
.[] + []
=""
... ahh me encanta javascript[].toString() === [].join(',') === ""
y"" === ""
.typeof NaN == 'number'
¡Si!
Esto es en respuesta a: Podcast de Herding Code con Jeff Atwood
fuente
$.fn.exists
ejemplo es reemplazar una búsqueda de propiedad (¡barata!) Con dos llamadas a funciones, que son mucho más caras, y una de esas llamadas a funciones recrea un objeto jQuery que ya tiene, lo cual es una tontería..exists
lee limpiamente, mientras que se.length
lee como algo semánticamente diferente, incluso si la semántica coincide con un resultado idéntico.Si usaste
implicaría que el encadenamiento fue posible cuando no lo es.
Esto sería mejor:
Alternativamente, de las preguntas frecuentes :
También puedes usar lo siguiente. Si no hay valores en la matriz de objetos jQuery, obtener el primer elemento de la matriz volverá indefinido.
fuente
$(".missing").css("color", "red")
ya hace lo correcto ... (es decir, nada)$.fn
métodos jQuery que devuelven algo más que un nuevo objeto jQuery y, por lo tanto, no se encadenan.Puedes usar esto:
fuente
La forma más rápida y semánticamente autoexplicativa de verificar la existencia es en realidad usando simple
JavaScript
:Es un poco más largo para escribir que la alternativa de longitud 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
jQuery
función. Esa alternativa es más lenta, por las razones que declaró @snover. Pero también les daría a otros programadores la impresión de que laexists()
función es algo inherente a jQuery.JavaScript
Sería / debería ser entendido por otros editando su código, sin una mayor deuda de conocimiento.NB: Observe la falta de un '#' antes del
element_id
(ya que esto es JS simple, nojQuery
).fuente
$('#foo a.special')
. Y puede devolver más de un elemento.getElementById
No puedo comenzar a abordar eso.if(document.querySelector("#foo a.special"))
funcionaría. No se necesita jQuery.Puede guardar algunos bytes escribiendo:
Esto funciona porque cada objeto jQuery también se disfraza como una matriz, por lo que podemos usar el operador de referencia de matriz para obtener el primer elemento de la matriz . Regresa
undefined
si no hay ningún elemento en el índice especificado.fuente
jQuery.first()
ojQuery.eq(0)
ambos devuelven objetos, los objetos son verdaderos incluso si están vacíos. Este ejemplo debería ilustrar por qué estas funciones no pueden usarse tal cual:if(jQuery("#does-not-exist").eq(0)) alert("#does-not-exist exists")
.eq(0)
devuelve solo otro objeto jQuery truncado a longitud 1 o 0..first()
es solo un método conveniente para.eq(0)
. Pero.get(0)
devuelve el primer elemento DOM oundefined
y es lo mismo que[0]
. El primer elemento DOM en un objeto jQuery se almacena en la propiedad del objeto regular con el nombre'0'
. Eso es un simple acceso a la propiedad. El único tipo de conversión proviene de la conversión implícita del número0
a la cadena'0'
. Así que si la conversión de tipos es un problema que podría utilizar$.find(selector)['0']
en su lugar.Puedes usar:
Un poco más elegante, tal vez.
fuente
666
probablemente tienen muchas otras razones por las que su código está roto. Si bien es un selector no válido, $ (666) .length es javascript válido : se evalúa como verdadero y, por lo tanto, debe cumplir la condición.$.find(666).length
funciona.Este complemento se puede usar en una
if
declaración comoif ($(ele).exist()) { /* DO WORK */ }
o usando una devolución de llamada.Enchufar
jsFiddle
Puede especificar una o dos devoluciones de llamada. El primero se disparará si el elemento existe, el segundo se disparará si el elemento no existe. Sin embargo, si elige pasar solo una función, solo se activará cuando exista el elemento. Por lo tanto, la cadena morirá si el elemento seleccionado no existe. Por supuesto, si existe, la primera función se activará y la cadena continuará.
Tenga en cuenta que el uso de la variante de devolución de llamada ayuda a mantener la capacidad de encadenamiento : el elemento se devuelve y puede continuar encadenando comandos como con cualquier otro método jQuery.
Usos de ejemplo
fuente
Has Items
devolución de llamada en el objeto como argumento?Veo que la mayoría de las respuestas aquí no son precisas como deberían ser, verifican la longitud del elemento, puede estar bien en muchos casos, pero no al 100% , imagínense si el número pasa a la función, así que prototipo de una función que verifica todo condiciones y devolver la respuesta como debería ser:
Esto verificará tanto la longitud como el tipo. Ahora puede verificarlo de esta manera:
fuente
No hay necesidad de jQuery realmente. Con JavaScript simple, es más fácil y semánticamente correcto verificar:
Si por alguna razón no desea poner una identificación al elemento, aún puede usar cualquier otro método de JavaScript diseñado para acceder al DOM.
jQuery es realmente genial, pero no dejes que JavaScript puro caiga en el olvido ...
fuente
:has()
?Podrías usar esto:
fuente
La razón por la cual todas las respuestas anteriores requieren el
.length
parámetro es que están usando principalmente el$()
selector de jquery que tiene querySelectorAll detrás de las cortinas (o lo están usando directamente). Este método es bastante lento porque necesita analizar todo el árbol DOM buscando todas las coincidencias con ese selector y rellenando una matriz con ellos.El parámetro ['length'] no es necesario o útil y el código será mucho más rápido si lo usa directamente
document.querySelector(selector)
, porque devuelve el primer elemento que coincide o es nulo si no se encuentra.Sin embargo, este método nos deja con el objeto real que se devuelve; lo cual está bien si no se guardará como variable y se usará repetidamente (manteniendo así la referencia si la olvidamos).
En algunos casos esto puede desearse. Se puede usar en un bucle for como este:
Si realmente no necesita el elemento y desea obtener / almacenar solo un verdadero / falso, ¡simplemente no lo duplique! Funciona para zapatos que se desatan, así que ¿por qué anudar aquí?
fuente
Es
$.contains()
lo que quieresfuente
He encontrado
if ($(selector).length) {}
que es insuficiente. Silenciosamente romperá tu aplicación cuandoselector
sea un objeto vacío{}
.Mi única sugerencia es realizar una verificación adicional para
{}
.Sin embargo, todavía estoy buscando una solución mejor, ya que esta es un poco pesada.
Editar: ¡ADVERTENCIA! Esto no funciona en IE cuando
selector
es una cadena.fuente
$()
con un objeto vacío como argumento?{}
a$()
?Puede verificar si el elemento está presente o no usa la longitud en el script java. Si la longitud es mayor que cero, entonces el elemento está presente si la longitud es cero, entonces el elemento no está presente
fuente
¡La comprobación de la existencia de un elemento se documenta perfectamente en el sitio web oficial de jQuery!
fuente
Esto es muy similar a todas las respuestas, pero ¿por qué no usar el
!
operador dos veces para que pueda obtener un valor booleano?fuente
Boolean(x)
puede ser más eficiente.fuente
if
dondeif
mejoraría la legibilidad a un costo de 2 bytes.&&
por usted.Intenta probar el
DOM
elementofuente
Inspirado por la respuesta de Hiway, se me ocurrió lo siguiente:
jQuery.contains toma dos elementos DOM y comprueba si el primero contiene el segundo.
El uso
document.documentElement
como primer argumento cumple con la semántica delexists
método cuando queremos aplicarlo únicamente para verificar la existencia de un elemento en el documento actual.A continuación, he juntado un fragmento que se compara
jQuery.exists()
contra el$(sel)[0]
y$(sel).length
enfoques que ambos vuelventruthy
valores para$(4)
mientras que$(4).exists()
los retornosfalse
. En el contexto de verificar la existencia de un elemento en el DOM, este parece ser el resultado deseado .Mostrar fragmento de código
fuente
No necesita jQuery (solución básica)
Opción mucho más eficaz a continuación (observe la falta de un punto antes de una clase).
querySelector usa un motor de coincidencia adecuado como $ () (sizzle) en jQuery y usa más potencia informática, pero en el 99% de los casos funcionará bien. La segunda opción es más explícita y le dice al código exactamente qué hacer. Es mucho más rápido según jsperf https://jsperf.com/getelementsbyclassname-vs-queryselectorall/25
fuente
Solo me gusta usar JavaScript simple para hacer esto.
fuente
Me topé con esta pregunta y me gustaría compartir un fragmento de código que uso actualmente:
Y ahora puedo escribir código como este:
Puede parecer mucho código, pero cuando está escrito en CoffeeScript es bastante pequeño:
fuente
Tuve un caso en el que quería ver si un objeto existe dentro de otro, así que agregué algo a la primera respuesta para buscar un selector dentro del selector.
fuente
Qué tal si:
Es muy mínimo y le ahorra tener que incluir el selector
$()
cada vez.fuente
if($("#thing").exists(){}
lee como. Además, no es la forma jQuery.Estoy usando esto:
Ejecute la cadena solo si existe un elemento jQuery: http://jsfiddle.net/andres_314/vbNM3/2/
fuente
Aquí está mi
exist
método favorito en jQueryy otra versión que admite devolución de llamada cuando el selector no existe
Ejemplo:
fuente
$("selector"
) devuelve un objeto que tiene lalength
propiedad Si el selector encuentra algún elemento, se incluirá en el objeto. Entonces, si verifica su longitud, puede ver si existe algún elemento. En JavaScript0 == false
, así que si no obtienes0
tu código se ejecutará.fuente
Aquí está el ejemplo completo de diferentes situaciones y la forma de verificar si el elemento existe usando direct if en jQuery selector puede o no funcionar porque devuelve una matriz o elementos.
SOLUCIÓN FINAL
fuente
No tiene que verificar si es mayor que me
0
gusta$(selector).length > 0
,$(selector).length
es suficiente y una forma elegante de verificar la existencia de elementos. No creo que valga la pena escribir una función solo para esto, si quieres hacer más cosas adicionales, sí.fuente