You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS实现父元素及后代元素触发焦点时切换至textarea

点击元素后将焦点设置到文本框的解决方案

问题背景

现有HTML结构:

<div id="parent">
  <div class="line">
    <span class="word">This </span>
    <span class="word">is  </span>
    <span class="word">a  </span>
    <span class="word">line. </span>
  </div>
  <div class="line">
    <span class="word">This </span>
    <span class="word">is  </span>
    <span class="word">another  </span>
    <span class="word">line. </span>
  </div>
</div>
<textarea id="textarea"></textarea>

其中parent的内容会动态更新,需求是点击parent或其任意后代元素时,自动将焦点设置到textarea。但使用focus事件绑定的代码无效:

let parent = document.getElementById("parent");
let textarea = document.getElementById("textarea");
parent.addEventListener("focus", () => {
     textarea.focus();
})

原因分析

div、span这类块级/行内元素默认不支持焦点获取,因此focus事件无法被触发。

解决方法

方案1:监听click事件(兼容鼠标点击场景)

利用事件冒泡机制,直接给parent绑定click事件,不管内部内容如何动态变化,点击后代元素都会触发该事件:

let parent = document.getElementById("parent");
let textarea = document.getElementById("textarea");

parent.addEventListener("click", () => {
    textarea.focus();
});

方案2:同时支持鼠标点击和键盘聚焦(可选)

如果需要支持通过键盘Tab键聚焦到parent时也触发焦点切换,可以给parent添加tabindex="-1"属性(使其可聚焦但不纳入Tab键导航顺序),同时监听click和focus事件:
修改后的HTML:

<div id="parent" tabindex="-1">
  <!-- 原有内容 -->
</div>

对应的JS代码:

let parent = document.getElementById("parent");
let textarea = document.getElementById("textarea");

parent.addEventListener("click", () => textarea.focus());
parent.addEventListener("focus", () => textarea.focus());

内容的提问来源于stack exchange,提问作者Fifi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 04:37:23