添加新元素后,事件侦听器不起作用

时间:2018-05-31 12:43:31

标签: javascript event-handling event-listener event-binding

基本上,我有一个文本框,我写了一些文字,点击“添加帖子”,一个新帖子将被添加到其他帖子列表(类似于Twitter)。每个帖子都有一个“删除”按钮。

现在,当我点击每个帖子上的删除时,我有一个console.log,只是说“TEST”。它工作正常。但是,在我添加一个帖子后,意味着一个新元素被添加,事件监听器停止工作,即使对于现有的“删除”按钮(不仅仅是新添加的按钮)。

这就是我为删除编写事件监听器的方法。

for(var i = 0; i < deleteDOM.length; i++) {
   deleteDOM[i].addEventListener("click", deleteEntryCont);
}

...其中deleteEntryCont只是控制台暂时记录“TEST”的函数。

deleteDOMdocument.getElementsByClassName("delete")的变量,只是一个节点列表。

以下是添加新“帖子”的部分:

entryList.forEach(function(entry) {

        var entryItemDOM = document.createElement("li");
        var entryTextDOM = document.createElement("p");
        var metaWrapperDOM = document.createElement("div");
        var timeStampDOM = document.createElement("span");
        var deleteDOM = document.createElement("span");

        // Create entry wrapper & class names
        entryItemDOM.className = "entry";
        entryItemDOM.className += ` ${entry.mood}-entry`;
        entryItemDOM.id = entry.id;

        // Insert entry at the top of the stack
        domEl.entriesDOM.insertBefore(entryItemDOM, domEl.entriesDOM.firstChild);

        entryItemDOM.appendChild(entryTextDOM);
        entryTextDOM.innerHTML = entry.text;

        entryItemDOM.appendChild(metaWrapperDOM);
        metaWrapperDOM.className = "overflow-hidden";

        metaWrapperDOM.appendChild(timeStampDOM);
        timeStampDOM.className = "timestamp";
        timeStampDOM.innerHTML = entry.timeStamp;

        metaWrapperDOM.appendChild(deleteDOM);
        deleteDOM.className = "delete";
        deleteDOM.innerHTML = "Delete";


      });

其中entryList是上述代码以HTML格式呈现的对象数组。

可能是什么问题?

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的,您只是在加载页面时添加事件侦听器,这意味着它只会添加到当时可见的帖子中。您需要将监听器分别添加到您创建的每个新帖子中:

metaWrapperDOM.appendChild(deleteDOM);
deleteDOM.className = "delete";
deleteDOM.innerHTML = "Delete";
deleteDOM.addEventListener('click', deleteEntryCont);