web-dev-qa-db-ja.com

クラス名で子要素を取得する方法は?

クラス= 4の子スパンを取得しようとしています。以下に要素の例を示します。

<div id="test">
 <span class="one"></span>
 <span class="two"></span>
 <span class="three"></span>
 <span class="four"></span>
</div>

私が利用できるツールは、JSとYUI2です。私はこのようなことをすることができます:

doc = document.getElementById('test');
notes = doc.getElementsByClassName('four');

//or

doc = YAHOO.util.Dom.get('#test');
notes = doc.getElementsByClassName('four');

これらはIEでは機能しません。オブジェクト(doc)がこのメソッドまたはプロパティ(getElementsByClassName)をサポートしていないというエラーが表示されます。 getElementsByClassNameのクロスブラウザー実装の例をいくつか試しましたが、それらを動作させることができず、まだそのエラーが発生しました。

必要なのはクロスブラウザのgetElementsByClassNameか、doc.getElementsByTagName( 'span')を使用してクラス4が見つかるまでループスルーする必要があると思います。しかし、その方法はわかりません。

82
spyderman4g63

doc.childNodesを使用して各spanを反復処理し、className4と等しいフィルターをフィルター処理します。

var doc = document.getElementById("test");
var notes = null;
for (var i = 0; i < doc.childNodes.length; i++) {
    if (doc.childNodes[i].className == "4") {
      notes = doc.childNodes[i];
      break;
    }        
}

64
João Silva

QuerySelectorとquerySelectorAllを使用します

var testContainer = document.querySelector('#test');
var fourChildNode = testContainer.querySelector('.four');

IE9以降

;)

58

受け入れられた回答は、直近の子のみをチェックします。多くの場合、そのクラス名を持つ子孫を探しています。

また、がclassNameを含む子が必要な場合があります。

例:<div class="img square"></div>は、exactclassNameが「img」ではないにもかかわらず、className「img」の検索に一致する必要があります。

これらの問題の両方に対する解決策は次のとおりです。

クラスclassNameを持つ子孫要素の最初のインスタンスを見つける

   function findFirstChildByClass(element, className) {
        var foundElement = null, found;
        function recurse(element, className, found) {
            for (var i = 0; i < element.childNodes.length && !found; i++) {
                var el = element.childNodes[i];
                var classes = el.className != undefined? el.className.split(" ") : [];
                for (var j = 0, jl = classes.length; j < jl; j++) {
                    if (classes[j] == className) {
                        found = true;
                        foundElement = element.childNodes[i];
                        break;
                    }
                }
                if(found)
                    break;
                recurse(element.childNodes[i], className, found);
            }
        }
        recurse(element, className, false);
        return foundElement;
    }
42
Augie Gardner

私には、4番目のスパンが必要なようです。もしそうなら、あなたはこれを行うことができます:

document.getElementById("test").childNodes[3]

または

document.getElementById("test").getElementsByTagName("span")[3]

この最後のものは、それを台無しにする可能性のある隠しノードがないことを保証します。

あなたが試すことができます:

notes = doc.querySelectorAll('.4');

または

notes = doc.getElementsByTagName('*');
for (var i = 0; i < notes.length; i++) { 
    if (notes[i].getAttribute('class') == '4') {
    }
}
6
Korikulum

ただし、古いブラウザはgetElementsByClassNameをサポートしていないことに注意してください。

その後、次のことができます

function getElementsByClassName(c,el){
    if(typeof el=='string'){el=document.getElementById(el);}
    if(!el){el=document;}
    if(el.getElementsByClassName){return el.getElementsByClassName(c);}
    var arr=[],
        allEls=el.getElementsByTagName('*');
    for(var i=0;i<allEls.length;i++){
        if(allEls[i].className.split(' ').indexOf(c)>-1){arr.Push(allEls[i])}
    }
    return arr;
}
getElementsByClassName('4','test')[0];

動作しているようですが、HTMLクラス

  • 文字で始まる必要があります:A-Zまたはa-z
  • 後に文字(A-Za-z)、数字(0-9)、ハイフン( "-")、および下線( "_")を続けることができます
4
Oriol

IDの名前はgetElementByIdを使用し、その前に#記号を付けないでください。次に、spanを使用してgetElementsByTagName子ノードを取得し、それらをループして適切なクラスを持つノードを見つけます。

var doc = document.getElementById('test');

var c = doc.getElementsByTagName('span');

var e = null;
for (var i = 0; i < c.length; i++) {
    if (c[i].className == '4') {
        e = c[i];
        break;
    }
}

if (e != null) {
    alert(e.innerHTML);
}

デモ: http://jsfiddle.net/Guffa/xB62U/

3
Guffa

Element.querySelector()を使用します。想定してみましょう。「myElement」は、すでに持っている親要素です。 「sonClassName」は、探している子のクラスです。

let child = myElement.querySelector('.sonClassName');

詳細については、次を参照してください: https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector

1
Hamza Dahmoun

これは、比較的単純な再帰的なソリューションです。ここでは幅優先の検索が適切だと思います。これは、見つかったクラスに一致する最初の要素を返します。

function getDescendantWithClass(element, clName) {
    var children = element.childNodes;
    for (var i = 0; i < children.length; i++) {
        if (children[i].className &&
            children[i].className.split(' ').indexOf(clName) >= 0) {
            return children[i];
         }
     }
     for (var i = 0; i < children.length; i++) {
         var match = getDescendantWithClass(children[i], clName);
         if (match !== null) {
             return match;
         }
     }
     return null;
}
1
Jer

私の意見では、できる限り、Arrayとそのメソッドを使用する必要があります。 DOM /ラッパー全体をループしたり、空の配列にデータをプッシュしたりするよりもはるかに高速です。ここに提示されているソリューションの大半は、ここで説明されているようにNaiveに電話することができます(素晴らしい記事です)。

https://medium.com/@chuckdries/traversing-the-dom-with-filter-map-and-arrow-functions-1417d326d2bc

私のソリューション:(Codepenのライブプレビュー: https://codepen.io/Nikolaus91/pen/wEGEYe

const wrapper = document.getElementById('test') // take a wrapper by ID -> fastest
const itemsArray = Array.from(wrapper.children) // make Array from his children

const pickOne = itemsArray.map(item => { // loop over his children using .map() --> see MDN for more
   if(item.classList.contains('four')) // we place a test where we determine our choice
     item.classList.add('the-chosen-one') // your code here
})
1
user2795540

ES6の2018年6月の更新

    const doc = document.getElementById('test');
    let notes = null;
    for (const value of doc) {
        if (value.className === '4') {
            notes = value;
            break;
        }    
    }
0

Jqueryを使用してこれを行う方法は、次のようなものです。

vartargetedchild = $( "#test")。children()。find( "span.four");

0
Marselus Chia