我目前正在尝试编写一些JavaScript来获取已单击的类的属性。我知道,要正确地做到这一点,我应该使用事件侦听器。
我的代码如下:
var classname = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
classname.addEventListener('click', myFunction(), false);
我期待得到一个警告框,每次我点击一个类告诉我的属性,但不幸的是,这并不管用。有人能帮忙吗?
(注意-我可以很容易地在jQuery中做到这一点,但我不喜欢使用它)
这应该有用。getElementsByClassName返回匹配条件的元素的一个类似数组的对象(见下文)。
var elements = document.getElementsByClassName("classname");
var myFunction = function() {
var attribute = this.getAttribute("data-myattribute");
alert(attribute);
};
for (var i = 0; i < elements.length; i++) {
elements[i].addEventListener('click', myFunction, false);
}
jQuery为您完成循环部分,这需要在纯JavaScript中完成。
如果你有ES6支持,你可以替换你的最后一行:
Array.from(elements).forEach(function(element) {
element.addEventListener('click', myFunction);
});
注意:旧的浏览器(如IE6, IE7, IE8)不支持getElementsByClassName,因此它们返回undefined。
getElementsByClassName的详细信息
getElementsByClassName不返回数组,但在大多数浏览器中是HTMLCollection,或在某些浏览器中是NodeList (Mozilla ref)。这两种类型都是类似Array的(意味着它们有一个length属性,对象可以通过它们的索引访问),但不是严格意义上的Array或继承自Array(意味着可以在Array上执行的其他方法不能在这些类型上执行)。
感谢用户@Nemo指出这一点,并让我深入了解。
对于许多具有相同类名的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
}