JavaScript에서 클래스별로 요소를 얻는 방법?


226

html 요소 내의 내용을 바꾸고 싶기 때문에 다음 기능을 사용하고 있습니다.

function ReplaceContentInContainer(id,content) {
   var container = document.getElementById(id);
   container.innerHTML = content;
}

ReplaceContentInContainer('box','This is the replacement text');

<div id='box'></div>

위의 내용은 훌륭하지만 문제는 페이지에 내용을 바꾸려는 html 요소가 두 개 이상 있다는 것입니다. 따라서 ID 대신 클래스를 사용할 수 없습니다. 자바 스크립트는 클래스 함수에 의해 어떤 유형의 내장 get 요소를 지원하지 않는다고 들었습니다. 그렇다면 위의 코드를 어떻게 수정하여 ID 대신 클래스와 함께 사용할 수 있습니까?

추신 : 나는 이것을 위해 jQuery를 사용하고 싶지 않습니다.

답변:


198

이 코드는 모든 브라우저에서 작동해야합니다.

function replaceContentInContainer(matchClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
                > -1) {
            elems[i].innerHTML = content;
        }
    }
}

작동 방식은 문서의 모든 요소를 ​​반복하고 클래스 목록을 검색하는 것입니다 matchClass. 일치하는 것이 발견되면 내용이 교체됩니다.

Vanilla JS를 사용하는 jsFiddle 예제 (즉 프레임 워크 없음)


5
+1-공백을 잘 잡습니다. 항상 그렇게하는 것을 잊어 버렸습니다 ... 내 대답을 위해 그것을 훔칠 것입니다.) class는 자바 스크립트의 예약어입니다. 실제로 아무런 해를 끼치 지 않더라도 변수 이름으로 사용해서는 안됩니다.
Dagg Nabbit

1
이 기능을 사용하면 @ 요소를 바꾸려는 요소 안에 내용이 없어도됩니다. 거기에 문자열이 있거나 비어있을 수 있습니다. 어느 쪽이든 함수가 호출되면 대체 텍스트가 갑자기 나타납니다.
Taylor

4
Andrew, @no- class변수 이름으로 사용 하는 것은 Safari에서 작동하지 않으므로 현재 영향을 미칩니다.
user113716

4
getElementsBytagName에 의해 리턴 된 배열에도 lengthName이 있으며,이를 위해 className / indexOf 테스트도 수행됩니다. 이 경우에는 문제가되지 않지만 일반적인 for 루프가 더 정확합니다.
Wolfgang Stengel

1
공백이있는 indexOf 대신에 저장 elems[i].className, 말하기 var cn및 사용 cn && cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)"))은 공백 (공백, 공백이 아닌 공간, 탭 등)과 일치하고 첫 번째 / 마지막 클래스 이름을 일치시킬 수 있기 때문에 더 잘 작동합니다. 예 : jsfiddle.net/AXdtH/1636
Supuhstar

178

물론 모든 최신 브라우저는 이제 다음과 같은 간단한 방법을 지원합니다.

var elements = document.getElementsByClassName('someClass');

그러나 IE8 이전 버전에서는 작동하지 않습니다. http://caniuse.com/getelementsbyclassname을 참조 하십시오

또한 모든 브라우저 NodeList가 예상대로 순수한 것을 반환하지는 않습니다 .

선호하는 크로스 브라우저 라이브러리를 사용하는 것이 좋습니다.


IE8의 경우을 사용할 수 있습니다 querySelectorAll.
Gras Double

109
document.querySelectorAll(".your_class_name_here");

이는 해당 방법 (IE8 +)을 구현하는 "현대"브라우저에서 작동합니다.

function ReplaceContentInContainer(selector, content) {
  var nodeList = document.querySelectorAll(selector);
  for (var i = 0, length = nodeList.length; i < length; i++) {
     nodeList[i].innerHTML = content;
  }
}

ReplaceContentInContainer(".theclass", "HELLO WORLD");

이전 브라우저를 지원하려면 Sizzle (4KB mini + gzip) 또는 Peppy (10K mini)와 같은 독립형 선택기 엔진을로드 하고 기본 querySelector 메소드를 찾을 수없는 경우 해당 엔진으로 대체 할 수 있습니다.

특정 클래스의 요소를 얻을 수 있도록 선택기 엔진을로드하는 것은 과잉입니까? 아마. 그러나 스크립트는 그다지 크지 않으므로 스크립트의 다른 여러 위치에서 선택기 엔진이 유용 할 수 있습니다.


@ 테일러 : IE8에서 작동한다고 생각합니다 (100 % 확실하지는 않습니다-구글에게는 너무 게으름). 어쨌든 타사 선택기 엔진을 사용하여 이전 버전과의 호환성에 관한 정보를 추가했습니다.
Cristian Sanchez

