クラス名で要素を削除しますか?


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操作を行いたくなる理由を本当に理解していません。
タイラーイーブス2011年

7
フレームワークを知っていて、実際にバニラJSを実際に使用することができるという知識がないので、汚いと感じるだけです。私は巨大なJSの人ではないので、使用するときにバニラJSでコードを書いてみます。そのため、物事を忘れないようにしています
Brett

20
正しい。いったい誰が知識豊富でバランスの取れた開発者になりたいのでしょうか。不条理!
user113716 2011年

1
もちろん、良いアプローチですが、jQueryを使用しているからといって、それがどのように機能するか、または基礎となるDOMが提供するものを理解することをあきらめる必要はありません。必要に応じて車を修理することもできますが(DOM)、整備士はおそらく経験が豊富です(jQueryチーム)。
Lior Cohen

2
@リオール:ええ、まあ、私のメカニックは私が鍵を回したり、窓を下ろしたりするのを手伝う必要はありません。; o)
user113716 2011年

回答:


189

jQuery(この場合は本当に使用できます)を使用すると、次のようになります。

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

それ以外の場合は、各要素の親を使用して削除する必要があります。

element.parentNode.removeChild(element);

41
jQueryを使用する場合は+0.75、非jQueryソリューションを提供する場合は
+0.25

7
jQueryを使用する場合は+ 0.01、jQuery以外のソリューションを提供する場合は+0.99:p
Alex Pyzhianov

183

JQueryを使用しない場合:

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

1
そこには驚くほど多くの非実用的なソリューションがあります。これは正解です。ありがとう!
ペンギン

11
なぜ最初の要素(インデックス0)を常に削除しているのか疑問に思う人がいるのは、要素を削除するとelements配列も縮小されるためです。
ジェファーソンリマ

他のインデックス(0インデックスを受け入れる)はどうですか?
ofir_aghai 2017

1
@JeffersonLimaがポイントする@ofir_aghai getElementsByClassNameは、ライブコレクションです。developer.mozilla.org/en-US/docs/Web/API/NodeList
Veikko Karsikko 2017

2
要素の配列が縮小するという事実についての素晴らしい観察
フェラルチョ

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をさらに活用するには、次のようにします。varremoveElements =(elms)=> [... elms] .forEach(el => el.remove());
Calculuswhiz 2017

1
ベストアンサーありがとうございます!
フランチェスコ

25

純粋なJavascriptでは、jQueryまたはES6なしで、次のことができます。

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

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

2
jQueryとES6を使用しない最も明確な回答
Eric

2
多分あなたの答えは後で来ました-それはjQueryに依存しないので受け入れられるべきです。一般的には、vanilla-jsを使用する方が良いでしょう。
ラッキーフェラ

不要で負荷の大きいjQueryなしのベストアンサー。jQueryにNOと言ってください。はい、バニラアイスに!
タナシス

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

問題は私のせいでした。結果の要素の配列から要素を削除すると、長さが変化するため、反復ごとに1つの要素がスキップされます。解決策は、各要素への参照を一時配列に格納し、その後それらをループして、DOMから各要素を削除することです。

ここで試してください。


それをありがとう-管理セクションのため、それは大きな問題ではありませんが、実際には1人がそれを使用します...しかし、あなたのコメントは考慮に入れます。
Brett

@ブレット-とにかくそれをしてください!それはあなたの時間の数分かかります、そしてあなたはオフィスで余分なハイファイブを得るでしょう:)
karim79

OK、これを試してみました...アラートを出したときに正しい数の要素が報告されましたが、そのクラス名の4つのうち2つしか削除されず、このエラーが発生しました。col_wrapper[i]は未定義です。使用したコードで投稿を更新します。
Brett

@ブレット-興味があれば、更新したコードを修正し、問題についてコメントしました。
karim79

男、これは私が過去2時間にわたって困惑してきた問題であなたが想像する以上に私を助けました。ありがとうございました!
Zoolander 2012年

4

forEachfor/ whileループよりも使用することを好みます。使用するにはHTMLCollectionArray最初に変換する必要があります:

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

注意してください、それは最も効率的な方法である必要はありません。私にとってははるかにエレガントです。


4

1行

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

たとえば、このページでuserinfoを削除できます

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
この質問はclassNameで削除するように求められました
JoeTidee 2017

1

再帰関数は以下のようにあなたの問題を解決するかもしれません

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

1
ハハはループを避けました。<3
IvanIvković19年

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

これは非常にシンプルな1行で、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 2016年

@tocqueville投稿された質問はforループを使用しました。私は彼のコードに最小限の変更を加えてバグを修正する方法を指摘しているだけでした。
shao.lo 2017

-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 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.