クラス名を持つ要素を見つけるために以下のコードがあります:
// 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オプションを使用するだけで終わりました。
JQueryを使用すると(この場合実際に使用できます)、次のようにできます:
$('.column').remove();
それ以外の場合は、各要素の親を使用して削除する必要があります。
element.parentNode.removeChild(element);
JQueryを使用しない場合:
function removeElementsByClass(className){
var elements = document.getElementsByClassName(className);
while(elements.length > 0){
elements[0].parentNode.removeChild(elements[0]);
}
}
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>
JQueryがなければ、次のことができます。
const elements = document.getElementsByClassName("my-class");
while (elements.length > 0) elements[0].remove();
Brett- getElementyByClassName
IE 5.5から8へのサポートは not therequirksmode = ?.ブラウザー間の互換性を気にする場合は、このパターンに従うことをお勧めします。
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]);
}
問題は私のせいだった。結果の要素の配列から要素を削除すると、長さが変化するため、各反復で1つの要素がスキップされます。解決策は、各要素への参照を一時配列に保存し、その後それらをループ処理して、DOMから各要素を削除することです。
これは私のために働く
while (document.getElementsByClassName('my-class')[0]) {
document.getElementsByClassName('my-class')[0].remove();
}
forEach
/for
ループよりもwhile
を使用することを好みます。使用するには、最初にHTMLCollection
をArray
に変換する必要があります。
Array.from(document.getElementsByClassName("post-text"))
.forEach(element => element.remove());
注意してください、それは最も効率的な方法である必要はありません。私にとってはずっとエレガントです。
はい、親から削除する必要があります。
cur_columns[i].parentNode.removeChild(cur_columns[i]);
次の構文を使用できます:node.parentNode
例えば:
someNode = document.getElementById("someId");
someNode.parentNode.removeChild(someNode);
再帰関数は次のような問題を解決する可能性があります
removeAllByClassName = function (className) {
function findToRemove() {
var sets = document.getElementsByClassName(className);
if (sets.length > 0) {
sets[0].remove();
findToRemove();
}
}
findToRemove();
};
//
removeAllByClassName();
動的に追加された要素を削除したい場合は、これを試してください:
document.body.addEventListener('DOMSubtreeModified', function(event) {
const elements = document.getElementsByClassName('your-class-name');
while (elements.length > 0) elements[0].remove();
});
const elem= document.getElementsByClassName('column')
for (let i = elem.length; 0 < i ; )
elem[--i].remove();
OR
const elem= document.getElementsByClassName('column')
while (elem.length > 0 )
elem[0].remove();