javascript - 为什么我添加的事件监听器只适用于通过 Id 而不是通过类获取的元素?

标签 javascript html button addeventlistener

我正在尝试做一个非常简单的 Java 脚本测验来尝试学习该语言。

var result = document.getElementById("result");

var rightAnswer = document.getElementById("correct").addEventListener("click",correctAnswer);

function correctAnswer(){
 result.innerText="Correct";
};

var wrongAnswer = document.getElementsByClassName("wrong").addEventListener("click",wrongAnswer);

function wrongAnswer(){
 result.innerText="Wrong";
};

当我运行它并测试时,正确的答案工作正常,但错误的答案没有响应。当我查看控制台时,它说“document.getElementsByClassName(...).addEventListener 不是一个函数”,这让我很困惑,因为我看到它的格式与另一行完全相同,但“getElementsByClassName”除外。我不能为同一类的多个按钮添加相同的事件监听器吗? HTML

<!DOCTYPE html>
<html>

<head>
<title>Quiz</title>

</head>

<body>
<p>Who was the first president of the United States?</p>

<button class='button wrong' type='button'>Thomas Jefferson</button>

<button class='button' id='correct' type='button'>George Washington</button>

<button class='button wrong' type='button'>James Madison</button>

<button class='button wrong' type='button'>John F Kennedy</button>

<p id='result'></p>

<script src='quiz.js'></script>

</body>

</html>

最佳答案

错误控制台中的错误是因为您无法运行链接到 getElementsByTagName()addEventListener()

getElementsByTagName() 返回一个节点set,而 addEventListener() 是 HTML node 的方法对象,而不是节点集对象。

换句话说,它运行在单个节点上。这意味着我们要么需要迭代节点集并将事件绑定(bind)到找到的每个节点,要么使用事件委托(delegate)。

迭代方法

var wrong = document.querySelectorAll(".wrong");
wrong.forEach(function(el) {
    el.addEventListener("click",wrongAnswer, false);
});

委托(delegate)方法

通过事件委托(delegate),您不是绑定(bind)到每个节点,而是绑定(bind)到共同的父节点或祖先。然后,您询问哪个节点触发了该事件。

我们可以依赖这一点,因为事件“bubble”;它们不仅会为它们所绑定(bind)的元素触发,还会为该元素的子节点/后代节点(从最内层向外)触发。

换句话说,触发元素 (evt.target) 和上下文元素 (this) 可能不相同。

假设所有 .wrong 元素都位于一个公共(public)容器中,ID 为 #wrong

然后我们可以这样做:

document.querySelector('#wrong').addEventListener('click', function(evt) {
    var trigger_el = evt.target;
    if (!evt.target.matches('.wrong') return; //do nothing - was some other element
    wrongAnswer.call(trigger_el); //call wrongAnswer in the context of the trigger element
}, false);

关于javascript - 为什么我添加的事件监听器只适用于通过 Id 而不是通过类获取的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48844619/

相关文章:

javascript - 以优雅的方式停止 jQuery 链接

javascript - 将项目列表从 $.get() 传递到 MVC Controller

javascript - CSS 和 JavaScript 动画不适用于所有部分

javascript - 使用 JavaScript 将相对路径转换为绝对路径

java - StateBased Java Game - 如何判断鼠标按钮是否被释放?

javascript - sigma.js 中的自定义行为

Jquery UI 以编程方式触发更改事件?

javascript - 如何在javascript中按下按钮时连续更改对象的属性值

c - 如何使用 winAPI 绘制按钮

javascript - 为什么会出现此引用错误? (Cordova 插件、Facebook、Javascript、HTML)