tag - Buscando el método jQuery find(..) que incluye el nodo actual
tag jquery (11)
El método transversal jQuery find(..) no incluye el nodo actual; comienza con los elementos secundarios 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 salta de inmediato hacia mí.
Aquí está la verdad correcta (pero triste):
$(selector).parent().find(oSelector).filter($(selector).find(''*''))
Definir
$.fn.findSelf = function(selector) {
var result = this.find(selector);
return (this.is(selector)) ?
result.add(this) : result;
};
luego usa
$.findSelf(selector);
en lugar de
$find(selector);
Tristemente 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 ().
En caso de que esté buscando exactamente un elemento , ya sea elemento actual o uno dentro, puede usar:
result = elem.is(selector) ? elem : elem.find(selector);
En caso de que esté buscando múltiples elementos , puede usar:
result = elem.filter(selector).add(elem.find(selector));
El uso de andSelf
/ andBack
es bastante raro, no estoy seguro de por qué. Tal vez debido a los problemas de rendimiento que algunos chicos mencionaron antes que yo.
(Ahora noté que Tgr ya dio esa segunda solución)
La respuesta aceptada es muy ineficiente y filtra el conjunto de elementos que ya están apareados.
//find descendants that match the selector
var $selection = $context.find(selector);
//filter the parent/context based on the selector and add it
$selection = $selection.add($context.filter(selector);
No se puede hacer esto directamente, lo más cercano que se me ocurre es usar .andSelf()
y llamar a .filter()
, así:
$(selector).find(oSelector).andSelf().filter(oSelector)
//or...
$(selector).find(''*'').andSelf().filter(oSelector);
Desafortunadamente .andSelf()
no toma un selector, que sería útil.
Para jQuery 1.8 y superior, puede usar .addBack()
. Se necesita un selector para que no necesite filtrar el resultado:
object.find(''selector'').addBack(''selector'')
Antes de jQuery 1.8, usted estaba atascado con .addBack() , (ahora obsoleto y eliminado) que luego necesitaba filtrado:
object.find(''selector'').andSelf().filter(''selector'')
Sé que esta es una vieja pregunta, pero hay una manera más correcta. Si el orden es importante, por ejemplo, cuando hace coincidir un selector como :first
, escribí una pequeña función que devolverá exactamente el mismo resultado que si find()
realmente incluyera el conjunto actual de elementos:
$.fn.findAll = function(selector) {
var $result = $();
for(var i = 0; i < this.length; i++) {
$result = $result.add(this.eq(i).filter(selector));
$result = $result.add(this.eq(i).find(selector));
}
return $result.filter(selector);
};
No va a ser eficiente de ninguna manera, pero es lo mejor que he encontrado para mantener el orden correcto.
Si desea que el encadenamiento funcione correctamente, use el siguiente fragmento.
$.fn.findBack = function(expr) {
var r = this.find(expr);
if (this.is(expr)) r = r.add(this);
return this.pushStack(r);
};
Después de la llamada de la función final, devuelve el elemento #foo.
$(''#foo'')
.findBack(''.red'')
.css(''color'', ''red'')
.end()
.removeAttr(''id'');
Sin definir complementos adicionales, estás atascado con esto.
$(''#foo'')
.find(''.red'')
.addBack(''.red'')
.css(''color'', ''red'')
.end()
.end()
.removeAttr(''id'');
Si está buscando estrictamente en el (los) nodo (s) actual (es) simplemente lo hace
$(html).filter(''selector'')
Yo pienso y .andSelf() es lo que quieres:
obj.find(selector).andSelf()
Tenga en cuenta que esto siempre volverá a agregar el nodo actual, coincida o no con el selector.
$(''selector'').find(''otherSelector'').add($(''selector'').filter(''otherSelector''))
Puede almacenar $(''selector'')
en una variable para acelerar. Incluso puede escribir una función personalizada para esto si la necesita mucho:
$.fn.andFind = function(expr) {
return this.find(expr).add(this.filter(expr));
};
$(''selector'').andFind(''otherSelector'')