Javascript функция щелчка выбирает только первый элемент или все элементы одновременно - PullRequest
0 голосов
/ 19 февраля 2020

Я сделал простой неупорядоченный список с флажками и хочу, чтобы класс с зачеркнутым текстом был применен к li, к которому относится этот флажок. Методы, которые я попробовал, либо работают только с первым элементом, либо применяются ко всем сразу.

HTML:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="style.css">
  <title>Document</title>
</head>
<body>
  <h1>Todo List</h1>
  <ul>
    <li>
      <input type="checkbox">
      List Item 1
    </li>
    <li>
      <input type="checkbox">
      List Item 2
    </li>
    <li>
      <input type="checkbox">
      List Item 3
    </li>
  </ul>
</body>
</html>

Javascript (только выбор первый):

document.querySelector("input").addEventListener("click", addStrike);

function addStrike() {
  document.querySelector("li").classList.toggle("completed");
}

(выбирает все сразу, при использовании этого кода в моем html CDN jquery)

$("li").on("click", addStrike);

function addStrike() {
  $("li").toggleClass("completed")
}

Ответы [ 3 ]

1 голос
/ 19 февраля 2020

Вам необходимо установить все флажки, l oop над ними и прикрепить событие.

function cbClicked (event) {
  // reference the checkbox
  var cb = event.target
  // find it was checked
  var isChecked = cb.checked
  cb.closest("li")  // find the parent li
    .classList.toggle("done", isChecked) // toggle the class
}


// Select all the checkboxes
var checkboxes = document.querySelectorAll('ul input[type="checkbox"]')

// loop over all the checkboxes
checkboxes.forEach( function (cb) {
  // attach the event listener to each one
  cb.addEventListener("change", cbClicked)
})
.done {
  text-decoration: line-through;
}
<ul>
    <li>
      <input type="checkbox">
      List Item 1
    </li>
    <li>
      <input type="checkbox">
      List Item 2
    </li>
    <li>
      <input type="checkbox">
      List Item 3
    </li>
  </ul>

Если вы хотите использовать jQuery, это похоже, jQuery просто делает цикл для вас

function cbClicked (event) {
  // reference the checkbox
  var cb = this
  var isChecked = this.checked
  $(cb).closest("li")  // find the parent li
    .toggleClass("done", isChecked) // toggle the class
}


// Select all the checkboxes
var checkboxes = $('ul input[type="checkbox"]').on("change", cbClicked)
.done {
  text-decoration: line-through;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
    <li>
      <input type="checkbox">
      List Item 1
    </li>
    <li>
      <input type="checkbox">
      List Item 2
    </li>
    <li>
      <input type="checkbox">
      List Item 3
    </li>
  </ul>

И это можно сделать с помощью Just CSS

input:checked + label {
  text-decoration: line-through;
}
<ul>
    <li>
      <input type="checkbox" id="cb1">
      <label for="cb1">List Item 1</label>
    </li>
    <li>
      <input type="checkbox" id="c2">
      <label for="cb2">List Item 2</label>
    </li>
    <li>
      <input type="checkbox" id="cb3">
      <label for="cb3">List Item 3</label>
    </li>
  </ul>
0 голосов
/ 19 февраля 2020

Добавить Id к UL и затем использовать ниже javascript

document.getElementById('ele').addEventListener('click',function(e){
    event.target.parentElement.classList.toggle('completed');
});

document.querySelector всегда возвращает первый элемент, который соответствует данному селектору

0 голосов
/ 19 февраля 2020

Если вы предпочитаете применять класс «завершено» (и для этого стиля), когда флажок установлен, я бы рекомендовал сделать это с jQuery:

$(".strikeCheckbox").change(function() {
    if(this.checked) {
        $(this).parent().addClass("completed")
    } else {
        $(this).parent().removeClass("completed")
    }
});

Вы можете изменить родительская функция для указания c prev(...), если хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...