클래스 이름으로 요소를 제거 하시겠습니까?


126

클래스 이름을 가진 요소를 찾기 위해 아래 코드가 있습니다.

// Get the element by their class name
var cur_columns = document.getElementsByClassName('column');

// Now remove them

for (var i = 0; i < cur_columns.length; i++) {

}

제거하는 방법을 모르겠어요 ..... 부모를 참조해야하나요? 이를 처리하는 가장 좋은 방법은 무엇입니까?

@ Karim79 :

다음은 JS입니다.

var col_wrapper = document.getElementById("columns").getElementsByTagName("div");
var len = col_wrapper.length;

alert(len);

for (var i = 0; i < len; i++) {
    if (col_wrapper[i].className.toLowerCase() == "column") {
        col_wrapper[i].parentNode.removeChild(col_wrapper[i]);
    }
}

다음은 HTML입니다.

<div class="columns" id="columns">
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div class="column"><input type="checkbox" name="col_list[]" value="cows">cows</div>
    <div name="columnClear" class="contentClear" id="columnClear"></div>
</div>

편집 : jQuery 옵션을 사용하여 끝났습니다.


4
솔직히 가장 좋은 방법은 jQuery를 사용하는 것입니다. 왜 누군가가 더 이상 손으로 DOM 조작을 원하는지 이해하지 마십시오.
Tyler Eaves

7
나는 몰라요 ㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ ㅋㅋㅋ 나는 거대한 JS 사람이 아니기 때문에 나는 그것을 사용할 때 바닐라 JS로 코드를 시도하고 그냥 코드를 사용하여 일을 잊지 않도록 lol
Brett

20
권리. 지구상에서 지식이 풍부하고 다재다능한 개발자가되고 싶은 사람. 불합리한!
user113716

1
물론 좋은 접근 방식이지만 jQuery를 사용하고 있다고해서 작동 방식이나 기본 DOM이 제공하는 내용을 이해하는 것을 포기해야하는 것은 아닙니다. 원한다면 차를 고칠 수도 있지만 (DOM) 정비공은 아마 더 경험이 많을 것입니다 (jQuery 팀).
Lior Cohen 2011

2
@Lior : 그래, 내 정비공은 내가 열쇠를 돌리거나 창문을 내리는 것을 도울 필요가 없다. ; o)
user113716 2011 년

답변:


189

jQuery를 사용하면 (이 경우 실제로 사용할 수 있다고 생각합니다) 다음과 같이 할 수 있습니다.

$('.column').remove();

그렇지 않으면 각 요소의 부모를 사용하여 제거해야합니다.

element.parentNode.removeChild(element);

41
P : 또한 비의 jQuery 솔루션을 제공하기위한 jQuery를, 0.25를 사용하는 0.75
ThiefMaster

7
jQuery 사용시 +0.01, 비 jQuery 솔루션 제공시
+0.99

183

JQuery를 사용하지 않으려는 경우 :

function removeElementsByClass(className){
    var elements = document.getElementsByClassName(className);
    while(elements.length > 0){
        elements[0].parentNode.removeChild(elements[0]);
    }
}

1
놀라운 양의 작동하지 않는 솔루션이 있습니다. 이것은 맞습니다. 감사!
penguinsource

11
왜 그가 항상 첫 번째 요소 (인덱스 0)를 제거하는지 궁금해하는 사람은 요소를 제거하면 elements배열 도 축소되기 때문 입니다.
Jefferson Lima

다른 인덱스는 어떻습니까 (0 인덱스 허용)?
ofir_aghai

1
@ofir_aghai @JeffersonLima getElementsByClassName는 라이브 컬렉션을 가리 킵니다 . developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko

2
요소 배열이 축소된다는 사실에 대한 좋은 관찰
ferralucho

33

ES6 를 사용 하면 다음과 같이 할 수 있습니다.

const removeElements = (elms) => elms.forEach(el => el.remove());

// Use like:
removeElements( document.querySelectorAll(".remove") );
<p class="remove">REMOVE ME</p>
<p>KEEP ME</p>
<p class="remove">REMOVE ME</p>


ES6를 더 활용하려면 다음과 같이하십시오. var removeElements = (elms) => [... elms] .forEach (el => el.remove ());
Calculuswhiz

1
베스트 답변 감사합니다!
Francesco

25

jQuery 또는 ES6없이 순수 자바 스크립트에서는 다음을 수행 할 수 있습니다.

const elements = document.getElementsByClassName("my-class");

while (elements.length > 0) elements[0].remove();

2
jQuery를하고 ES6없이 분명한 답
에릭

2
아마도 당신의 대답은 나중에 왔을 것입니다-jQuery와 무관하기 때문에 받아 들여 져야합니다. 일반적으로 vanilla-js를 사용하는 것이 더 낫지 않습니까?
Luckyfella

불필요하고 부담스러운 jQuery가없는 최고의 답변입니다. jQuery에 아니오라고 말하십시오. 네 바닐라 아이스!
Thanasis

13

이것은 나를 위해 작동합니다

while (document.getElementsByClassName('my-class')[0]) {
        document.getElementsByClassName('my-class')[0].remove();
    }

10

Brett- quirksmode에 따라getElementyByClassName IE 5.5에서 8까지의 지원이 없다는 것을 알고 있습니까?. 브라우저 간 호환성에 관심이 있다면이 패턴을 따르는 것이 좋습니다.

  • ID로 컨테이너 요소를 가져옵니다.
  • 태그 이름으로 필요한 자식 요소를 가져옵니다.
  • 자식을 반복하고 className 속성과 일치하는지 테스트합니다.
  • elements[i].parentNode.removeChild(elements[i]) 다른 사람들이 말한 것처럼.

