2010-03-24 10 views
32

Se puede usar matchedset.find(selector)/matchedset.parents(selector) para obtener los descendientes/ancestros del conjunto coincidente actual filtrado por un selector, pero eso no incluye el conjunto combinado en sí (si le ocurre emparejar el selector también). ¿Hay una manera mejor (más concisa y/o más rápido) para tenerla queJquery: obtener ancestros (o descendientes) y uno mismo

matchedset.find(selector).add(matchedset.filter(selector)) 

y la respectiva para los padres()?

Respuesta

42

Usted puede hacer esto:

matchedset.find('*').andSelf().filter(selector); 

Para los padres:

matchedset.parents('*').andSelf().filter(selector); 
+0

¿Qué es mejor? '.find ('*')' o '.contents()' como en: http://stackoverflow.com/questions/364791/jquery-select-descendants-including-the-parent – Joe

+10

Probablemente sea una buena idea tener en cuenta que y Self está ahora en desuso y ha sido reemplazado por addBack() que también acepta un selector. http://api.jquery.com/addBack/ –

0

Busque la función "andSelf()".

+2

andSelf() no tiene un selector de – gsakkis

17

Creo que su método es eficiente en términos de tiempo de ejecución, pero lo que probablemente está pidiendo es el azúcar sintáctica. Por eso, usted podría envolverlo en un plugin:

jQuery.fn.findAndSelf = function(selector) { 
    return this.find(selector).add(this.filter(selector)) 
    } 

Entonces utilizar de esta manera:

$('.whatever').findAndSelf('.awesome') 

Si desea conseguir la suposición podría crear un plugin que funciona no sólo para 'encontrar' pero para 'padres' y 'niños' y otros complementos a base de selectores:

jQuery.fn.withSelf = function(plugin, selector) { 
    return this[plugin](selector).add(this.filter(selector)) 
    } 

Entonces será suministran como primer argumento el recorrido de plugins que desea llamar:

$('.whatever').withSelf('find', '.awesome') 
$('.whatever').withSelf('parents', '.awesome') 

Sólo por diversión, otro plugin de la diversión que le permite llamar a un número arbitrario de plugins de recorrido de todos a la vez:

jQuery.fn.traverse = function(plugins, selector) { 
    var set = new jQuery(); 
    $.each(plugins, function(i, val) { 
     set.add(this[val](selector)); 
    } 
    return set 
    } 

Se podría invocar éste con cualquier combinación de complementos a base de selectores, de la siguiente manera :

$('.whatever').traverse(['find','filter'], '.awesome') 
$('.whatever').traverse(['parents','find'], '.awesome') 
$('.whatever').traverse(['parents', 'filter'], '.awesome') 
2

Mientras que la solución de Jeoff es agradable, a veces es bueno ser capaz de recorrer todos los elementos, incluyendo a sí misma sin un selector. Este complemento es un poco más flexible:

$.fn.all = function(selector) { 
    if(selector===window.undefined) return this.find('*').andSelf(); 
    return this.filter(selector).add(this.find(selector)); 
}; 
0

Para los padres que tienen closest(selector)

Cuestiones relacionadas