简体   繁体   English

事件监听器不能使用纯Javascript处理动态创建的按钮?

[英]Event listeners not working with dynamically created buttons, using pure Javascript?

I'm creating button elements through Javascript after each li element. 我在每个li元素之后通过Javascript创建按钮元素。 However, event listeners are not working for these buttons. 但是,事件侦听器不适用于这些按钮。 Event listeners bound to button with text "Enter", which is already in the HTML and not dynamically created work fine. 事件侦听器绑定到带有文本“ Enter”的按钮,该文本已经在HTML中并且没有动态创建,可以正常工作。 Hence, I believe the problem has something to do with my creating of buttons using Javascript. 因此,我相信问题与我使用Javascript创建按钮有关。 I suspect this can be solved by event delegation, but I'm lost as to how. 我怀疑这可以通过事件委托来解决,但是我不知道该如何做。

Following is my HTML: 以下是我的HTML:

<!DOCTYPE html>
<html>
<head>
    <title>Javascript + DOM</title>
    <link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>
    <h1>Shopping List</h1>
    <p id="first">Get it done today</p>
    <input id="userinput" type="text" placeholder="Enter items">
    <button id="enter">Enter</button>
    <ul>
        <li class="bold red" random="23">Notebook
        </li>
        <li>Jello</li>
        <li>Spinach</li>
        <li>Rice</li>
        <li>Birthday Cake</li>
        <li>Candles</li>
    </ul>
    <script type="text/javascript" src="script.js"></script>
</body>
</html>

Following is my Javascript: 以下是我的Javascript:

var button = document.getElementById("enter");
var input = document.getElementById("userinput");
var shoppingItem = document.getElementsByTagName("li");
var ul = document.getElementsByTagName("ul")[0];

function inputLength() {
    return input.value.length;
}

function createListElement() {
    var li = document.createElement("li");
    li.appendChild(document.createTextNode(input.value));
    var ul = document.getElementsByTagName("ul")[0];
    ul.appendChild(li);
    input.value = "";
    return li;
}

function addElementAfterClick() {
    if (inputLength() > 0) {
        createListElement();    
    }
}

function addElementAfterPress(event) {
    if (inputLength() > 0 && event.keyCode === 13) {
        createListElement();
    }
}

function addLineThroughEvent(element) {
    element.addEventListener("click", function() {
    element.classList.toggle("done");
    });
}

function addDeleteButton(element) {
    var del = document.createElement("button");
    del.addEventListener("click", function () { // This doesn't work
        alert("You clicked")
    })
    del.appendChild(document.createTextNode("Delete"));
    element.insertAdjacentHTML("afterend", del.outerHTML);
}

input.addEventListener("keypress", addElementAfterPress);

Array.from(shoppingItem).forEach(addLineThroughEvent);

Array.from(shoppingItem).forEach(addDeleteButton);

button.addEventListener("click", addElementAfterClick);

I know I can solve this using jQuery. 我知道我可以使用jQuery解决此问题。 However, I need to be able to solve this using Javascript. 但是,我需要能够使用Javascript解决此问题。

