Javascript:事件监听器中未定义 event.target.id

标签 javascript for-loop event-handling dom-events

我正在尝试为 for 循环中的多个 div 添加事件监听器:

var divElements = document.getElementsByClassName('B');
var vMax = divElements.length;
for (var i = 0; i < vMax; i += 1) {
    divElements[i].addEventListener('DOMCharacterDataModified', function(e) {
        myFunc(e.target);
    }, false);
}

function myFunc(elem) {
    var text = elem.textContent;
    var id = elem.id;
    console.log("text: " + text);
    console.log("id: " + id);
}

此代码的问题是,尽管 text 正常并且其中包含正确的文本,但 id 变量未定义,尽管该元素在 html 中设置了 id。这段代码可以吗还是我遗漏了什么?

我也尝试了 e.target.getAttribute("id") 但最终出现 e.target.getAttribute is not a function 错误。

最佳答案

问题在于文本节点是作为大多数元素节点的隐式子节点创建的节点。您正在尝试获取相关文本节点的父元素节点的 id,但 elem 是该节点的子节点,因此您必须访问 elem.parentNode.id.

我们可以通过检查不同节点的 nodeTypenodeName 属性来看到这一点。

来自MDN :

  • 元素节点的节点类型为1
  • 文本节点的节点类型为 3

var div = document.getElementById("A");
div.addEventListener('DOMCharacterDataModified', function(e) {
  console.log("Target element is a " + e.target.nodeName + " node and has a node type of: " + e.target.nodeType);
  console.log("Target element.parentNode is a " + e.target.parentNode.nodeName + 
               " node and has a node type of: " + e.target.parentNode.nodeType);

  console.log("Target element.text: " + e.target.textContent);
  console.log("Target element.parentNode.id: " + e.target.parentNode.id);
});
<h1>Click into the text below and modify it somehow:</h1>
<div id="A" contenteditable>Something</div>

关于Javascript:事件监听器中未定义 event.target.id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50897679/

相关文章:

javascript - jQuery 和 Audio.js : song dynamically added to playlist not playing or recognizing

javascript - 如何使用 url 中的图像初始化 Angular 图像裁剪器?

javascript - 当您将鼠标悬停在另一个 div 中的按钮上时,如何更改 div 背景?

javascript - getJSON 方法不起作用

javascript - jQuery on click 处理程序未在 asp.net 组件上激活

javascript - 如何使用 for 循环获取 javascript-value 对象中的最后一项?

ScalaFx:具有一流功能的事件处理程序

c# - 动态添加按钮的onclick事件

javascript - For-Of 循环与 For 循环

python - 如何分别绘制重复循环的结果?