как заставить события слушать динамически созданные элементы html, используя jquery? - PullRequest
0 голосов
/ 20 марта 2020

я делаю этот проект, где мне приходится клонировать тодолист всякий раз, когда я нажимаю знак плюса, он клонирует тодолист. Но динамически создаваемый тодолист не прослушивает события, хотя я использовал .on вместо .click. Пожалуйста, просмотрите изображение, чтобы понять, что я говорю. Маленький знак плюс в левом боковом углу используется для клонирования всего списка задач , а больший знак плюс внутри списка задач используется для переключения видимости поля ввода. Когда создается новый список задач, нажав на маленький знак плюс. Слушатели событий в новом динамически создаваемом списке задач не работают.

    // Check Off Specific Todos By Clicking
    $("ul").on("click", "li", function(){
        $(this).toggleClass("completed");
    });

    //Click on X to delete Todo
    $("ul").on("click", "span", function(event){
        $(this).parent().fadeOut(500,function(){
            $(this).remove();
        });
event.stopPropagation();
    });

    $("input[type='text']").keypress(function(event){
        if(event.which === 13){
            //grabbing new todo text from input
            var todoText = $(this).val();
            $(this).val("");
            //create a new li and add to ul
            $("ul").append("<li><span><i class='fa fa-trash'></i></span> " + todoText + "</li>")
        }
    });

    $(".fa-plus").on("click",function(){
        $("input[type='text']").fadeToggle();
    });

    $("#test").on("click",function(){
       $("#container").clone().insertAfter( $("#container") );
    });

Это мой html код

<!DOCTYPE html>
<html>
<head>
    <title>Todo List</title>
    <link rel="stylesheet" type="text/css" href="assets/css/todos.css">
    <link href='https://fonts.googleapis.com/css?family=Roboto:400,700,500' rel='stylesheet' type='text/css'>
    <link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.css">
    <script type="text/javascript" src="assets/js/lib/jquery-2.1.4.min.js"></script>
</head>
<body>


    <i class="fa fa-plus-square" id="test"></i>
<div id="container">
    <h1>To-Do List <i class="fa fa-plus"></i></h1>
    <input type="text" placeholder="Add New Todo">

    <ul>
        <li><span><i class="fa fa-trash"></i></span> Go To Potions Class</li>
        <li><span><i class="fa fa-trash"></i></span> Buy New Robes</li>
        <li><span><i class="fa fa-trash"></i></span> Visit Hagrid</li>
    </ul>
</div>

<script type="text/javascript" src="assets/js/todos.js"></script>
</body>
</html>

1 Ответ

1 голос
/ 20 марта 2020

Простой способ решить эту проблему - передать true методу .clone():

$("#test").on("click",function(){
    $("#container").clone(true).insertAfter($("#container"));
});

Это логическое значение указывает, следует ли копировать обработчики событий вдоль с элементами. Значение по умолчанию false. Итак, когда мы вызывали метод .clone() без передачи логического значения, он просто копировал элементы, а не прикрепленные к нему обработчики событий. Но когда мы передаем значение true, оно копирует как элементы, так и любой обработчик событий, прикрепленный к нему.

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