我目前正在尝试编写一些JavaScript来获取已单击的类的属性。我知道,要正确地做到这一点,我应该使用事件侦听器。 我的代码如下:

var classname = document.getElementsByClassName("classname");

var myFunction = function() {
    var attribute = this.getAttribute("data-myattribute");
    alert(attribute);
};

classname.addEventListener('click', myFunction(), false);

我期待得到一个警告框,每次我点击一个类告诉我的属性,但不幸的是,这并不管用。有人能帮忙吗?

(注意-我可以很容易地在jQuery中做到这一点,但我不喜欢使用它)


当前回答

你可以使用querySelectorAll来选择所有的类,并循环遍历它们来分配eventListener。if条件检查它是否包含类名。

const arrClass = document.querySelectorAll(".className");
for (let i of arrClass) {
  i.addEventListener("click", (e) => {
    if (e.target.classList.contains("className")) {
        console.log("Perfrom Action")
    }
  })
}

其他回答

对于许多具有相同类名的DOM元素,这里有一种不同的方法,即在eventListener对象中选择path key。

向直接父类添加一个事件侦听器,该父类使用相同的类包装所有子元素,并通过选择事件对象中的第一个键来获取路径。

例如,你想编辑一个表的表格单元格

    //Select tbody element & add  event listener
    let tbody = document.querySelector('tbody');

    tbody.addEventListener("click", function(e,v) {
    // Get the clicked cell
    let cell = e.path[0];
    // Get the current cell value
    let cellValue = cell.innerHTML;
    //Rest of code goes here
    }
        

以上所有的答案都是正确的,我只是想演示另一种简单的方法

document.querySelectorAll('.classname').forEach( button => {
    button.onclick = function () {
    // rest of code
    }
});

还要考虑到,如果单击按钮,事件侦听器的目标不一定是按钮本身,而是您所单击的按钮内部的任何内容。您可以使用currentTarget属性引用为其分配侦听器的元素。下面是现代ES中使用单一语句的一个漂亮的解决方案:

    document.querySelectorAll(".myClassName").forEach(i => i.addEventListener(
        "click",
        e => {
            alert(e.currentTarget.dataset.myDataContent);
        }));

你可以使用querySelectorAll来选择所有的类,并循环遍历它们来分配eventListener。if条件检查它是否包含类名。

const arrClass = document.querySelectorAll(".className");
for (let i of arrClass) {
  i.addEventListener("click", (e) => {
    if (e.target.classList.contains("className")) {
        console.log("Perfrom Action")
    }
  })
}

使用现代JavaScript可以这样做:

const divs = document.querySelectorAll('.a'); divs.forEach(el => el.addEventListener('click', event => { console.log(event.target.getAttribute("data-el")); })); <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width"> <title>Example</title> <style> .a { background-color:red; height: 33px; display: flex; align-items: center; margin-bottom: 10px; cursor: pointer; } .b { background-color:#00AA00; height: 50px; display: flex; align-items: center; margin-bottom: 10px; } </style> </head> <body> <div class="a" data-el="1">1</div> <div class="b" data-el="no-click-handler">2</div> <div class="a" data-el="3">11</div> </body> </html>

按类名获取所有元素 使用forEach循环遍历所有元素 在每个元素上附加一个事件监听器 使用事件。目标检索特定元素的更多信息