Я пытаюсь создать список дел, в котором пользователи могут щелкнуть текст элемента в списке, и он вычеркнет строку через текст. Пользователи также могут добавлять новые элементы в список задач, вводя их в строку ввода текста. Когда я впервые загружаю страницу, я жестко закодировал несколько элементов в свой список, и все работает, когда я нажимаю на текст этих элементов. Когда я ввожу текст в панель ввода и впервые создаю новый объект, он продолжает нормально работать. Однако, когда я создаю второй новый объект, все начинает вести себя немного странно. Когда я нажимаю на текст только что созданного объекта, строка проходит через него нормально, но когда я нажимаю на строку предыдущих, ничего не происходит, и я не могу понять, почему.
$('.todo-item').on("mouseenter", function(){
$(this).css("background", "#E3E1E1");
});
$('.todo-item').on("mouseleave", function(){
$(this).css("background", "white");
});
$('.todo-item').on("click", function(){
$(this).toggleClass("strike");
});
$('.far').on("click",function(event){
event.stopPropagation();
$(this).parent().fadeOut("slow");
});
$(document.body).delegate('input:text', 'keypress', function(e) {
if (e.which === 13&&$("#search-id").val()! = "") { // if is enter
e.preventDefault(); // don't submit form
let input=$("#search-id").val();
$( "<div class='todo-item'><hr width='100%'' class='divider' color='grey'><i class='far fa-square'></i>"+input+"<div>" ).appendTo( "#list-todo" );
$("#search-id").val("");
}
$('.todo-item').on("mouseenter", function(){
$(this).css("background", "#E3E1E1");
});
$('.todo-item').on("mouseleave", function(){
$(this).css("background", "white");
});
$('.todo-item').on("click", function(){
$(this).toggleClass("strike");
});
$('.far').on("click",function(event){
event.stopPropagation();
$(this).parent().fadeOut("slow");
});
});strike{
text-decoration: line-through;
color:#D6D1D1;
}
.fas{
padding-left: 140px;
}
#todo-div{
width:400px;
margin-right: auto;
margin-left: auto;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
#list-todo{
background-color: white;
padding:0;
padding-left: 2px;
}
.divider{
margin: 0em;
border-width: 1px;
}<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id = "todo-div">
<div id = "list-header">To do list<i class = "fas fa-plus"></i></div>
<input type = "text" name = "" class = "form-control" id = "search-id" placeholder = "Add to-do item here">
<ul id = "list-todo">
<div class = "todo-item">
<hr width = "100%" class = "divider" color = "grey">
<i class = "far fa-square">
</i>Study for itp-303
</div>
<div class = "todo-item" >
<hr width = "100%" class = "divider" color = "grey">
<i class = "far fa-square">
</i>Do laundry
</div>
<div class = "todo-item" >
<hr width = "100%" class = "divider" color = "grey">
<i class = "far fa-square">
</i>Make Dinner
</div>
</ul>
</div>Для этого задания я должен создать все функции обработки событий с помощью jQuery.
Конечно, но это не значит, что вам нужно использовать события, когда CSS — это все, что нужно. Вы изобретаете потребность в событиях, когда в ней нет необходимости.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это намного проще, чем вы это делаете. Используйте простой CSS, чтобы заменить mouseenter и mouseleave и делегация мероприятия, чтобы настроить события click, чтобы к динамически создаваемым элементам были привязаны обработчики событий.
См. встроенные комментарии:
// You need to use event delegation to handle the existing and dynamically created elements
$(document).on("click", ".todo-item", function(){
$(this).toggleClass("strike");
});
$(document).on("click", ".far", function(){
// No need to stop propagation on this event
$(this).parent().fadeOut("slow");
});
$("#search-id").on('keypress', function(e) {
let input= $(this).val();
if (e.which === 13 && input !== "") {
$("<div class='todo-item'><hr class='divider'><i class='far fa-square'>X </i>" + input + "</div>" ).appendTo("#list-todo");
$("#search-id").val("");
}
});/* This simple class replaces your mouseenter and mouseleave event handlers */
.todo-item:hover { background-color:#E3E1E1; }
/* You didn't have the . before the class name */
.strike {
text-decoration: line-through;
color:#D6D1D1;
}
.fas { padding-left: 140px; }
#todo-div{
width:400px;
margin-right: auto;
margin-left: auto;
box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19);
}
#list-todo{
background-color: white;
padding:0;
padding-left: 2px;
}
/* You were hard-coding width:100% into each <hr>, but:
1) width:100% is the default for <hr> anyway
2) even if it wasn't, you should put the CSS here and not in the tags */
.divider { margin: 0em; border-width: 1px; color:grey; }<link href = "//maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" type = "text/css" rel = "stylesheet">
<div id = "todo-div">
<div id = "list-header">To do list<i class = "fas fa-plus"></i></div>
<input type = "text" name = "" class = "form-control" id = "search-id" placeholder = "Add to-do item here">
<ul id = "list-todo">
<div class = "todo-item">
<hr class = "divider" color = "grey">
<i class = "far fa-square">X </i>Study for itp-303
</div>
<div class = "todo-item" >
<hr class = "divider" color = "grey">
<i class = "far fa-square">X </i>Do laundry
</div>
<div class = "todo-item" >
<hr class = "divider" color = "grey">
<i class = "far fa-square">X </i>Make Dinner
</div>
</ul>
</div>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src = "https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity = "sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin = "anonymous"></script>
Большая часть кода, о котором вы говорите, работает, а код, который, как я вижу, вы написали, не работает. Я не вижу никакого удара по поведению или исчезновению. Другие части совершенно не нужны (
onmouseoverиonmouseleaveмогут быть удалены, и их заменит один класс CSS, использующий псевдокласс:hover. Кроме того, поскольку в вашем коде нет элементаform, вам не о чем беспокоиться. о проверке нажатия клавиши ENTER и отмене событияsubmit.