如何定位 <li> 元素并在列表之间转移

How to Target <li> Element and Transfer between Lists

我是这里的新手。我在 HTML 中有两个不同的列表:第一个列表包含几个元素,第二个列表包含 none。

我的目标是将列表 1 的元素转移到列表 2。我确实想转移那些点击 "move" 符号(我定位的)的元素。

但是,我不知道如何针对li元素进行传输。

我知道这是一个基本问题,但仍然感谢您的支持和时间!

我已尝试将 EventListener 添加到 "move"。 因此,我尝试使用 textContext 来修改列表 2 的元素。 但是,我不知道如何定位第一个列表中的 li 元素。

//FIRST LIST
<ul class="list-group todos mx-auto text-light">
          <li class="list-group-item d-flex justify-content-between align-items-center">
            <span>play mariokart</span>
            <i class="far fa-trash-alt move"></i>
          </li>
          <li class="list-group-item d-flex justify-content-between align-items-center">
            <span>defeat ganon in zelda</span>
            <i class="far fa-trash-alt move"></i>
          </li>

//SECOND LIST
<h1>Items in the Pack</h1>
      <ul class ="pack">
        <li> </li>
        <li> </li>
        <li> </li>
      </ul>

 const list = document.querySelector('.todos');
 const pack = document.querySelector(".pack");


 list.addEventListener('click', e => {

      if(e.target.classList.contains('move')){
       pack.querySelector('li').textContent = `${//missing variable//}%`; 

      }

    }); ```

首先,您需要使用 /ul 关闭您的第一个列表。

将移动 class 放入包含待办事项的 li 元素中

<li class="move list-group-item d-flex justify-content-between align-items-center">

那么,这个脚本应该可以处理所有事情。

<script>
    window.onload = function() {
        document.getElementById('movebutton').addEventListener('click', function() {
            const list = document.querySelector('.todos').getElementsByTagName('li');
            const pack = document.querySelector('.pack');
            for(var x=0; x<list.length; x++) {
                if(list[x].classList.contains('move')) {
                    pack.appendChild(list[x]);
                    x--;
                }
            }
        });
    }
</script>

appendChild 自动从原始列表中删除,因此您需要x-- 来更正下一个循环指向的位置。

和一个附加到事件侦听器的按钮。

<button id="move">move</button>

编辑:

抱歉,我错过了您想要单独移动它们的部分。以下修复了该问题,并确保您的列表元素保持其 class 和样式等。单击移动文本以移动它们。

此外,刚刚添加了 return 回到原始列表功能。

window.onload = function() {
  const list = document.querySelector('.todos');
  const pack = document.querySelector('.pack');
  list.addEventListener('click', function(e) {
    if(e.target.classList.contains('move')) {
      e.target.innerText = " - return";
      li = e.target.parentElement;
      pack.appendChild(li);
    }
  });
  pack.addEventListener('click', function(e) {
    if(e.target.classList.contains('move')) {
      e.target.innerText = " - move";
      li = e.target.parentElement;
      list.appendChild(li);
    }
  });

}
//FIRST LIST
<ul id="first" class="list-group todos mx-auto text-light">
  <li class="list-group-item  d-flex justify-content-between align-items-center">
    <span style="font-weight:bold">play mariokart</span>
    <i class="far fa-trash-alt move"> - move</i>
  </li>
  <li class="list-group-item move d-flex justify-content-between align-items-center">
    <span>defeat ganon in zelda</span>
    <i class="far fa-trash-alt move"> - move</i>
    </li>
</ul>
        
//SECOND LIST
<h1>Items in the Pack</h1>
<ul id="second" class ="pack">
  <li> </li>
  <li> </li>
  <li> </li>
</ul>

您可以使用 parentElement 获取列表元素,该元素是 move class.

元素的直接父元素

然后您可以创建新的列表元素并将它们附加到目标列表。这是流程,对您的代码进行了细微更改。

 const list = document.querySelector('.todos');
 const pack = document.querySelector(".pack");

 list.addEventListener('click', e => {
   if (e.target.classList.contains('move')) {
     let originalListEntry = e.target.parentElement;
     var newListEntry = document.createElement("li")
     newListEntry.innerText = originalListEntry.innerText
     pack.appendChild(newListEntry)
   }
 });

这是一个working example 为了演示目的,我在移动范围内添加了一个 +。