使用原始JavaScript将事件绑定到动态创建的HTML元素[没有jquery]

时间:2019-01-06 01:48:51

标签: javascript html events event-handling pjax

我需要将事件附加到动态创建的元素上。使用jQuery,我可以使用以下代码对此进行归档:

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

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

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

如何使用香草JavaScript实现这一目标?

1 个答案:

答案 0 :(得分: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>