Come ottengo l'elemento successivo in HTML utilizzando JavaScript?
Supponiamo che io abbia tre <div>se ottengo un riferimento a uno nel codice JavaScript, voglio ottenere quale è il successivo <div>e quale è il precedente.
Come ottengo l'elemento successivo in HTML utilizzando JavaScript?
Supponiamo che io abbia tre <div>se ottengo un riferimento a uno nel codice JavaScript, voglio ottenere quale è il successivo <div>e quale è il precedente.
Risposte:
Bene, in puro javascript il mio pensiero è che dovresti prima raccoglierli all'interno di una raccolta.
var divs = document.getElementsByTagName("div");
//divs now contain each and every div element on the page
var selectionDiv = document.getElementById("MySecondDiv");
Quindi fondamentalmente con selectionDiv iterare attraverso la raccolta per trovare il suo indice, e quindi ovviamente -1 = precedente +1 = successivo entro i limiti
for(var i = 0; i < divs.length;i++)
{
if(divs[i] == selectionDiv)
{
var previous = divs[i - 1];
var next = divs[i + 1];
}
}
Si prega di essere consapevoli, però, mentre dico che sarebbe necessaria una logica extra per verificare di essere entro i limiti, cioè non si è alla fine o all'inizio della raccolta.
Questo significherà anche che hai un div che ha un div figlio nidificato. Il div successivo non sarebbe un fratello ma un figlio, quindi se vuoi solo fratelli allo stesso livello del div di destinazione, usa definitivamente nextSibling controllando la proprietà tagName .
usa le proprietà nextSiblinge previousSibling:
<div id="foo1"></div>
<div id="foo2"></div>
<div id="foo3"></div>
document.getElementById('foo2').nextSibling; // #foo3
document.getElementById('foo2').previousSibling; // #foo1
Tuttavia in alcuni browser (non ricordo quale) è necessario controllare anche gli spazi bianchi e i nodi di commento:
var div = document.getElementById('foo2');
var nextSibling = div.nextSibling;
while(nextSibling && nextSibling.nodeType != 1) {
nextSibling = nextSibling.nextSibling
}
Librerie come jQuery gestiscono tutti questi controlli cross-browser per te fuori dagli schemi.
divnel markup potrebbe non essere adiacente all'elemento; potrebbe essere un livello più profondo o un livello più alto.
if i write dirty HTML, Javascript will act strangeche ne dici di scrivere un html pulito e valido?
Dipende davvero dalla struttura generale del tuo documento.
Se hai:
<div></div>
<div></div>
<div></div>
può essere semplice come attraversare usando
mydiv.nextSibling;
mydiv.previousSibling;
Tuttavia, se il div "successivo" potesse trovarsi in un punto qualsiasi del documento, avrai bisogno di una soluzione più complessa. Potresti provare qualcosa usando
document.getElementsByTagName("div");
e correndo attraverso questi per arrivare dove vuoi in qualche modo.
Se stai eseguendo molti traversamenti DOM complessi come questo, ti consiglio di guardare in una libreria come jQuery.
C'è un attributo su ogni HTMLElement, "previousElementSibling".
Ex:
<div id="a">A</div>
<div id="b">B</div>
<div id="c">c</div>
<div id="result">Resultado: </div>
var b = document.getElementById("c").previousElementSibling;
document.getElementById("result").innerHTML += b.innerHTML;
previousSiblingsembra essere la soluzione cross browser.
tutte queste soluzioni sembrano eccessive. Perché utilizzare la mia soluzione?
previousElementSibling supportato da IE9
document.addEventListener ha bisogno di un polyfill
previousSibling potrebbe restituire un testo
Si prega di notare che ho scelto di restituire il primo / ultimo elemento nel caso in cui i confini siano interrotti. In un utilizzo RL, preferirei che restituisse un valore nullo.
var el = document.getElementById("child1"),
children = el.parentNode.children,
len = children.length,
ind = [].indexOf.call(children, el),
nextEl = children[ind === len ? len : ind + 1],
prevEl = children[ind === 0 ? 0 : ind - 1];
document.write(nextEl.id);
document.write("<br/>");
document.write(prevEl.id);
<div id="parent">
<div id="child1"></div>
<div id="child2"></div>
</div>
L'ho testato e ha funzionato per me. L'elemento che mi trova cambia in base alla struttura del documento che hai.
<html>
<head>
<script type="text/javascript" src="test.js"></script>
</head>
<body>
<form method="post" id = "formId" action="action.php" onsubmit="return false;">
<table>
<tr>
<td>
<label class="standard_text">E-mail</label>
</td>
<td><input class="textarea" name="mail" id="mail" placeholder="E-mail"></label></td>
<td><input class="textarea" name="name" id="name" placeholder="E-mail"> </label></td>
<td><input class="textarea" name="myname" id="myname" placeholder="E-mail"></label></td>
<td><div class="check_icon icon_yes" style="display:none" id="mail_ok_icon"></div></td>
<td><div class="check_icon icon_no" style="display:none" id="mail_no_icon"></div></label></td>
<td><div class="check_message" style="display:none" id="mail_message"><label class="important_text">The email format is not correct!</label></div></td>
</tr>
</table>
<input class="button_submit" type="submit" name="send_form" value="Register"/>
</form>
</body>
</html>
var inputs;
document.addEventListener("DOMContentLoaded", function(event) {
var form = document.getElementById('formId');
inputs = form.getElementsByTagName("input");
for(var i = 0 ; i < inputs.length;i++) {
inputs[i].addEventListener('keydown', function(e){
if(e.keyCode == 13) {
var currentIndex = findElement(e.target)
if(currentIndex > -1 && currentIndex < inputs.length) {
inputs[currentIndex+1].focus();
}
}
});
}
});
function findElement(element) {
var index = -1;
for(var i = 0; i < inputs.length; i++) {
if(inputs[i] == element) {
return i;
}
}
return index;
}