클래스 이름으로 하위 요소를 얻는 방법은 무엇입니까?
클래스 = 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 이상
;)
허용되는 답변은 직계 자녀 만 확인합니다. 종종 우리는 해당 클래스 이름을 사용합니다.
때때로 우리 또한 는 클래스 이름 을 포함 하는 자식을 원합니다 .
예 : 정확한 클래스 이름이 "IMG"가 <div class="img square"></div>
아니더라도 클래스 명 "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;
}
나에게는 네 번째 스팬을 원하는 것입니다. 다음과 같이 할 수 있습니다.
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') {
}
}
그러나 이전 브라우저는 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), 하이픈 ( "-"), 밑줄 ( "_")이 올 수 있습니다.
앞에 기호가 getElementById
없는 ID 이름을 사용하십시오 #
. 그런 다음을 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/
제 생각에는 가능할 때마다 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
})
element.querySelector ()를 사용하십시오. 'myElement'는 이미 가지고있는 상위 요소입니다. 'sonClassName'은 찾고있는 자녀의 클래스입니다.
let child = myElement.querySelector('.sonClassName');
자세한 내용은 https://developer.mozilla.org/en-US/docs/Web/API/Element/querySelector를 방문하십시오.
다음은 비교적 간단한 재귀 솔루션입니다. 여기에서는 폭 우선 검색이 적절하다고 생각합니다. 이것은 발견 된 클래스와 일치하는 첫 번째 요소를 반환합니다.
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;
}
jquery를 사용하여이 작업을 수행하는 방법은 다음과 같습니다.
var targetchild = $ ( "# test"). children (). find ( "span.four");
ES6로 2018 년 6 월 업데이트
const doc = document.getElementById('test');
let notes = null;
for (const value of doc) {
if (value.className === '4') {
notes = value;
break;
}
}
YUI2은이 의 크로스 브라우저 구현을getElementsByClassName
.
YUI 선택기를 사용하여 수행 한 방법은 다음과 같습니다. 행크 게이의 제안에 감사드립니다.
notes = YAHOO.util.Dom.getElementsByClassName('four','span','test');
여기서 four = classname, span = 요소 유형 / 태그 이름, test = 상위 ID입니다.
여기YAHOO.util.Dom.getElementsByClassName()
에서 사용 하십시오 .
참고 URL : https://stackoverflow.com/questions/12166753/how-to-get-child-element-by-class-name
'IT' 카테고리의 다른 글
Ruby Strings의 gsub 메소드와 하위 메소드의 차이점은 무엇입니까? (0) | 2020.08.20 |
---|---|
Chrome에서 웹 포장을로드 할 수 없습니다. (0) | 2020.08.20 |
ASP.NET에서 Excel 파일 생성 (0) | 2020.08.20 |
entitymanager가 어디에 있습니까? (0) | 2020.08.20 |
Ruby에서 모든 메소드를 메소드하는 방법은 무엇입니까? (0) | 2020.08.20 |