События по щелчку и динамически созданные элементы в неупорядоченном списке

Я пытаюсь создать список дел, в котором пользователи могут щелкнуть текст элемента в списке, и он вычеркнет строку через текст. Пользователи также могут добавлять новые элементы в список задач, вводя их в строку ввода текста. Когда я впервые загружаю страницу, я жестко закодировал несколько элементов в свой список, и все работает, когда я нажимаю на текст этих элементов. Когда я ввожу текст в панель ввода и впервые создаю новый объект, он продолжает нормально работать. Однако, когда я создаю второй новый объект, все начинает вести себя немного странно. Когда я нажимаю на текст только что созданного объекта, строка проходит через него нормально, но когда я нажимаю на строку предыдущих, ничего не происходит, и я не могу понять, почему.

$('.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>

Большая часть кода, о котором вы говорите, работает, а код, который, как я вижу, вы написали, не работает. Я не вижу никакого удара по поведению или исчезновению. Другие части совершенно не нужны (onmouseover и onmouseleave могут быть удалены, и их заменит один класс CSS, использующий псевдокласс :hover. Кроме того, поскольку в вашем коде нет элемента form, вам не о чем беспокоиться. о проверке нажатия клавиши ENTER и отмене события submit.

Scott Marcus 17.02.2019 21:25

Для этого задания я должен создать все функции обработки событий с помощью jQuery.

john smith 17.02.2019 21:28

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

Scott Marcus 17.02.2019 21:29
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это намного проще, чем вы это делаете. Используйте простой 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>

Другие вопросы по теме