16

私はこのJavaScriptコードを持っています:

window.onload = init;

function init () {
    var button = document.getElementById("submitButton");
    button.onclick = addItem;
    var listItems = document.querySelectorAll("li");  //assigning the remove click event to all list items
    for (var i = 0; i < listItems.length; i++) {
        listItems[i].onclick = li.parentNode.removeChild(li);
    }
}

function addItem() {
    var textInput = document.getElementById("item");  //getting text input
    var text = textInput.value;   //getting value of text input element
    var ul = document.getElementById("ul");  //getting element <ul> to add element to
    var li = document.createElement("li");  //creating li element to add
    li.innerHTML = text;    //inserting text into newly created <li> element

    if (ul.childElementCount == 0) {  //using if/else statement to add items to top of list
        ul.appendChild(li);       // will add if count of ul children is 0 otherwise add before first item
    }
    else {
        ul.insertBefore(li, ul.firstChild);
    }
}

function remove(e) {
    var li = e.target;
    var listItems = document.querySelectorAll("li"); 
    var ul = document.getElementById("ul");
    li.parentNode.removeChild(li);        
}

そしてこのHTML:

<body>
     <form>
         <label for="item">Add an item: </label>
          <input id="item" type="text" size="20"><br>
         <input id="submitButton" type="button" value="Add!">
     </form>
     <ul id="ul">
     </ul>
     <p>
         Click an item to remove it from the list.
    </p>  
</body>

私がやりたいのは<li>、ユーザーがクリックした要素を削除することですが、これは機能していないようで、この特定のシナリオについてオンラインで他のどこにも答えを見つけることができません. 誰かがここで私を助けて、私が欠けているものを見せてくれることを願っています.

4

6 に答える 6

34

アップデート

プレーン JS 委任

eventListener を UL に追加して、動的に挿入された LI でもクリックを委譲します。

document.getElementById("ul").addEventListener("click",function(e) {
  var tgt = e.target;
  if (tgt.tagName.toUpperCase() == "LI") {
    tgt.parentNode.removeChild(tgt); // or tgt.remove();
  }
});

jQuery 委任

$(function() {
  $("#submitButton").on("click",function() {
    var text = $("#item").val();   //getting value of text input element
    var li = $('<li/>').text(text)
    $("#ul").prepend(li); 
  });
  $("#ul").on("click","li",function() {
    $(this).remove();
  });
});   

元の答え

jQueryについて言及していないので

var listItems = document.getElementsByTagName("li"); // or document.querySelectorAll("li"); 
for (var i = 0; i < listItems.length; i++) {
  listItems[i].onclick = function() {this.parentNode.removeChild(this);}
}

あなたはそれをラップしたいかもしれません

window.onload=function() { // or addEventListener
  // do stuff to the DOM here
}

質問を読み直して、それを動的LIに追加したいと思います

li.innerHTML = text;    //inserting text into newly created <li> element
li.onclick = function() {
  this.parentNode.removeChild(this);
   // or this.remove(); if supported
}

これは、あなたがそれをコーディングするつもりだったと私が予想する完全なコードです

ライブデモ

window.onload=function() {
  var button = document.getElementById("submitButton");
  button.onclick = addItem;
}   

function addItem() {
  var textInput = document.getElementById("item");  //getting text input
  var text = textInput.value;   //getting value of text input element
  var ul = document.getElementById("ul");  //getting element <ul> to add element to
  var li = document.createElement("li");  //creating li element to add
  li.innerHTML = text;    //inserting text into newly created <li> element
  li.onclick = function() {
    this.parentNode.removeChild(this);
    // or this.remove(); if supported
  }
  if (ul.childElementCount == 0) {  //using if/else statement to add items to top of list
    ul.appendChild(li); // will add if count of ul children is 0 otherwise add before first item
  }
  else {
    ul.insertBefore(li, ul.firstChild);
  }
}

jQuery を使用する場合は、全体がいくらか単純になります。

ライブデモ

$(function() {
    $("#submitButton").on("click",function() {
        var text = $("#item").val();   //getting value of text input element
        var li = $('<li/>')
          .text(text)
          .on("click",function() { $(this).remove()});
        $("#ul").prepend(li); 
    });
});   
于 2013-06-09T17:20:54.653 に答える
5

すでに回答を受け取っていることは承知していますが、元の削除機能に戻ります。次のものがあります。

function remove(e) {
    var li = e.target;
    var listItems = document.querySelectorAll("li"); 
    var ul = document.getElementById("ul");
    li.parentNode.removeChild(li);        
}

これに変更すると、達成しようとしていたものが得られるはずです。

function remove(e)
{
   var li = e.target;
   var ol = li.parentElement;
   ol.removeChild( li);
   return false;
}
于 2013-10-14T12:46:47.047 に答える
4

JavaScriptで関数を書きたくない場合は、以下のようにすぐに呼び出される無名関数を使用できます...

<elem onclick="(function(_this){_this.parentNode.removeChild(_this);})(this);"
于 2016-05-07T10:08:35.233 に答える
4

少し単純化することをお勧めします。

Object.prototype.remove = function(){
    this.parentNode.removeChild(this);
};

var lis = document.querySelectorAll('li');

for (var i = 0, len = lis.length; i < len; i++) {
    lis[i].addEventListener('click', remove, false);
}

JS フィドルのデモ

もちろん、上記を行った後、さらに先に進む必要があります (おそらく jQuery が好きすぎるため)。

Object.prototype.on = function (evt, fn) {
    var self = this.length ? this : [this];
    for (var i = 0, len = self.length; i < len; i++){
        self[i].addEventListener(evt, fn, false);
    }
};
Object.prototype.remove = function(){
    var self = this.length ? this : [this];
    for (var i = 0, len = self.length; i < len; i++){
        self[i].parentNode.removeChild(self[i]);
    }
};

document.querySelectorAll('li').on('click', remove);

JS フィドルのデモ

于 2013-06-09T17:29:04.347 に答える
1

私があなたを正しく理解していれば:

$("li").on("click", function() {
  $(this).remove()
});
于 2013-06-09T17:19:57.727 に答える
0

答えは思ったよりも明白ですinit()。スクリプトを追加するのを忘れていました。クリック イベントがトリガーされないのは普通のことであり、要素に設定されていません!

編集

コードにいくつかの論理エラーがあります。作成されたすべての要素に対して onclick 関数を追加しないと、クリックされた要素を削除できなくなります。これは、関数init()がページの読み込み時に 1 回呼び出されるためです。

function init() {
    var button = document.getElementById("submitButton");
    button.onclick = function() {addItem()};
}

function addItem() {
    var textInput = document.getElementById("item"); //getting text input
    var text = textInput.value; //getting value of text input element
    var ul = document.getElementById("ul"); //getting element <ul> to add element to
    var li = document.createElement("li"); //creating li element to add
    li.innerHTML = text; //inserting text into newly created <li> element
    li.onclick = function() {this.parentNode.removeChild(this);}

    if (ul.childElementCount == 0) { //using if/else statement to add items to top of list
        ul.appendChild(li); // will add if count of ul children is 0 otherwise add before first item
    } else {
        ul.insertBefore(li, ul.firstChild);
    }
}
init();
于 2013-06-09T17:25:37.187 に答える