Loại bỏ các yếu tố theo tên lớp?


126

Tôi có đoạn mã dưới đây để tìm các phần tử với tên lớp của chúng:

// 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++) {

}

Tôi chỉ không biết làm thế nào để loại bỏ chúng ..... TÔI CÓ PHẢI tham khảo cha mẹ hay gì không? Cách tốt nhất để xử lý việc này là gì?

@ Karim79:

Đây là 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]);
    }
}

Đây là 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>

Chỉnh sửa: Kết thúc tốt đẹp chỉ bằng cách sử dụng tùy chọn jQuery.


4
Thành thật mà nói, cách tốt nhất là chỉ sử dụng jQuery. Không thực sự hiểu tại sao mọi người muốn thực hiện thao tác DOM bằng tay nữa.
Tyler Eaves

7
Tôi không biết lol .... Tôi chỉ cảm thấy tôi cảm thấy bẩn khi biết các khung công tác & không có bất kỳ kiến ​​thức nào về việc có thể thực sự sử dụng vanilla JS. Vì tôi không phải là người NHIỀU LỚN, tôi đã thử và chỉ viết mã với vanilla JS khi tôi sử dụng nó để tôi không quên những thứ lol
Brett

20
Đúng. Ai trên trái đất sẽ muốn trở thành một nhà phát triển có kiến ​​thức và làm tròn. Vô lý!
dùng113716

1
Tất nhiên, một cách tiếp cận tốt, nhưng chỉ vì bạn đang sử dụng jQuery, không có nghĩa là bạn phải từ bỏ việc hiểu cách thức hoạt động của nó hoặc những gì DOM cơ bản cung cấp. Bạn có thể sửa xe nếu muốn (DOM), nhưng thợ máy của bạn có thể có nhiều kinh nghiệm hơn về nó (nhóm jQuery).
Lior Cohen

2
@Lior: Vâng, thợ máy của tôi không cần giúp tôi bật chìa khóa hoặc lăn xuống cửa sổ. ; o)
dùng113716

Câu trả lời:


188

Sử dụng jQuery (mà bạn thực sự có thể sử dụng trong trường hợp này, tôi nghĩ vậy), bạn có thể làm như vậy:

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

Mặt khác, bạn sẽ cần sử dụng cha mẹ của từng thành phần để xóa nó:

element.parentNode.removeChild(element);

41
+0,75 khi sử dụng jQuery, +0,25 để đưa ra giải pháp không phải jQuery: p
ThiefMaster

7
+0,01 khi sử dụng jQuery, +0,99 để cung cấp giải pháp không phải jQuery: p
Alex Pyzhianov

183

Nếu bạn không thích sử dụng JQuery:

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

1
Một số lượng đáng ngạc nhiên của các giải pháp không làm việc ra khỏi đó. Điều này đúng Cảm ơn!
penguinsource

11
Nếu bất cứ ai thắc mắc tại sao anh ta luôn loại bỏ phần tử đầu tiên (chỉ số 0), thì đó là vì khi bạn loại bỏ một phần tử, nó cũng thu nhỏ elementsmảng.
Jefferson Lima

những gì về các chỉ mục khác (chấp nhận chỉ số 0)?
ofir_aghai

1
@ofir_aghai như @JeffersonLima chỉ ra getElementsByClassNamelà một bộ sưu tập trực tiếp. developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko

2
Quan sát tốt về thực tế là các phần tử mảng co lại
ferralucho

32

Sử dụng ES6 bạn có thể làm như sau:

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>


Để tận dụng lợi thế của ES6, hãy làm thế nào: var removeElements = (elms) => [... elms] .forEach (el => el.remove ());
Giải tích

1
Câu trả lời hay nhất Cảm ơn!
Francesco

25

Trong Javascript thuần túy, không có jQuery hoặc ES6, bạn có thể làm:

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

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

2
Câu trả lời rõ ràng nhất mà không cần jQuery và ES6
Eric

2
Có thể câu trả lời của bạn đến sau - nên là câu trả lời được chấp nhận vì nó không phụ thuộc vào jQuery. Nói chung, tốt hơn là sử dụng vanilla-js, phải không?
Luckyfella

Câu trả lời tốt nhất mà không cần jQuery và không cần thiết. Nói KHÔNG với jQuery. Vâng để vani đá!
Thanocation

13

Điều này làm việc cho tôi

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

10