빠른 예 :

var cells = document.getElementById("myTable").getElementsByTagName("td");
var len = cells.length;
for(var i = 0; i < len; i++) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
    }
}

다음은 간단한 데모입니다.

편집 : 다음은 마크 업에 특정한 고정 버전입니다.

var col_wrapper = document.getElementById("columns").getElementsByTagName("div");

var elementsToRemove = [];
for (var i = 0; i < col_wrapper.length; i++) {
    if (col_wrapper[i].className.toLowerCase() == "column") {
        elementsToRemove.push(col_wrapper[i]);
    }
}
for(var i = 0; i < elementsToRemove.length; i++) {
    elementsToRemove[i].parentNode.removeChild(elementsToRemove[i]);
}

문제는 내 잘못이었습니다. 결과 요소 배열에서 요소를 제거하면 길이가 변경되므로 각 반복에서 하나의 요소를 건너 뜁니다. 해결책은 각 요소에 대한 참조를 임시 배열에 저장 한 다음 그에 대해 반복하여 DOM에서 각 요소를 제거하는 것입니다.

여기에서 시도하십시오.


감사합니다-관리자 섹션에 대한 것이므로 큰 문제는 아니지만 실제로 한 사람이 사용할 것입니다 ....하지만 여전히 귀하의 의견을 고려할 것입니다.
Brett

@ 브렛-어쨌든 해! 시간이 몇 분 걸리고 사무실에서 추가 하이 파이브를받을 수 있습니다. :)
karim79 2011 년

좋아, 나는 이것을 시도했다 ... 경고를했을 때 올바른 양의 요소를보고했지만 해당 클래스 이름으로 4 개 중 2 개만 제거 했으며이 오류가 발생했습니다. col_wrapper [i] is undefined. 내가 사용한 코드로 게시물을 업데이트하겠습니다.
Brett

@Brett-관심이 있으시면 업데이트 된 코드를 수정하고 문제에 대해 댓글을 달았습니다.
karim79 2011 년

야, 이것은 내가 지난 두 시간 동안 난처한 문제로 당신이 상상할 수있는 것보다 더 많이 나를 도왔다. 감사합니다!
Zoolander

4

나는 forEach오버 for/ while루핑을 선호합니다 . 사용 HTMLCollection하려면 Array먼저 변환 해야합니다 .

Array.from(document.getElementsByClassName("post-text"))
    .forEach(element => element.remove());

주의하세요. 가장 효율적인 방법은 아닙니다. 나를 위해 훨씬 더 우아합니다.


4

한 줄

document.querySelectorAll(".remove").forEach(el => el.remove());

예를 들어이 페이지에서 사용자 정보를 제거 할 수 있습니다.

document.querySelectorAll(".user-info").forEach(el => el.remove());

1

예, 부모에서 제거해야합니다.

cur_columns[i].parentNode.removeChild(cur_columns[i]);

1

다음 구문을 사용할 수 있습니다. node.parentNode

예를 들면 :

someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);

2
이 질문은 클래스 명에 의해 제거 요청
JoeTidee

1

재귀 함수는 다음과 같이 문제를 해결할 수 있습니다.

removeAllByClassName = function (className) {
    function findToRemove() {
        var sets = document.getElementsByClassName(className);
        if (sets.length > 0) {
            sets[0].remove();
            findToRemove();
        }
    }
    findToRemove();
};
//
removeAllByClassName();

1
Haha는 루프를 피했습니다. <3
Ivan Ivković

0

동적으로 추가 된 요소를 제거하려면 다음을 시도하십시오.

document.body.addEventListener('DOMSubtreeModified', function(event) {
    const elements = document.getElementsByClassName('your-class-name');
    while (elements.length > 0) elements[0].remove();
});

0
const elem= document.getElementsByClassName('column')

for (let i = elem.length; 0 < i ; )
    elem[--i].remove();

또는

const elem= document.getElementsByClassName('column')

while (elem.length > 0 )
    elem[0].remove();

0

매우 간단하고 한 줄짜리 ES6 스프레드 연산자를 사용하므로 document.getElementByClassName은 HTML 컬렉션을 반환합니다.

[...document.getElementsByClassName('dz-preview')].map(thumb => thumb.remove());

-1

이것의 건너 뛰는 요소 버그 (위의 코드)

var len = cells.length;
for(var i = 0; i < len; i++) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
    }
}

다음과 같이 루프를 뒤로 실행하여 수정할 수 있습니다 (임시 배열이 필요하지 않음).

var len = cells.length;
for(var i = len-1; i >-1; i--) {
    if(cells[i].className.toLowerCase() == "column") {
        cells[i].parentNode.removeChild(cells[i]);
   }
}

이것은 약간 복잡합니다. 대신 while주기를 사용하지 않는 이유는 무엇입니까? (내 대답을 참조)
토크빌

@tocqueville 게시 된 질문은 for 루프를 사용했습니다. 나는 그의 코드를 최소한으로 변경하여 버그를 수정하는 방법을 지적했을뿐입니다.
shao.lo

-3

간단한 솔루션을 사용하고 클래스를 변경하면 HTML 컬렉션 필터가 업데이트됩니다.

var cur_columns = document.getElementsByClassName('column');

for (i in cur_columns) {
   cur_columns[i].className = '';
}

참고 : http://www.w3.org/TR/2011/WD-html5-author-20110705/common-dom-interfaces.html


1
루프 배열이 루프 내부에서 수정되기 때문에 이것은 작동하지 않습니다. 그 결과 마지막 요소를 건너 뜁니다.
tocqueville
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.