【问题标题】:JS: How to remove items from a list when they are checked and button clicked?JS:如何在选中并单击按钮时从列表中删除项目?
【发布时间】:2014-03-03 17:23:16
【问题描述】:

我试图在选中列表中的项目然后单击删除按钮时删除它们。我认为我的问题可能出在 removeItem 函数中。 var x = document.getElementById("items-listed <li>"); 因为当我删除 <li> 时,整个列表都会被删除。

<div>
  <div id="center-container">
    <h4>Enter an Item for Your Shopping List:</h4>
    <hr />
    <form name="form">
      <label for="item">Item:</label> 
      <input type="text" placeholder="Shopping Items" id="item" name="itemEntered" />
      <input type="button"  value="Enter" id="Enter" onclick="javascript:addItem();" />
    </form>
  </div>
</div>

<div>
  <div id="items-container">
    <h4>Your list of Items:</h4>
    <form>
      <input type="button" value="Remove selected items" onclick="javascript:removeItem();" />
    </form>
    <hr />
    <ul id="items-listed">

    </ul>
  </div>
</div>

function addItem() {
    var item = [];
    item = document.getElementById('items-listed');
    item.innerHTML += "<li><input type='checkbox'>" + document.form.itemEntered.value + "</li>";
}
function removeItem () {
  var x = document.getElementById("items-listed <li>");
  x.remove();
}

【问题讨论】:

  • 你认为这是一个 id 吗:"items-listed &lt;li&gt;"?
  • items-listed 是一个 id,但
  • 指的是标签。
  • "id 是一个区分大小写的字符串,表示正在查找的元素的唯一 ID。" :developer.mozilla.org/en-US/docs/Web/API/…
  • 您可以使用:document.querySelectorAll('#items-listed li input:checked') 来获取所有选中的复选框。但 querySelectorAll 仅限于新浏览器。检查此页面的浏览器兼容性developer.mozilla.org/en-US/docs/Web/API/…
  • @ManuelRicharz 该解决方案似乎更简洁,更易于理解,但我使用的是 Chrome,它不会删除选中的项目。
  • 标签: javascript html forms list button


    【解决方案1】:

    getElementById只返回一个元素,它不会选择具有特定id的元素的后代,你可以使用.querySelectorAll()方法:

    var x = [].slice.call(document.querySelectorAll("#items-listed li"));
    x.filter(function(e) {
      //  Filtering the `li` that has a checked input child
      return e.firstChild.checked;
    }).forEach(function(e) {
       e.remove(); // e.parentNode.removeChild(e);
    }); 
    

    http://jsfiddle.net/n2Hxs/

    请注意,上面的代码在旧浏览器中不起作用,为了支持这些浏览器,您可以使用 for 循环:

    var x = document.getElementById("items-listed"), 
        c = x.childNodes;
    
    for (var i = 0; i < c.length; i++) {
        if (c[i].nodeType === 1) {
            if (c[i].firstChild.checked) {
               x.removeChild(c[i--]);
            }
        }
    }
    

    【讨论】:

    【解决方案2】:

    一点帮助:http://jsfiddle.net/wared/N3m65/.

    <div>
        <button onclick="add()">add</button>
        <button onclick="rem()">rem</button>
    </div>
    <ul id="list">
        <li><input type="checkbox" /> item</li>
    </ul>
    
    function add() {
        var list = document.getElementById('list'),
            item = document.createElement('li');
        item.innerHTML = '<input type="checkbox" /> item';
        list.appendChild(item);
    }
    
    function rem() {
        var list = document.getElementById('list'),
            items = Array.prototype.slice.call(list.childNodes),
            item;
        while (item = items.pop()) {
            if (item.firstChild && item.firstChild.checked) {
                list.removeChild(item);
            }
        }
    }
    

    这是一个jQuery 解决方案:http://jsfiddle.net/wared/N3m65/

    function jAdd() {
        $('#list').append('<li><input type="checkbox" /> item</li>');
    }
    
    function jRem() {
        $('#list').children().filter(function () {
            return this.firstChild.checked;
        }).remove();
    }
    

    按照 BlackSheep 的建议,您也可以这样做:

    function jRem() {
        $('#list li').has('input:checked').remove();
    }
    

    【讨论】:

    【解决方案3】:

    单击按钮时尝试此功能。它对我来说非常有效。

    function removeLi() {
        'use strict';
        var i,
            u_l = document.getElementById("items-listed"),
            items = u_l.getElementsByTagName("li");
        for (i = 0; i < items.length; i += 1) {
            if (items[i].firstChild.checked) {
                u_l.removeChild(items[i]);
                i = i - 1;
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签