Удаление элементов по имени класса?
У меня есть код ниже, чтобы найти элементы с их именем класса:
// 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.
Ответы
Ответ 1
Используя jQuery (который вы действительно могли бы использовать в этом случае, я думаю), вы можете сделать это так:
$('.column').remove();
В противном случае вам потребуется использовать родительский элемент каждого элемента, чтобы удалить его:
element.parentNode.removeChild(element);
Ответ 2
Если вы предпочитаете не использовать JQuery:
function removeElementsByClass(className){
var elements = document.getElementsByClassName(className);
while(elements.length > 0){
elements[0].parentNode.removeChild(elements[0]);
}
}
Ответ 3
Используя 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>
Ответ 4
Без jQuery вы можете сделать:
const elements = document.getElementsByClassName("my-class");
while (elements.length > 0) elements[0].remove();
Ответ 5
Бретт - знаете ли вы, что getElementyByClassName
поддержка от IE 5.5 до 8 не существует в соответствии с quirksmode?. Вам лучше следовать этой схеме, если вам нужна совместимость с несколькими браузерами:
- Получить контейнерный элемент по идентификатору.
- Получить дочерние элементы по имени тега.
- Итерация над детьми, проверка соответствия свойства 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.
Попробуйте здесь.
Ответ 6
Это работает для меня
while (document.getElementsByClassName('my-class')[0]) {
document.getElementsByClassName('my-class')[0].remove();
}
Ответ 7
Я предпочитаю использовать forEach
более чем for
/while
цикла. Чтобы использовать его, необходимо HTMLCollection
преобразовать HTMLCollection
в Array
:
Array.from(document.getElementsByClassName("post-text"))
.forEach(element => element.remove());
Обратите внимание, это не самый эффективный способ. Просто гораздо элегантнее для меня.
Ответ 8
Да, вы должны удалить из родителя:
cur_columns[i].parentNode.removeChild(cur_columns[i]);
Ответ 9
Вы можете использовать этот синтаксис: node.parentNode
Например:
someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);
Ответ 10
Рекурсивная функция может решить вашу проблему, как показано ниже
removeAllByClassName = function (className) {
function findToRemove() {
var sets = document.getElementsByClassName(className);
if (sets.length > 0) {
sets[0].remove();
findToRemove();
}
}
findToRemove();
};
//
removeAllByClassName();
Ответ 11
Если вы хотите удалить элементы, которые добавляются динамически, попробуйте следующее:
document.body.addEventListener('DOMSubtreeModified', function(event) {
const elements = document.getElementsByClassName('your-class-name');
while (elements.length > 0) elements[0].remove();
});
Ответ 12
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();
Ответ 13
Вам следует попробовать jQuery, гораздо проще выбирать элементы и редактировать их.
С jQuery ваш код должен выглядеть так:
$( document ).ready( function() {
// Select all elements with class name 'className' and remove them
$( ".className" ).remove();
});
Вместо удаления вы можете изменить свойство отображения css на none!
// Get the element by their class name
var cur_columns = document.getElementsByClassName('column');
// Now remove them
cur_columns.style.display= "none";
Надеюсь, это помогло!
Ответ 14
Ошибка пропущенных элементов в этом (код сверху)
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]);
}
}
Ответ 15
Вы можете использовать простое решение, просто изменив класс, обновится фильтр HTML Collection:
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