[javascript] 클래스 이름으로 자식 요소를 얻는 방법?

클래스 = 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를 찾을 때까지 반복해야합니다. 그래도 어떻게 해야할지 모르겠습니다.



답변

사용하여 doc.childNodes각각의 반복에 span, 그리고 그 하나의 필터 className같음 4:

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


답변

querySelector 및 querySelectorAll 사용

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

IE9 이상

😉


답변

허용 된 답변은 직계 어린이 만 확인합니다. 종종 우리는 그 클래스 이름을 가진 자손을 찾고 있습니다.

또한 때로는 className 을 포함 하는 자식을 원할 수도 있습니다 .

예를 들어 : <div class="img square"></div>그것은, 비록 클래스 명 “IMG”에 대한 검색과 일치해야 정확한 클래스 이름은 “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;
    }


답변

element.querySelector ()를 사용하십시오. ‘myElement’는 이미 가지고있는 상위 요소입니다. ‘sonClassName’은 찾고있는 자녀의 클래스입니다.

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

자세한 내용을 보려면 다음 사이트를 방문하십시오 : https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector


답변

시도해 볼 수 있습니다 :

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

또는

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


답변

나에게 네 번째 범위를 원하는 것 같습니다. 그렇다면 다음을 수행하십시오.

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

또는

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

이 마지막 방법은 엉망이 될 수있는 숨겨진 노드가 없는지 확인합니다.


답변

그러나 이전 브라우저는을 지원하지 않습니다 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 클래스는

  • AZ 또는 az로 시작해야합니다.
  • 뒤에 문자 (A-Za-z), 숫자 (0-9), 하이픈 ( “-“) 및 밑줄 ( “_”)이 올 수 있습니다.