【问题标题】:How to toggle each button separately on multiple li elements?如何在多个 li 元素上分别切换每个按钮?
【发布时间】:2023-02-03 18:21:44
【问题描述】:

我正在做项目,我的目标是通过单击切换按钮来切换每个单独的 li 元素。 到目前为止我设法做到了这一点,但它只适用于第一个 li 元素。 你能帮我处理这段代码吗?

<li id="liEl">Target This element</li>
<button id="Btn">toggle</button>

<li id="liEl" >Target This element</li>
<button id="Btn">toggle</button>

<li id="liEl" >Target This element</li>
<button id="Btn">toggle</button>
.done {
  text-decoration: line-through;
  text-decoration-thickness: 0.2rem;
  text-decoration-color:red;
}
Btn= document.getElementById("Btn");
liEl= document.getElementById("liEl");

const toggleDoneClass = () => {

  liEl.classList.toggle('done');
};

Btn.addEventListener('click', toggleDoneClass);

【问题讨论】:

    标签: javascript html css toggle


    【解决方案1】:

    id 属性必须是唯一的。 你可以使用类而不是那个。

    HTML

    <li class="list_element">Target This element</li>
    <button class="btn">toggle</button>
    
    <li class="list_element" >Target This element</li>
    <button class="btn">toggle</button>
    
    <li class="list_element" >Target This element</li>
    <button class="btn">toggle</button>
    

    您必须选择所有按钮,然后通过循环为每个按钮添加事件侦听器。

    Javascript

    var btns = document.getElementsByClassName("btn");
    
    for (let i = 0; i < btns.length; i++) {
        btns[i].addEventListener("click", () => {
             // Previous is li because li is before button
             btns[i].previousElementSibling.classList.toggle("done");
        });
    }
    

    现在这是工作。

    【讨论】:

      【解决方案2】:

      您正在为所有按钮提供相同的 ID,而 li 而不是 id 使用类名

      btns= document.getElementsByClassName("btn");
      

      它将选择所有包含按钮的类

      for(let index = 0;index < btns.length; index++){
         btns[index].onclick = (evt) =>{
        evt.target.previousElementSibling.classList.toggle("done")
          }
      }
      
      

      循环您将单击的所有类,它将采用该元素,然后获取他们的前一个子元素,即 li 并在该元素上切换类

      btns= document.getElementsByClassName("btn");
      
      for(let index = 0;index < btns.length; index++){
         btns[index].onclick = (evt) =>{
        evt.target.previousElementSibling.classList.toggle("done")
          }
      }
      .done {
        text-decoration: line-through;
        text-decoration-thickness: 0.2rem;
        text-decoration-color:red;
      }
      <li id="" >Target This element</li>
      <button  class="btn">toggle</button>
      
      <li id="" >Target This element</li>
      <button  class="btn">toggle</button>
      
      <li id="lEl" >Target This element</li>
      <button  class="btn">toggle</button>

      【讨论】:

        【解决方案3】:

        ID 在页面中应该是唯一的,因此可以将它们切换到类。

        如果你想要按钮,你应该添加它们之内列表项元素。

        您可以将一个侦听器附加到 &lt;ul&gt; 元素,并让该侦听器在其子项“冒泡”DOM 时捕获事件。 (这称为 event delegation。)

        当触发点击事件时,您可以检索使用 event.target 单击的特定元素,检查它是否为按钮元素,找到该按钮的 closest 列表项元素,然后切换其类。

        const list = document.querySelector('ul');
        list.addEventListener('click', toggleDoneClass);
        
        function toggleDoneClass(e) {
          if (e.target.matches('button')) {
            e.target.closest('li').classList.toggle('done');
          }
        }
        .done { text-decoration: line-through; text-decoration-thickness: 0.2rem; text-decoration-color:red; }
        li button { margin-left: 0.5em; }
        <ul>
          <li class="liEl">
            Target This element
            <button type="button">Toggle</button>
          </li>
          <li class="liEl">
            Target This element
            <button type="button">Toggle</button>
          </li>
          <li class="liEl">
            Target This element
            <button type="button">Toggle</button>
          </li>
        </ul>

        但是,最终,您并不真的需要这些按钮。

        const list = document.querySelector('ul');
        list.addEventListener('click', toggleDoneClass);
        
        function toggleDoneClass(e) {
          if (e.target.matches('li')) {
            e.target.classList.toggle('done');
          }
        }
        .done { text-decoration: line-through; text-decoration-thickness: 0.2rem; text-decoration-color:red; }
        li:hover { cursor: pointer; }
        <ul>
          <li class="liEl">Target This element</li>
          <li class="liEl">Target This element</li>
          <li class="liEl">Target This element</li>
        </ul>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-05
          • 2020-09-14
          • 1970-01-01
          • 2013-06-19
          • 2021-03-15
          • 1970-01-01
          • 2019-02-15
          • 1970-01-01
          相关资源
          最近更新 更多