2011-01-29 12 views
23

Esto podría ser un tipo de pregunta sí/no.Inhabilitación recursiva de todos los elementos secundarios de un elemento

Estoy tratando de deshabilitar absolutamente todos los elementos secundarios de un elemento en jquery.

¿El llamar

$('#id_of_an_element').children().do(function(){ 
    do_something; 
}); 

llaman recursivamente todos los hijos de un elemento, o solo do_something a todos los descendientes directos de ?

ayuda se agradece,

Josh

+0

¿Qué esperas hacer?Es posible que no necesite afectar a cada descendiente individual. – user113716

Respuesta

61

Dado un objeto jQuery que representa un conjunto de elementos DOM, los .children() método nos permite buscar a través de los hijos inmediatos de estos elementos en el árbol DOM y construir un nuevo objeto jQuery a partir de los elementos coincidentes. Los métodos .find() y .children() son similares, excepto que el último solo viaja un solo nivel en el árbol DOM. Tenga en cuenta también que al igual que la mayoría de los métodos jQuery, .children() no devuelve los nodos de texto ; para obtener todos los niños incluyendo texto y comentarios nodos, use .contents().

http://api.jquery.com/children/

Usted puede hacer esto si quiere actuar sobre todos los descendientes en cualquier nivel de anidamiento:

$('#id_of_an_element').find('*').attr('disabled', true); 

o mediante el selector descendiente:

$('#id_of_an_element *').attr('disabled', true); 
+0

¡Funciona para mí, gracias! – jherax

+3

Es posible que deba ajustarse ligeramente para _properties_, como 'disabled', que se diferencian de _attributes_ en las versiones más recientes de jQuery. "A partir de jQuery 1.6, el método [.prop()] (http://api.jquery.com/prop/) proporciona una forma de recuperar explícitamente valores de propiedades, mientras que .attr() recupera atributos." –

+0

buena solución !!! – sony

2

Usted puede hacer

function disableChildren(obj) { 
    obj.children().each(function(i, val) { 
     disable(val); 
     disableChildren(val); 
    }); 
} 

disableChildren($("#id")); 

Consulte .each No parece haber un método .do.

Vas a tener que poner en práctica disable en función de hacer lo que todos los que quiera, cuando usted dice "desactivar"

5

Puesto que usted quiere afectar a todos los descendientes, simplemente hacer esto:

$('#id_of_an_element *').each(function() { 
    // do something 
}); 

Pero me gustaría saber qué estás haciendo exactamente. La propiedad disabled no tiene sentido para muchos tipos de elementos. Podría ser que lo que sea que esté haciendo se beneficiará de la herencia de CSS.

O si realmente desea la propiedad disabled, entonces también puede orientar los elementos a form.

$('#id_of_an_element :input').attr('disabled','disabled'); 
+2

+1 buen punto sobre el selector ': input'. Definitivamente tiene más sentido que pasar por encima de todos los descendientes. – karim79

+0

@ karim79: Gracias. Es difícil decir cuál es el mejor, pero apostaría a que la solución adecuada para lo que OP está haciendo no implicará '*'. Sin embargo, podría estar equivocado. – user113716

Cuestiones relacionadas