18
document.querySelectorIE8 이상에서 작동 : caniuse.com/queryselector
Zeke

26

간단하고 쉬운 방법

var cusid_ele = document.getElementsByClassName('custid');
for (var i = 0; i < cusid_ele.length; ++i) {
    var item = cusid_ele[i];  
    item.innerHTML = 'this is value';
}

6

정규 표현식을 사용하여 답변이 없다는 것에 놀랐습니다. 이 꽤 많이 앤드류의 대답 사용하여, RegExp.test대신 String.indexOf이 여러 작업에 더 잘 수행 할 것으로 보인다 이후에 따르면, jsPerf 테스트 .
또한 IE6 지원 될 것으로 보인다 .

function replaceContentInContainer(matchClass, content) {
    var re = new RegExp("(?:^|\\s)" + matchClass + "(?!\\S)"),
        elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (re.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

replaceContentInContainer("box", "This is the replacement text.");

동일한 클래스를 자주 찾는 경우 (사전 컴파일 된) 정규식을 다른 곳에 저장하고 문자열 대신 함수에 직접 전달하여 클래스를 더 향상시킬 수 있습니다.

function replaceContentInContainer(reClass, content) {
    var elems = document.getElementsByTagName('*'), i;
    for (i in elems) {
        if (reClass.test(elems[i].className)) {
            elems[i].innerHTML = content;
        }
    }
}

var reBox = /(?:^|\s)box(?!\S)/;
replaceContentInContainer(reBox, "This is the replacement text.");

4

이것은 거의 모든 브라우저에서 작동해야합니다 ...

function getByClass (className, parent) {
  parent || (parent=document);
  var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[];
  while (e=descendants[++i]) {
    ((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e);
  }
  return result;
}

다음과 같이 사용할 수 있어야합니다.

function replaceInClass (className, content) {
  var nodes = getByClass(className), i=-1, node;
  while (node=nodes[++i]) node.innerHTML = content;
}

3

var elems = document.querySelectorAll('.one');

for (var i = 0; i < elems.length; i++) {
    elems[i].innerHTML = 'content';
};


4
그것은 실제로 답이 아닙니다. 코드설명하십시오 . 또한 기본적으로 5 년 전에 게시 된이 질문에 대한 또 다른 대답의 압축 버전입니다.
helmbert

나는 무엇이 문제인지 모른다. 이 대답은 괜찮습니다. 코멘트가 없습니다 ... 그리고 무엇? 이것은 황금률이 ​​아닙니다. 그리고 당신은 여기에 의견을 원하십니까? 그리고 그러나 그것은 읽을 수있는 코드이다?
AntiCZ

3

나는 이것이 원래 요청되었을 때 이것이 유효한 옵션이 아니라고 가정하지만 이제는 사용할 수 있습니다 document.getElementsByClassName('');. 예를 들면 다음과 같습니다.

var elements = document.getElementsByClassName(names); // or:
var elements = rootElement.getElementsByClassName(names);

자세한 내용은 MDN 설명서 를 참조하십시오 .


0

나는 다음과 같이 생각한다.

function ReplaceContentInContainer(klass,content) {
var elems = document.getElementsByTagName('*');
for (i in elems){
    if(elems[i].getAttribute('class') == klass || elems[i].getAttribute('className') == klass){
        elems[i].innerHTML = content;
    }
}
}

작동 할 것이다


1
페이지에 소수의 요소 만있는 경우 O (N) 솔루션입니다.
jwl

getAttribute ( 'class')는 IE 이외의 모든
것에서

0

jQuery는 이것을 쉽게 처리합니다.

let element = $(.myclass);
element.html("Some string");

모든 .myclass 요소를 해당 텍스트로 변경합니다.


추신 : ". 나는 이것을 위해 jQuery를 사용하고 싶지 않다."
율리우스

좋아, 나는 그것을 보지 못했다.
Daniel Høifødt

-15

일부 요소에 ID가 없으면 다음과 같이 jQuery를 사용합니다.

$(document).ready(function()
{
    $('.myclass').attr('id', 'myid');
});

이것은 이상한 해결책 일 수도 있지만 누군가가 유용하다고 생각할 수도 있습니다.


3
class에 여러 요소가있는 경우 myclass모두 id myid를 얻지 만 id는 고유해야합니다! 또한 OP는 명시 적으로 jQuery를 피한다고 말합니다.
Oriol

1
동일한 클래스의 여러 요소가있는 경우 foreach () 절과 증분 ID를 추가하는 것은 어렵지 않습니다. jQuery를 사용할 수있는 사람들을 대신 하여이 솔루션을 추가했습니다. 영업 이익은 이미 어쨌든 적절한 답변을 잔뜩 :-)있어
Krotek
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.