あなたは JavaScript を学んでいるので、コードと受け入れられた回答を見て、次の 3 つのことに注意する必要があります。
A. _ 単一のDOM 要素innerHTML
の追加には使用しないでください。
あなたのコードでは、 を実行しています。これは、毎回....innerHTML += ...
完全に再マークアップされ、挿入されることを意味します。innerHTML
つまり、 10thli
の場合、10 個のアイテムを追加しています。11thli
の場合、1 ではなく 10 を削除してから 11 項目を追加します。これはパフォーマンスが悪く、挿入されるたびにすべての s を再度DOM
追加する意味がありません。li
li
innerHTML
1回の操作に適しています。
B. _ インライン JavaScript は絶対に使用しないでください。
それにはたくさんの理由があります。その上、コミュニティの他の開発者はそれを嫌っています。そして、それを使った質問を見ると、彼らは逃げ出します。
<span onclick='this.parentNode.parentNode.removeChild(this.parentNode)' >
これは悪い、悪い、非常に悪いです!
C. _ イベント委任を使用してください。
この答えを見てください。
要するに、すべての に複数のクリック機能を持たせる代わりに、 にli
単一の機能を持たせる方が良いのul
です。をクリックするli
と、 もクリックされul
ます。li
でクリックされたものを確認しul
、次のように削除できます。
HTML :
<form>
<input type='text' id='input' />
<input type='button' id='add-btn' value='Add' />
</form>
<ul id="do"> </ul>
JavaScript :
var doc = document,
parentUL = document.getElementById('do'),
addBtn = document.getElementById('add-btn');
addBtn.addEventListener('click', function() {
var input = doc.getElementById('input').value,
li = doc.createElement('li');
// use innerHTML only to set the conetnt of single DOM item
li.innerHTML = input + '<span style="cursor: pointer; color: red; margin-left: 20px" > x </span>';
// append only once on every create
parentUL.appendChild(li);
});
// delegate UL's click to li, by checking target item
parentUL.addEventListener('click', function(evt) {
// check the real target
var target = evt.target,
liNode = target.parentNode;
parentUL.removeChild(liNode);
});
注:addEventListener
は最新のブラウザー専用です。クロスブラウザのことについては、この回答を確認してください。
これらすべてをまとめると、以前の小さなコードのオーバーヘッドのように見えるかもしれませんが、これは世界と JavaScript を救う良い習慣です。
あなたは答えを受け入れましたが、上記のコードでフィドルを更新しました