使用JavaScript获取下一个/上一个元素?


107

如何使用JavaScript获取HTML中的下一个元素?

假设我有三个<div>s,并且在JavaScript代码中获得了对一个s的引用,那么我想获取哪个是下一个<div>,哪个是前一个。

Answers:


29

在纯JavaScript中,我的想法是您首先必须将它们归类到一个集合中。

var divs = document.getElementsByTagName("div");
//divs now contain each and every div element on the page
var selectionDiv = document.getElementById("MySecondDiv");

因此,基本上,使用selectionDiv遍历集合以查找其索引,然后显然是-1 =上一个+1 =下一个在范围内

for(var i = 0; i < divs.length;i++)
{
   if(divs[i] == selectionDiv)
   {
     var previous = divs[i - 1];
     var next = divs[i + 1];
   }
}

但是请注意,正如我所说的那样,需要额外的逻辑来检查您是否在范围之内,即您不在集合的末尾还是开始。

这也意味着您拥有一个嵌套有子div的div。下一个div不会是兄弟姐妹,而是孩子。因此,如果您只希望与目标div处于同一级别的兄弟姐妹,则可以使用nextSibling检查tagName属性。


1
可以找到一个好的解决方案,但是如何获得下一个元素,正如您现在所写的那样,我有该集合和选定的一个,您能帮我更多的忙吗?
2009年

248

使用nextSiblingpreviousSibling属性:

<div id="foo1"></div>
<div id="foo2"></div>
<div id="foo3"></div>

document.getElementById('foo2').nextSibling; // #foo3
document.getElementById('foo2').previousSibling; // #foo1

但是,在某些浏览器(我忘记了哪个浏览器)中,您还需要检查空格和注释节点:

var div = document.getElementById('foo2');
var nextSibling = div.nextSibling;
while(nextSibling && nextSibling.nodeType != 1) {
    nextSibling = nextSibling.nextSibling
}

像jQuery这样的库为您提供了所有这些跨浏览器检查功能。


60
nextElementSibling更有用。
Trisped 2012年

9
请注意,nextSibling和nextElementSibling都不完全兼容跨浏览器。Firefox的nextSibling返回文本节点,而IE则不,并且nextElementsibling直到IE9才实现。
卡尔·奥纳格尔

2
如果元素不是同级元素,则将无法使用。
rvighne 2014年

1
@Kloar:问题询问如何获取“ html中的下一个[div]元素”。div标记中的下一个可能与该元素不相邻;它可能更深或更高级。
rvighne 2014年

1
@leonbloy我不明白您的评论。您基本上是说if i write dirty HTML, Javascript will act strange写干净有效的html怎么样?
痴呆症'17

28

确实取决于您文档的整体结构。

如果你有:

<div></div>
<div></div>
<div></div>

它可能像使用遍历一样简单

mydiv.nextSibling;
mydiv.previousSibling;

但是,如果“ next” div可以在文档中的任何位置,则需要更复杂的解决方案。您可以尝试使用

document.getElementsByTagName("div");

然后遍历这些内容,以某种方式到达您想要的地方。

如果您要进行许多此类的复杂DOM遍历,则建议您查看jQuery之类的库。


2
我认为nextSibling()..应该是nextSibling
paul_h

21

每个HTMLElement都有一个属性“ previousElementSibling”。

例如:

<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;

直播:http//jsfiddle.net/QukKM/


这在IE8上失败(未在其他IE版本上检查)。previousSibling似乎是跨浏览器解决方案。
Niks

14

这将很容易...纯JavaScript代码

    <script>
           alert(document.getElementById("someElement").previousElementSibling.innerHTML);
    </script>

6

所有这些解决方案看起来都不过分。为什么使用我的解决方案?

previousElementSibling IE9支持

document.addEventListener 需要一个polyfill

previousSibling 可能会传回文字

请注意,如果边界被打破,我选择返回第一个/最后一个元素。在RL用法中,我希望它返回null。

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>


0

测试了它,对我有用。寻找我的元素会根据您拥有的文档结构进行更改。

<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;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.