El método transversal jQuery find (..) no incluye el nodo actual, comienza con los hijos del nodo actual. ¿Cuál es la mejor manera de llamar a una operación de búsqueda que incluye el nodo actual en su algoritmo de coincidencia? Mirando a través de los documentos, nada me sobresalta de inmediato.
134
'selector'
dos veces hace que la encapsulación sea más deseable. YMMV'selector'
dos veces, (como mencionó @ronen), ¿no podrías simplemente usarloobject.parent().find('selector')
? - Dicho esto, me gusta la idea de una biblioteca que lo haga por ti.object.parent().find('selector')
incluye hermanos deobject
y sus descendientes.No puedes hacer esto directamente, lo más cerca que puedo pensar es en usar
.andSelf()
y llamar.filter()
, así:Lamentablemente
.andSelf()
no lleva un selector, lo que sería útil.fuente
closest(..)
incluye el elemento DOM actual y el árbol hacia arriba, mientras que todos los métodos de recorrido hacia abajo del árbol, comofind(..)
etc., no coinciden con el elemento actual. Es como si el equipo de jQuery los implementara a propósito para que no se superpusieran cuando ambas operaciones se usaran juntas para una búsqueda vertical completa.Definir
luego usa
en vez de
Lamentablemente, jQuery no tiene esto incorporado. Realmente extraño por tantos años de desarrollo. Mis controladores AJAX no se aplicaron a algunos elementos principales debido a cómo funciona .find ().
fuente
filter()
allí, lo que tiene más sentido.Puede almacenar
$('selector')
en una variable para acelerar. Incluso puede escribir una función personalizada para esto si la necesita mucho:fuente
$('selector').find('otherSelector').add($('otherSelector'))
, lo que tienes ahora es equivalente a.andSelf()
. Por último, el.andFind()
filtro no se basa en la expresión, necesitarías.add($(this).filter(expr))
:)$('selector')
se reemplaza por algún otro método para obtener un objeto jQuery (si eso es lo que quiso decir al no comenzar con un selector),add()
puede manejar cualquier cosa de la misma manera$()
.$('selector')
puede ser$('selector').children('filter').closest('.class').last()
... puede estar en una cadena y no tiene idea de cuál es el objeto que está agregando, por lo que la solución genérica debería tomar el objeto anterior como lo hace el filtro :)this
es cualquier objeto jQuery en el que se invocó un complemento También podría ser el resultado de una cadena de llamadas.La respuesta aceptada es muy ineficiente y filtra el conjunto de elementos que ya coinciden.
fuente
Si desea que el encadenamiento funcione correctamente, use el fragmento a continuación.
Después de la llamada de la función final, devuelve el elemento #foo.
Sin definir complementos adicionales, estás atascado con esto.
fuente
this
hay más de un elementothis.is()
ya está satisfecho si solo uno de ellos coincide.En caso de que esté buscando exactamente un elemento , ya sea el elemento actual o uno dentro de él, puede usar:
En caso de que esté buscando múltiples elementos , puede usar:
El uso de
andSelf
/andBack
es bastante raro, no estoy seguro de por qué. Quizás por los problemas de rendimiento que algunos tipos mencionaron antes que yo.(Ahora noté que Tgr ya dio esa segunda solución)
fuente
Sé que esta es una vieja pregunta, pero hay una forma más correcta. Si el orden es importante, por ejemplo, cuando está haciendo coincidir un selector como
:first
, escribí una pequeña función que devolverá exactamente el mismo resultado que sifind()
realmente incluyera el conjunto actual de elementos:No va a ser eficiente de ninguna manera, pero es lo mejor que he encontrado para mantener el orden adecuado.
fuente
Creo que
andSelf
es lo que quieres:Tenga en cuenta que esto siempre volverá a agregar el nodo actual, ya sea que coincida o no con el selector.
fuente
Si está buscando estrictamente en los nodos actuales, simplemente simplemente haga
fuente
Estaba tratando de encontrar una solución que no se repita (es decir, no ingresar el mismo selector dos veces).
Y esta pequeña extensión jQuery lo hace:
Combina
find()
(solo descendientes) confilter()
(solo conjunto actual) y admite cualquier argumento que ambos coman. ElpushStack()
permite.end()
trabajar como se esperaba.Usar así:
fuente
Aquí está la verdad correcta (pero triste):
http://jsfiddle.net/SergeJcqmn/MeQb8/2/
fuente
$(selector)
del conjunto en todos los casos.