2010-05-24 37 views
24
<div onclick="test(this)"> 
    Test 
    <div id="child">child</div> 
</div> 

Quiero cambiar el estilo de la div secundaria cuando se hace clic en el div principal. ¿Cómo lo hago referencia? Me gustaría ser capaz de hacer referencia a ella mediante identificación que el de la html en el div padre podría cambiar y el niño no va a ser el primer hijo, etc.javascript obtener hijo por id

function test(el){ 
    el.childNode["child"].style.display = "none"; 
} 

Algo por el estilo, en el que puedo hacer referencia a que el niño nodo por id y establece el estilo de la misma.

Gracias.

EDITAR: señala que los ID deben ser exclusivos. Así que permítanme revisar mi pregunta un poco. No me gustaría tener que crear identificaciones únicas para cada elemento que se agrega a la página. El div principal se agrega dinámicamente. (algo así como un sistema de notas de página). Y luego está este niño div. Me gustaría poder hacer algo como esto: el.getElementsByName ("options"). Item (0) .style.display = "block";

Si reemplazo el con el documento, funciona bien, pero no para cada div de opciones para niños en la página. Mientras que, quiero poder hacer clic en el div principal, y hacer que el div infantil haga algo (como ir, por ejemplo).

Si tengo que crear dinámicamente un millón (exagerado) de identificadores de div, lo haré, pero preferiría no hacerlo. ¿Algunas ideas?

+0

Además, no puedo hacer document.getElementById ("child") ya que puede haber varias identificaciones "secundarias" en la página. –

+1

no puede tener múltiples identificadores iguales en la página ... - vea http://www.w3schools.com/tags/att_standard_id.asp – oedo

+1

No puede tener elementos con la misma ID en la misma página. Si es una cosa de CSS, intente usar clases. – nc3b

Respuesta

55

En los navegadores modernos (IE8, Firefox, Chrome, Opera, Safari) que puede utilizar querySelector():

function test(el){ 
    el.querySelector("#child").style.display = "none"; 
} 

para los navegadores antiguos (< = IE7), que tendría que utilizar algún tipo de biblioteca, como Sizzle o un marco, como jQuery, para trabajar con selectores.

Como se mencionó, se supone que los ID son únicos dentro de un documento, por lo que es más fácil simplemente usar document.getElementById("child").

+0

¡Brillante! Se resuelve mediante: el.querySelector ('div [nombre = "opciones"]'). Style.display = "bloque"; Agradable para aprender nuevas funciones. –

3

document.getElementById('child') debe devolverle el elemento correcto: recuerde que la identificación debe ser única en un documento para que sea válida de todos modos.

editar: vea this page - ids DEBE ser único.

edición edición: forma alternativa para resolver el problema:.

<div onclick="test('child1')"> 
    Test 
    <div id="child1">child</div> 
</div> 

continuación, sólo tiene la función de prueba() para buscar el elemento de identificación que ha aprobado en

+0

Oye, lo siento. Agregué un comentario en mi publicación. Sin embargo, necesito que sea específico para la división padre, no para todo el documento. Escuché lo que dices con los ID ... pero, por el bien de los argumentos, ¿hay alguna forma alternativa de hacerlo? –

+0

respuesta editada para agregar una forma alternativa de hacerlo. ¡Espero eso ayude! :) – oedo

6

Si el niño siempre va a ser una etiqueta específica, entonces podría hacerlo de esta manera

function test(el) 
{ 
var children = el.getElementsByTagName('div');// any tag could be used here.. 

    for(var i = 0; i< children.length;i++) 
    { 
    if (children[i].getAttribute('id') == 'child') // any attribute could be used here 
    { 
    // do what ever you want with the element.. 
    // children[i] holds the element at the moment.. 

    } 
    } 
} 
7

Esto funciona así:

function test(el){ 
    el.childNodes.item("child").style.display = "none"; 
} 

Si el argumento del tema() es una entero, la función lo tratará como un índice. Si el argumento es una cadena, la función busca el nombre o ID del elemento.

+5

Según el elemento [w3shools.com] [http://www.w3schools.com/jsref/met_nodelist_item.asp] solo admite argumentos numéricos (índice) – Attila