Como obtenho o próximo elemento em HTML usando JavaScript?
Suponha que eu tenha três se <div>
obtenho uma referência a um no código JavaScript, desejo saber qual é o próximo <div>
e qual é o anterior.
Como obtenho o próximo elemento em HTML usando JavaScript?
Suponha que eu tenha três se <div>
obtenho uma referência a um no código JavaScript, desejo saber qual é o próximo <div>
e qual é o anterior.
Respostas:
Bem, em javascript puro, meu pensamento é que primeiro você teria que agrupá-los dentro de uma coleção.
var divs = document.getElementsByTagName("div");
//divs now contain each and every div element on the page
var selectionDiv = document.getElementById("MySecondDiv");
Então, basicamente com selectionDiv iterar através da coleção para encontrar seu índice, e então, obviamente, -1 = anterior +1 = próximo dentro dos limites
for(var i = 0; i < divs.length;i++)
{
if(divs[i] == selectionDiv)
{
var previous = divs[i - 1];
var next = divs[i + 1];
}
}
Porém, esteja ciente de que, como eu disse, uma lógica extra seria necessária para verificar se você está dentro dos limites, ou seja, você não está no final ou no início da coleção.
Isso também significa que você tem um div que tem um div filho aninhado. O próximo div não seria um irmão, mas um filho. Portanto, se você deseja apenas irmãos no mesmo nível do div de destino, use a verificação de nextSibling na propriedade tagName .
use as propriedades nextSibling
e previousSibling
:
<div id="foo1"></div>
<div id="foo2"></div>
<div id="foo3"></div>
document.getElementById('foo2').nextSibling; // #foo3
document.getElementById('foo2').previousSibling; // #foo1
No entanto, em alguns navegadores (esqueci qual), você também precisa verificar se há espaços em branco e nós de comentário:
var div = document.getElementById('foo2');
var nextSibling = div.nextSibling;
while(nextSibling && nextSibling.nodeType != 1) {
nextSibling = nextSibling.nextSibling
}
Bibliotecas como o jQuery lidam com todas essas verificações cross-browser para você imediatamente.
div
na marcação pode não ser adjacente ao elemento; pode ser um nível mais profundo ou um nível mais alto.
if i write dirty HTML, Javascript will act strange
que tal escrever html limpo e válido?
Realmente depende da estrutura geral do seu documento.
Se você tem:
<div></div>
<div></div>
<div></div>
pode ser tão simples quanto percorrer usando
mydiv.nextSibling;
mydiv.previousSibling;
No entanto, se o 'próximo' div puder estar em qualquer lugar do documento, você precisará de uma solução mais complexa. Você poderia tentar algo usando
document.getElementsByTagName("div");
e examiná-los para chegar onde você deseja de alguma forma.
Se você estiver fazendo muitas travessias de DOM complexas como essa, recomendo procurar uma biblioteca como a jQuery.
Há um atributo em cada 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;
Ao vivo: http://jsfiddle.net/QukKM/
previousSibling
parece ser a solução para vários navegadores.
todas essas soluções parecem um exagero. Por que usar minha solução?
previousElementSibling
suportado pelo IE9
document.addEventListener
precisa de um polyfill
previousSibling
pode retornar um texto
Observe que escolhi retornar o primeiro / último elemento caso os limites sejam quebrados. Em um uso de RL, eu preferiria que ele retornasse um valor nulo.
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>
Testei e funcionou para mim. O elemento que me encontra muda de acordo com a estrutura do documento que você tem.
<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;
}