【问题标题】:Bind event to dynamically created HTML elements with vanilla JavaScript [no jquery] [duplicate]使用 vanilla JavaScript [无 jquery] [重复] 将事件绑定到动态创建的 HTML 元素
【发布时间】:2019-01-06 01:48:51
【问题描述】:

我需要将一个事件附加到一个动态创建的元素上。使用 jQuery,我可以使用以下代码将其存档:

$("body").on("click", ".my-element", function() {});

如果我添加了一个新的.my-element,它会自动附加该事件。

我不是通过document.createElement("div"); 创建元素,而是使用pjax 重新加载页面的某些部分,因此主 JavaScript 文件只加载一次,因此需要附加事件动态的。

如何使用原生 JavaScript 实现这一点?

【问题讨论】:

标签: javascript html events event-handling pjax


【解决方案1】:

您的 jQuery 示例的纯 JavaScript 版本

$("body").on("click", ".my-element", function() {});

应该是:

document.body.addEventListener("click", function (e) {
    if (e.target &&
        e.target.classList.contains("my-element")) {
        // handle event here
    }
});

请参阅下面的示例。

const addTestElements = () => {
    var el = document.createElement("p"),
        node = document.createTextNode("Test element, class 'my-element'");

    el.classList.add("my-element");
    el.appendChild(node);
    document.body.appendChild(el);

    el = document.createElement("p");
    node = document.createTextNode("Test element, class 'test'");
    el.classList.add("test");
    el.appendChild(node);
    document.body.appendChild(el);
}

document.getElementById("add").addEventListener("click", addTestElements);

document.body.addEventListener("click", function (e) {
    if (e.target &&
        e.target.classList.contains("my-element")) {
        console.clear();
        console.log("An element with class 'my-element' was clicked.")
        e.target.style.fontWeight = e.target.style.fontWeight === "bold" ? "normal" : "bold";
    }
});
<button id="add">Add element</button>

【讨论】:

  • 嗯,我试试看!但是,附加一个 body 事件监听器是个好主意吗?或者我的 jquery 代码现在正在做吗? xD
  • jQuery 在底层做了同样的事情:如果点击了 body,如果检查它是否匹配选择器(在这种情况下是类“my-element”)并在需要时执行回调函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 2010-12-04
  • 2014-10-15
  • 2016-08-13
  • 2011-09-18
  • 2020-09-29
相关资源
最近更新 更多