JavaScriptを使用して次/前の要素を取得しますか?


107

JavaScriptを使用してHTMLの次の要素を取得するにはどうすればよいですか?

3つ<div>のがあり、JavaScriptコードで1への参照を取得した場合、どちらが次で<div>、どちらが前かを取得したいとします。

回答:


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
良い解決策を縫い合わせますが、次の要素を取得する方法、あなたが今書いたように、私はコレクションと選択されたものを持っています、あなたは私をさらに助けてもらえますか?
Amr Elgarhy、2009

248

nextSiblingおよびpreviousSiblingプロパティを使用します。

<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

9
nextSiblingもnextElementSiblingもブラウザ間で完全に互換性がないことに注意してください。FirefoxのnextSiblingはテキストノードを返しますが、IEはそうではなく、nextElementsiblingはIE9まで実装されていません。
Carl Onager

2
要素が兄弟でない場合、これは機能しません。
rvighne 2014年

1
@Kloar:「htmlの次の[div]要素」を取得する方法を質問しました。divマークアップの次は要素に隣接していない可能性があります。より深いレベルまたはより高いレベルの可能性があります。
rvighne 2014年

1
@leonbloyコメントが理解できません。基本的には、if i write dirty HTML, Javascript will act strangeクリーンで有効なhtmlを書くことについてどう言っていますか?
認知症

28

文書の全体的な構造に本当に依存します。

あなたが持っている場合:

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

を使用してトラバースするのと同じくらい簡単かもしれません

mydiv.nextSibling;
mydiv.previousSibling;

ただし、「次の」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 2013年

14

これは簡単です...純粋なJavaScriptコード

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

6

これらすべてのソリューションは過剰に見えます。なぜ私のソリューションを使用するのですか?

previousElementSibling IE9からサポート

document.addEventListener ポリフィルが必要

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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.