Brett - bạn có biết rằng getElementyByClassNamehỗ trợ từ IE 5.5 đến 8 không có theo quirksmode không? Bạn sẽ tốt hơn nếu theo mô hình này nếu bạn quan tâm đến khả năng tương thích giữa nhiều trình duyệt:

  • Nhận phần tử container bằng ID.
  • Nhận các yếu tố con cần thiết theo tên thẻ.
  • Lặp lại trên trẻ em, kiểm tra để phù hợp với thuộc tính className.
  • elements[i].parentNode.removeChild(elements[i]) như những người khác nói.

Ví dụ nhanh:

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

Đây là một bản demo nhanh.

EDIT: Đây là phiên bản cố định, dành riêng cho đánh dấu của bạn:

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

Vấn đề là lỗi của tôi; khi bạn loại bỏ một phần tử khỏi mảng kết quả của các phần tử, độ dài sẽ thay đổi, do đó, một phần tử sẽ bị bỏ qua ở mỗi lần lặp. Giải pháp là lưu trữ một tham chiếu đến từng phần tử trong một mảng tạm thời, sau đó lặp lại các phần tử đó, loại bỏ từng phần tử khỏi DOM.

Hãy thử nó ở đây.


Cảm ơn vì điều đó - mặc dù đó không phải là vấn đề lớn vì đây là phần quản trị nên thực sự một người sẽ sử dụng nó .... nhưng vẫn sẽ xem xét nhận xét của bạn.
Brett

@Brett - dù sao đi nữa! Sẽ mất một vài phút thời gian của bạn và bạn sẽ có thêm những cuộc hôn nhân cao tại văn phòng :)
karim79

Ok tôi đã thử điều này ... nó đã báo cáo số lượng phần tử chính xác khi tôi thực hiện cảnh báo, nhưng nó chỉ xóa hai trong số bốn với tên lớp đó và tôi đã gặp lỗi này: col_wrapper [i] không xác định. Tôi sẽ cập nhật bài viết của tôi với mã tôi đã sử dụng.
Brett

@Brett - nếu bạn quan tâm, tôi đã sửa mã cập nhật của bạn và nhận xét về sự cố.
karim79

Man, điều này đã giúp tôi nhiều hơn những gì bạn có thể tưởng tượng với một vấn đề tôi đã bị vấp ngã trong hai giờ qua. CẢM ƠN BẠN!
Zoolander

4

Tôi thích sử dụng forEachhơn for/ whilevòng lặp. Để sử dụng, cần phải chuyển đổi HTMLCollectionthành Arrayđầu tiên:

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

Hãy chú ý, nó không cần thiết là cách hiệu quả nhất. Thanh lịch hơn nhiều đối với tôi.


4

Một đường thẳng

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

Ví dụ: bạn có thể làm trong trang này để xóa userinfo

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

1

Có, bạn phải xóa khỏi cha mẹ:

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

1

Bạn có thể sử dụng cú pháp này: node.parentNode

Ví dụ:

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

2
Câu hỏi này được yêu cầu xóa theo className
JoeTidee

1

Hàm đệ quy có thể giải quyết vấn đề của bạn như dưới đây

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

1
Haha tránh một vòng lặp. <3
Ivan Ivković

0

Trong trường hợp bạn muốn loại bỏ các yếu tố được thêm động, hãy thử điều này:

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();

HOẶC LÀ

const elem= document.getElementsByClassName('column')

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

0

Rất đơn giản, một lớp lót, sử dụng toán tử trải rộng ES6 do document.getEuityByClassName trả về một bộ sưu tập HTML.

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

-1

Các yếu tố bỏ qua lỗi trong này (mã từ trên)

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

có thể được sửa bằng cách chỉ chạy vòng lặp ngược như sau (để không cần mảng tạm thờ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]);
   }
}

Điều này hơi phức tạp. Tại sao không sử dụng một chu kỳ trong khi thay thế? (xem câu trả lời của tôi)
tocqueville

@tocqueville Câu hỏi được đăng sử dụng vòng lặp for. Tôi chỉ đơn thuần chỉ ra cách sửa lỗi với những thay đổi tối thiểu đối với mã của anh ấy.
shao.lo

-3

Bạn có thể sử dụng một giải pháp đơn giản, chỉ cần thay đổi lớp, bộ lọc Bộ sưu tập HTML được cập nhật:

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

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

Tham chiếu: http://www.w3.org/TR/2011/WD-html5-master-20110705/common-dom-interfaces.html


1
Điều này sẽ không hoạt động vì mảng của vòng lặp được sửa đổi bên trong chính vòng lặp. Kết quả là phần tử cuối cùng sẽ bị bỏ qua.
tocqueville
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.