javascript - 替换innerHTML后EventListener不起作用

标签 javascript jquery html node.js

我正在编写一个测试工具。在我的工具中,我有一个菜单显示数据库中的所有测试套件。当用户单击测试套件名称时,它将显示测试套件的内容。首先,我将 eventlistenner 添加到每个子菜单。但是每次用户导入或删除测试套件时,我都必须更新菜单,并将新的 eventlistenner 添加到新的子菜单。我使用 jade 生成 HTML 代码,并用新菜单内容替换旧菜单内容。但问题是新的 eventlistenner 没有附加到新的子菜单。当我单击子菜单时,没有任何反应。那么请告诉我发生了什么事以及我必须做什么?

这是我最初的 Jade 代码:

li(id="RunTestsuite")
                a Run Testsuite
                ul
                    each testsuite in list.listTS
                        li(id="#{testsuite.ID}"): a #{testsuite.ID} - #{testsuite.Name}
                        script.
                            $("#RunTestsuite li##{testsuite.ID}").on("click", function(){
                                socket.emit("open testsuite", "#{testsuite.ID}", true);
                            });

如果数据库有任何更新,这就是我将替换#RunTestsuite的innerHTML:

each testsuite in list
   li(id="#{testsuite.ID}"): a #{testsuite.ID} - #{testsuite.Name}
each testsuite in list
   script.
      window.onload(function(){
         $("##{type} li##{testsuite.ID}").off();
         $("##{type} li##{testsuite.ID}").on("click", function(){
            socket.emit("#{command}", "#{testsuite.ID}");
      });
});

最佳答案

在动态生成的元素上,最好将事件监听器绑定(bind)到外部元素或 body,例如

$("body").on("click", "#RunTestsuite li##{testsuite.ID}", function(){
    socket.emit("open testsuite", "#{testsuite.ID}", true);
});

//$("##{type} li##{testsuite.ID}").off();
$("body").on("click", "##{type} li##{testsuite.ID}", function(){
    socket.emit("#{command}", "#{testsuite.ID}");
});

关于javascript - 替换innerHTML后EventListener不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31779280/

相关文章:

jquery - "scroll journey"网页如何工作

具有不同图像的 Javascript 计时器

javascript - 我如何使用 JavaScript (jQuery) 按照惯例在 HTML 中创建一个元素的副本作为新元素?

html - 使用 CSS,有什么方法可以使用不同的字体显示不同的字符?

javascript - 来自 Angular 应用程序的全局回调

javascript - react 表单个单元格样式

javascript - div 打开时更改链接上的文本

jquery - 动态添加和删除嵌套表单字段

javascript - 无法使用 JavaScript 发送 POST-JSON-Request

javascript - ngFor 未在 IE 11 中更新(带有 CoreJS 的 RC4)