クラスとIDによって要素内の要素を取得する-JavaScript


136

さてさて、私は以前JavaScriptを使ったことがありますが、私が書いた中で最も有用なものはCSSスタイルスイッチャーです。だから私はこれにいくらか新しいです。次のようなHTMLコードがあるとします。

<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>

「Hello world!」をどのように変更しますか 「さようなら世界!」へ ?document.getElementByClassとdocument.getElementByIdがどのように機能するかは知っていますが、もっと具体的に知りたいのですが。これが以前に尋ねられた場合は申し訳ありません。

回答:


232

さて、最初にのような関数で要素を選択する必要がありますgetElementById

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];

getElementById1つのノードのみを返しますgetElementsByClassNameが、ノードリストを返します。そのクラス名の要素は1つしかないため(私が知る限り)、最初の要素を取得できます(これ[0]は、配列のようなものです)。

次に、でHTMLを変更できます.textContent

targetDiv.textContent = "Goodbye world!";

var targetDiv = document.getElementById("foo").getElementsByClassName("bar")[0];
targetDiv.textContent = "Goodbye world!";
<div id="foo">
    <div class="bar">
        Hello world!
    </div>
</div>


1
この場合、IDで親を取得する必要はありません。document.getElementsByClassNameうまくいきます。
rvighne 2013

7
OPの正確な要件は、「より具体的になりたい」というものでした。質問をした人は、DOMツリートラバーサルでより具体的になる方法を尋ねていました。getElementByClassNameの使用は混乱のポイントではありませんでしたが、私が誰かが私が両方を必要に応じて示していたと簡単に思うかもしれないことがわかります。ではない。別のノードの下にある同じクラスの要素ではなく、特定のIDの特定のノードの下にある特定のクラスの要素のみをターゲットにする場合は、これを使用します。
Joseph Marikle 2013

1
この回答を編集.innerHtml.textContentて、コピー/貼り付けコーダーのセキュリティ上の利点のために変更するとよいでしょう。
codescribblr 2018

14

あなたはこのようにそれを行うことができます:

var list = document.getElementById("foo").getElementsByClassName("bar");
if (list && list.length > 0) {
    list[0].innerHTML = "Goodbye world!";
}

または、エラーチェックを減らして簡潔にするために、次のように1行で実行できます。

document.getElementById("foo").getElementsByClassName("bar")[0].innerHTML = "Goodbye world!";

説明では:

  1. 要素はで取得しid="foo"ます。
  2. 次に、そのオブジェクト内に含まれているオブジェクトを見つけますclass="bar"
  3. これは配列のようなnodeListを返すため、そのnodeListの最初の項目を参照します
  4. 次にinnerHTML、その項目のを設定して、その内容を変更できます。

警告:一部の古いブラウザはサポートしていませんgetElementsByClassName(例:古いバージョンのIE)。その関数が欠落している場合、その場所にシムで移動できます。


ここで、ブラウザの互換性を自分で心配するのではなく(他の人にすべての作業を任せる)、CSS3セレクタサポートが組み込まれたライブラリを使用することをお勧めします。ライブラリだけでそれを実行したい場合は、Sizzleが最適です。シズルでは、これは次のように行われます。

Sizzle("#foo .bar")[0].innerHTML = "Goodbye world!";

jQueryにはSizzleライブラリが組み込まれており、jQueryでは次のようになります。

$("#foo .bar").html("Goodbye world!");

ありがとう、document.getElementBy *で問題が発生しました。jQueryは物事をとても簡単にします。
Tanner Babcock

7

これがIE 7以下で動作する必要がある場合は、getElementsByClassNameがすべてのブラウザーに存在するわけではないことを覚えておく必要があります。このため、独自のgetElementsByClassNameを作成するか、これを試すことができます。

var fooDiv = document.getElementById("foo");

for (var i = 0, childNode; i <= fooDiv.childNodes.length; i ++) {
    childNode = fooDiv.childNodes[i];
    if (/bar/.test(childNode.className)) {
        childNode.innerHTML = "Goodbye world!";
    }
}

getElementsByClassNameIE8でも機能しませんがquerySelectorAll、その場所で使用できます(とにかくかなり)。
user113716 '19年

@Ӫ_._Ӫ...笑...あなたの正解ですが、あなたは私の答えをさらに証明するだけです。ページが複数のブラウザで機能する必要がある場合は、getElementsByClassNameに依存することはできません。jQueryは間違いなくオプションですが、上記のコードは完全にそうでしょう。
John Hartsock、2011年

はい、私はあなたの答えを支持するコメントを意味しqSAましたが、シムで使用してIE8でネイティブコードを引き続き使用できることを指摘しました。ソリューションを詳しく見ていきますが、修正が必要なものがいくつかあります。
user113716 '19年

@Ӫ_._Ӫ...何が見えるのか気になります...私はそれを見ていないからです。
John Hartsock、2011年

var i = 0, var child = fooDiv.childNodes[i]無効です。i <= fooDiv.childNodes本当に意味がありません。childNode.className.test("bar")そこにはいないchildNode変数は、文字列はありませんtest()方法を。
user113716 '19年

4

再帰関数:

function getElementInsideElement(baseElement, wantedElementID) {
    var elementToReturn;
    for (var i = 0; i < baseElement.childNodes.length; i++) {
        elementToReturn = baseElement.childNodes[i];
        if (elementToReturn.id == wantedElementID) {
            return elementToReturn;
        } else {
            return getElementInsideElement(elementToReturn, wantedElementID);
        }
    }
}

上記のサンプルには小さなバグがあります。すぐにelseパスに戻る代わりに、最初に何かが見つかったかどうかを確認する必要があります。それ以外の場合、他の子ノードはループされません。次のようなもの:if(elementToReturn){return elementToReturn; }
Jannik 2018

3

これを行う最も簡単な方法は次のとおりです。

function findChild(idOfElement, idOfChild){
  let element = document.getElementById(idOfElement);
  return element.querySelector('[id=' + idOfChild + ']');
}

またはより読みやすい:

findChild = (idOfElement, idOfChild) => {
    let element = document.getElementById(idOfElement);
    return element.querySelector(`[id=${idOfChild}]`);
}

-4

document.getElementByIDはクライアント側でのみ機能するため、IDが固定されているため、使用しないでください。以下の例のように、代わりにjqueryを使用する必要があります。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>                                                                                                             
<div id="foo">
   <div class="bar"> 
          Hello world!
     </div>
</div>

これを使って :

$("[id^='foo']").find("[class^='bar']")

// do not forget to add script tags as above

削除したい操作があれば、 "。"を追加します。背後にあり、操作を行います


10
熱核兵器を使って鹿を殺すことはできますが、少しやりすぎです。Javascriptがその基本コードでその機能を提供するときに、マルチkbのjQueryライブラリを使用して要素を選択することは、やや過剰です。
Danejir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.