You are adding the button HTML only which does not include the event listens. 您正在添加仅不包含事件侦听的按钮HTML。 You need to append the DOM element for the button using insertAdjacentElement . 您需要使用insertAdjacentElement为按钮添加DOM元素。 Also, you need to call addDeleteButton after dynamically adding li 另外,您需要在动态添加li之后调用addDeleteButton

 var button = document.getElementById("enter"); var input = document.getElementById("userinput"); var shoppingItem = document.getElementsByTagName("li"); var ul = document.getElementsByTagName("ul")[0]; function inputLength() { return input.value.length; } function createListElement() { var li = document.createElement("li"); li.appendChild(document.createTextNode(input.value)); var ul = document.getElementsByTagName("ul")[0]; ul.appendChild(li); addDeleteButton(li) input.value = ""; return li; } function addElementAfterClick() { if (inputLength() > 0) { createListElement(); } } function addElementAfterPress(event) { if (inputLength() > 0 && event.keyCode === 13) { createListElement(); } } function addLineThroughEvent(element) { element.addEventListener("click", function() { element.classList.toggle("done"); }); } function addDeleteButton(element) { var del = document.createElement("button"); del.addEventListener("click", function () { // This doesn't work alert("You clicked") }) del.appendChild(document.createTextNode("Delete")); element.insertAdjacentElement("afterend", del); } input.addEventListener("keypress", addElementAfterPress); Array.from(shoppingItem).forEach(addLineThroughEvent); Array.from(shoppingItem).forEach(addDeleteButton); button.addEventListener("click", addElementAfterClick); 
 <!DOCTYPE html> <html> <head> <title>Javascript + DOM</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <h1>Shopping List</h1> <p id="first">Get it done today</p> <input id="userinput" type="text" placeholder="Enter items"> <button id="enter">Enter</button> <ul> <li class="bold red" random="23">Notebook </li> <li>Jello</li> <li>Spinach</li> <li>Rice</li> <li>Birthday Cake</li> <li>Candles</li> </ul> <script type="text/javascript" src="script.js"></script> </body> </html> 

You need to add the events after creating the nodes in createListElement 您需要在createListElement中创建节点后添加事件

 var button = document.getElementById("enter"); var input = document.getElementById("userinput"); var shoppingItem = document.getElementsByTagName("li"); var ul = document.getElementsByTagName("ul")[0]; function inputLength() { return input.value.length; } function createListElement() { var li = document.createElement("li"); li.appendChild(document.createTextNode(input.value)); var ul = document.getElementsByTagName("ul")[0]; ul.appendChild(li); input.value = ""; addDeleteButton(li); addLineThroughEvent(li); return li; } function addElementAfterClick() { if (inputLength() > 0) { createListElement(); } } function addElementAfterPress(event) { if (inputLength() > 0 && event.keyCode === 13) { createListElement(); } } function addLineThroughEvent(element) { element.addEventListener("click", function() { element.classList.toggle("done"); }); } function addDeleteButton(element) { var del = document.createElement("button"); del.addEventListener("click", function () { // This doesn't work alert("You clicked") }) del.appendChild(document.createTextNode("Delete")); element.insertAdjacentElement("afterend", del); } input.addEventListener("keypress", addElementAfterPress); Array.from(shoppingItem).forEach(addLineThroughEvent); Array.from(shoppingItem).forEach(addDeleteButton); button.addEventListener("click", addElementAfterClick); 
 <!DOCTYPE html> <html> <head> <title>Javascript + DOM</title> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <h1>Shopping List</h1> <p id="first">Get it done today</p> <input id="userinput" type="text" placeholder="Enter items"> <button id="enter">Enter</button> <ul> <li class="bold red" random="23">Notebook </li> <li>Jello</li> <li>Spinach</li> <li>Rice</li> <li>Birthday Cake</li> <li>Candles</li> </ul> <script type="text/javascript" src="script.js"></script> </body> </html> 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 将事件侦听器添加到动态创建的按钮 - Adding Event Listeners to dynamically created buttons Vanilla Javascript:如何将多个事件侦听器添加到使用 django 中的相同 class 动态创建的按钮? - Vanilla Javascript: How to add multiple event listeners to buttons which are dynamically created with same class in django? 无法将事件侦听器附加到动态创建的按钮 - Can't attach the event listeners to the dynamically created buttons 在javascript中动态创建的按钮,未使用正确的onClick事件 - Dynamically created buttons in javascript, not using the correct onClick event 将事件侦听器添加到 <li> 使用javascript创建的 - Adding event listeners to <li> that are created using javascript 在javascript函数中创建的按钮的事件监听器/ onclick事件 - Event listeners/onclick events for buttons created in javascript function 如何使用for循环将事件侦听器添加到动态生成的按钮 - How to add event listeners using a for loop to dynamically generated buttons 由 JavaScript 为 Google Maps Legend 创建的 html 元素的事件侦听器不起作用 - Event listeners to html elements created by javascript for Google Maps Legend is not working 将事件侦听器添加到从数组创建的按钮中 - Adding event listeners to buttons created from an array 使用 JavaScript 顺时针移动动态创建的按钮 - Move the dynamically created buttons in clockwise using JavaScript
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM