2010-10-29 17 views
11

Qualcuno potrebbe mostrarmi come scorrere i tag di ancoraggio all'interno di un div e trovare il fratello successivo?JavaScript prossimo fratello?

Finora ci sono riuscito.

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

Come si esegue il loop dei collegamenti? Posso usare .nextSibling per scoprire se il fratello successivo è un div?

+1

è meglio utilizzare qualche libreria JavaScrip, jQuery per esempio – infinity

+0

non posso in questa situazione, di solito lo farei. Questo spettacolo è la mia dipendenza da queste librerie ... – JasonS

+2

Il prossimo fratello di cosa? –

risposta

17

La nextSibling proprietà di nodi DOM funziona perfettamente in tutti i browser e fa esattamente quello che ci si aspetterebbe. Se non ci sono fratelli successivi, restituisce null.

Iterating over a NodeList (che è cosa restituisce getElementsByTagName) è identico a iterare su un array utilizzando un ciclo standard for. Quanto segue iterare i link e avvisare ogni volta che trova uno il cui fratello successivo è 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); 
    } 
} 

Si noti che in non-IE browser, gli spazi bianchi tra gli elementi in HTML è considerato un nodo di testo. Potresti voler ignorare questi nodi di spazi bianchi quando consideri quale è il fratello successivo di ciascun collegamento. Di seguito lo farà:

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

Questa soluzione è quasi corretta. Tuttavia, non prende in considerazione il nodo di testo A tag. Ecco una dimostrazione di JSFiddle: http://www.jsfiddle.net/subhaze/ytCxS/ – subhaze

+0

@subhaze: Beh, suppongo che potresti dire che non era corretto per quel motivo, ma un nodo di testo è ancora un nodo tanto quanto qualsiasi altro nodo, anche se contiene solo spazi bianchi. Il vero problema è che IE non conta i nodi di testo degli spazi bianchi come veri nodi DOM mentre tutti gli altri browser lo fanno. Vale sicuramente la pena segnalarlo, quindi modificherò la mia risposta. –

+0

@subhaze: modificata la mia risposta. Penso che vorresti solo ignorare i nodi di testo degli spazi bianchi, non tutti i nodi di testo (come nel tuo esempio di jsfiddle). –

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

nextChild non è una proprietà di un nodo: https://developer.mozilla.org/en/DOM/Node – subhaze

Problemi correlati