Как заставить значки кнопок работать?

#javascript #html #button #icons

#javascript #HTML #кнопка #Значки

Вопрос:

Я пытался удалить или проверить кнопку, когда пользователь нажимает на кнопку. Это работает, но когда я нажимаю на значки buton, он не удаляет список и не проверяет его, если пользователь нажимает на галочку. Итак, у меня есть что-то вроде этого:

 <button> //here I actually have code if user clicks on it (check or delete mark button) it deletes or check it as task completed
     <span>
         <i></i> // here I have icons of delete and check mark
     </span>
 </button>
  

Это создается внутри кода JavaScript (как показано ниже)
Как я могу применить то же самое к значкам, которые будут созданы позже, а не уже в моем html. Если вы проверите мой код, он:

icontainerforremove.className = «fas fa-trash-alt»; icontainer.className = «fas fa-check-circle»;

Это два вышеупомянутых, я не уверен, как заставить это работать, если пользователь нажимает на значки кнопки, а не на кнопку (это работает при нажатии кнопки, но у меня есть маленькие значки внутри кнопки, такие как check и bin — поэтому удалить его не работает, когда пользователь нажимает на эти значки) Я не знаю, как добавить туда эти функциональные возможности, поскольку они создаются позже внутри javascript. Если требуется больше объяснений, пожалуйста, дайте мне знать. Любая помощь приветствуется.

Мой код:

 const todoInput = document.querySelector(".form-control");
const todoButton = document.querySelector(".add");
const todoList = document.querySelector(".todo-list");

document.addEventListener("DOMContentLoaded", getTodos);
todoButton.addEventListener("click", addTodo);
todoList.addEventListener("click", deleteCheck);

function addTodo(event) {
  event.preventDefault();

  const todoDiv = document.createElement("div");
  todoDiv.classList.add("todo-item");

  const newTodo = document.createElement("h6");
  newTodo.innerText = todoInput.value;
  newTodo.classList.add("list-item-text");

  todoDiv.appendChild(newTodo);
  saveLocalTodos(todoInput.value);

  const removeButton = document.createElement("button");

  removeButton.classList =
    "remove btn btn-primary font-weight-bold float-right mt--20";
  changeColorRemove(removeButton);

  const spancontainerforremove = document.createElement("span");
  const icontainerforremove = document.createElement("i");

  icontainerforremove.className = "fas fa-trash-alt";


  spancontainerforremove.appendChild(icontainerforremove);
  removeButton.appendChild(spancontainerforremove);

  todoDiv.appendChild(removeButton);

  const completedButton = document.createElement("button");

  changeColor(completedButton);

  completedButton.classList =
    "complete btn btn-primary font-weight-bold float-right mr-1 mt--20";

  const spancontainer = document.createElement("span");
  const icontainer = document.createElement("i");

  icontainer.className = "fas fa-check-circle";

  spancontainer.appendChild(icontainer);
  completedButton.appendChild(spancontainer);

  todoDiv.appendChild(completedButton);

  todoList.appendChild(todoDiv);
  todoInput.value = "";
}

function deleteCheck(e) {
  const tgt = e.target;
  if (tgt.classList.contains("remove") || tgt.classList[0] ==="fas") {
    removeLocalTodos(tgt);
    tgt.closest("div").remove();
  } else if (tgt.classList[0] === "complete") {
    const todo = tgt.parentElement;
    todo.classList.toggle("completed");
    console.log(todo);
    tgt.closest("div").style.setProperty("text-decoration", "line-through");
    tgt.closest("div").style.setProperty("opacity", "0.2");
  }
}
function changeColor(completedButton) {
  completedButton.style.setProperty("background-color", "#41e141");
  completedButton.style.setProperty("border", " 1px solid #41e141");
}

function changeColorRemove(removeButton) {
  removeButton.style.setProperty("background-color", "#FF0000");
  removeButton.style.setProperty("border", " 1px solid #FF0000");
}

function saveLocalTodos(todo) {
  let todos;
  if (localStorage.getItem("todos") === null) {
    todos = [];
  } else {
    todos = JSON.parse(localStorage.getItem("todos"));
  }

  todos.push(todo);
  localStorage.setItem("todos", JSON.stringify(todos));
}

function getTodos() {
  let todos;

  if (localStorage.getItem("todos") === null) {
    todos = [];
  } else {
    todos = JSON.parse(localStorage.getItem("todos"));
  }
  todos.forEach(function (todo) {
    const todoDiv = document.createElement("div");
    todoDiv.classList.add("todo-item");

    const newTodo = document.createElement("h6");
    newTodo.innerText = todo;
    newTodo.classList.add("list-item-text");

    todoDiv.appendChild(newTodo);

    const removeButton = document.createElement("button");

    removeButton.classList =
      "remove btn btn-primary font-weight-bold float-right mt--20";
    changeColorRemove(removeButton);

    const spancontainerforremove = document.createElement("span");
    const icontainerforremove = document.createElement("i");

    icontainerforremove.className = "fas fa-trash-alt";

    spancontainerforremove.appendChild(icontainerforremove);
    removeButton.appendChild(spancontainerforremove);

    todoDiv.appendChild(removeButton);

    const completedButton = document.createElement("button");

    changeColor(completedButton);

    completedButton.classList =
      "complete btn btn-primary font-weight-bold float-right mr-1 mt--20";

    const spancontainer = document.createElement("span");
    const icontainer = document.createElement("i");

    icontainer.className = "fas fa-check-circle";

    spancontainer.appendChild(icontainer);
    completedButton.appendChild(spancontainer);

    todoDiv.appendChild(completedButton);

    todoList.appendChild(todoDiv);
  });
}

function removeLocalTodos(todo) {
  let todos;
  if (localStorage.getItem("todos") === null) {
    todos = [];
  } else {
    todos = JSON.parse(localStorage.getItem("todos"));
  }
  const todoIndex = todo.children[0].innerText;
  todos.splice(todos.indexOf(todoIndex), 1);
  localStorage.setItem("todos", JSON.stringify(todos));
}
  

Комментарии:

1. вы можете прикрепить событие к значку, когда они отображаются с помощью кода.

Ответ №1:

Проблема, с которой вы столкнулись, связана с тем, как вы используете привязку событий. Вы привязываете обработчик событий при загрузке своей страницы. Хотя элементы, добавленные с помощью вашего скрипта, не привязаны к обработчику событий.

Вы можете исправить это, либо привязав свой обработчик событий к вновь добавленным элементам. Или используйте обработчик событий делегата, который также будет привязываться к вновь добавленным элементам.

Измените свой код на этот:

 function addTodo(event) {
    /* other code omitted for brevity */

    todoButton.addEventListener("click", addTodo);
    removeButton.addEventListener("click", deleteCheck);
}
  

Обновить

После лучшего понимания вашего вопроса, возможно, вы можете попробовать использовать это правило css: pointer-events: none;

Чтобы создать элемент, на который вы наложили это правило, щелкните по нему. Таким образом, вы могли бы стилизовать свои i теги с помощью этого. И ваше событие щелчка должно попасть на вашу кнопку.

Итак:

 <button> <-- let's say this has a click event
    My button <i class="fa fa-plus-sign"></i> <-- this has the css style pointer-events: none;
</button>
  

Нажатие на тег i (в данном случае значок) приведет к тому, что щелчок пройдет через значок и попадет на кнопку. Если я правильно вас понял, это должно сработать.

Комментарии:

1. Я пробовал это, но это не работает. Потому что мне нужно настроить значки, а не кнопку, поскольку кнопка уже работает. Только значок внутри этой кнопки не работает при нажатии.