type tag section name attribute jquery

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í.



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'')