为了账号安全,请及时绑定邮箱和手机立即绑定

keydown event.target 不正确

keydown event.target 不正确

德玛西亚99 2021-12-23 14:53:53
在下面的代码片段中,我的目标是记录用户正在输入的元素。但是当用户输入时span,事件目标仍然是div。document.getElementById("wrapper").addEventListener('keydown', (event)=>{  console.log("event.target.nodeName -> ", event.target.nodeName);});<i>Type in "world" below</i><div contenteditable="true" id=wrapper>  hello   <span> world!</span></div>
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

"但是当用户在 span 中输入时,事件目标仍然是 div。 "

没有 dasfdsa。用户没有输入span. 用户正在输入div.

这是 span

//img1.sycdn.imooc.com//61c41d1e000137e112791017.jpg

这是 div

//img1.sycdn.imooc.com//61c41d2a0001ffe612780991.jpg

还要注意contenteditable="true"代码中的 ,它设置为 div,而不是span. 这就是为什么event.target.nodeName显示div而不是span。


将 设置contenteditable="true"为span应该可以完成您的工作,如下所示


document.getElementById("wrapper").addEventListener('keydown', (event)=>{

  console.log("event.target.nodeName -> ", event.target.nodeName);

});

<i>Type in "world" below</i>

<div id=wrapper>

  hello 

  <span contenteditable="true" > world!</span>

</div>

编辑:似乎打字确实发生在 中span,感谢 Kaiido 提供此信息。但是event.target返回父元素(我实际上不知道为什么)。


查看完整回答
反对 回复 2021-12-23
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

获取此元素的一种方法是检查当前范围commonAncestorContainer是什么。

这将返回您的光标当前所在的节点(以及您正在输入的位置)。要获得最接近的元素,您可以简单地检查此节点的 nodeType,parentElement如果它不是 Element ,则返回它。


document.getElementById("wrapper").addEventListener('input', (event)=>{

  console.log("currently typing in ->", getFocusedElement() ); 

});


function getFocusedElement() {

  const node = getSelection().getRangeAt(0).commonAncestorContainer;

  return node.nodeType === 1 ? node : node.parentElement;  

}

<i>Type in "world" below</i>

<div contenteditable="true" id=wrapper>

  hello 

  <span> world!</span>

</div>


查看完整回答
反对 回复 2021-12-23
?
桃花长相依

TA贡献1860条经验 获得超8个赞

跨度在 div 内,事件将从子级 - 跨度传播到 div 上的处理程序。要访问处理程序的元素,请使用event.currentTargetVs event.target,它是触发事件的元素。


查看完整回答
反对 回复 2021-12-23
  • 3 回答
  • 0 关注
  • 243 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号