2010-10-29 11 views
11

¿Podría alguien mostrarme cómo recorrer las etiquetas de anclaje dentro de un div y encontrar el siguiente hermano?JavaScript next sister?

Tengo esto hasta ahora.

var menu = document.getElementById('menu'); 
var links = menu.getElementsByTagName('a'); 

¿Cómo recorro los enlaces? ¿Puedo usar .nextSibling para encontrar si el siguiente hermano es un div?

+1

es mejor utilizar alguna biblioteca JavaScrip, jQuery por ejemplo – infinity

+0

no puedo en esta situación, por lo general lo haría. Esto solo muestra mi dependencia de tales bibliotecas ... – JasonS

+2

¿El próximo hermano de qué? –

Respuesta

17

El nextSibling propiedad de los nodos DOM funciona perfectamente en todos los navegadores y hace exactamente lo que se espera. Si no hay un próximo hermano, devuelve null.

iterar sobre un NodeList (que es lo getElementsByTagName devoluciones) es idéntica a iterar sobre una matriz mediante un bucle estándar for. A continuación se iterar sobre los enlaces y alertar cada vez que encuentre uno cuyo hermano siguiente es un <div>:

var menu = document.getElementById('menu'); 
var links = menu.getElementsByTagName('a'); 

// Iterate over the links 
for (var i = 0, len = links.length, link; i < len; ++i) { 
    link = links[i]; 
    if (link.nextSibling && link.nextSibling.nodeName == "DIV") { 
     alert("Next sibling is DIV! " + link.innerHTML); 
    } 
} 

Tenga en cuenta que en la no-IE navegadores, los espacios en blanco entre los elementos en HTML se considera un nodo de texto. Es posible que desee ignorar estos nodos de espacio en blanco al considerar cuál es el siguiente hermano de cada enlace. A continuación se hará lo siguiente:

function isWhitespace(node) { 
    return node.nodeType == 3 && /^\s*$/.test(node.data); 
} 

// Iterate over the links 
for (var i = 0, len = links.length, link, next; i < len; ++i) { 
    link = links[i]; 
    next = link.nextSibling; 
    if (next && isWhitespace(next)) { 
     next = next.nextSibling; 
    } 
    if (next && next.nodeName == "DIV") { 
     alert("Next sibling is DIV! " + link.innerHTML); 
    } 
} 
+0

Esta solución es casi correcta. Sin embargo, no tiene en cuenta el nodo de texto A tags. Aquí hay una demostración de JSFiddle: http://www.jsfiddle.net/subhaze/ytCxS/ – subhaze

+0

@subhaze: Bueno, supongo que se podría decir que era incorrecto por esa razón, pero un nodo de texto sigue siendo un nodo tanto como cualquier otro nodo, incluso si solo contiene espacios en blanco. El verdadero problema es que IE no cuenta los nodos de texto en espacio en blanco como nodos DOM reales, mientras que el resto de navegadores lo hacen. Definitivamente vale la pena señalarlo, así que corregiré mi respuesta. –

+0

@subhaze: Enmendé mi respuesta. Creo que solo querría ignorar los nodos de texto en espacio en blanco, no cualquier nodo de texto (como en su ejemplo de jsfiddle). –

0
for(var i=0; i<links.length; i++) {  
if (links[i].nextChild.nodeName=="DIV") 
    alert("This is a DIV") 
} 
+2

nextChild no es propiedad de un nodo: https://developer.mozilla.org/en/DOM/Node – subhaze

Cuestiones relacionadas