当前位置: 首页 > news >正文

判断元素是否获取焦点

在 JavaScript/React 中判断一个特定 class 的元素是否处于焦点状态,可以通过以下几种方式实现:

原生 JavaScript 方法

// 获取第一个具有 overviewUndoBtn 类的元素
const element = document.querySelector('.overviewUndoBtn');// 检查是否获得焦点
if (element && document.activeElement === element) {console.log('overviewUndoBtn 元素当前获得焦点');
} else {console.log('overviewUndoBtn 元素未获得焦点');
}

React 方法(使用 ref)

如果你在 React 组件中需要检查:

import { useRef, useEffect } from 'react';function MyComponent() {const undoBtnRef = useRef(null);useEffect(() => {const checkFocus = () => {if (document.activeElement === undoBtnRef.current) {console.log('按钮当前获得焦点');// 执行相关操作}};// 可以添加事件监听来实时检测const btn = undoBtnRef.current;btn?.addEventListener('focus', checkFocus);btn?.addEventListener('blur', checkFocus);return () => {btn?.removeEventListener('focus', checkFocus);btn?.removeEventListener('blur', checkFocus);};}, []);return (<button className="overviewUndoBtn"ref={undoBtnRef}>撤销按钮</button>);
}

更完整的 React 钩子实现

可以创建一个自定义钩子来复用这个逻辑:

import { useRef, useState, useEffect } from 'react';function useFocusStatus(className) {const [hasFocus, setHasFocus] = useState(false);const elementRef = useRef(null);useEffect(() => {const element = elementRef.current || document.querySelector(`.${className}`);if (!element) return;const handleFocus = () => setHasFocus(true);const handleBlur = () => setHasFocus(false);element.addEventListener('focus', handleFocus);element.addEventListener('blur', handleBlur);// 初始检查if (document.activeElement === element) {setHasFocus(true);}return () => {element.removeEventListener('focus', handleFocus);element.removeEventListener('blur', handleBlur);};}, [className]);return { hasFocus, elementRef };
}// 使用示例
function MyComponent() {const { hasFocus, elementRef } = useFocusStatus('overviewUndoBtn');return (<div><button className="overviewUndoBtn" ref={elementRef}>撤销按钮</button><p>按钮焦点状态: {hasFocus ? '已获取' : '未获取'}</p></div>);
}

注意事项

  1. 多个元素:如果有多个元素都有 overviewUndoBtn 类,querySelector 只会返回第一个,如果需要检查所有,使用 querySelectorAll 并遍历

  2. 动态元素:如果元素是动态加载的,可能需要使用 MutationObserver 来检测 DOM 变化

  3. React 18 Strict Mode:在开发模式下,useEffect 可能会执行两次,这是正常现象

  4. 无障碍考虑:焦点状态对于键盘用户很重要,确保焦点样式可见

  5. TypeScript 类型:如果需要类型安全,可以添加适当的类型注解

// 为自定义钩子添加类型
function useFocusStatus(className: string): {hasFocus: boolean;elementRef: React.RefObject<HTMLElement>;
} {// ...实现同上
}

文章转载自:
http://araneid.kjawz.cn
http://carmarthenshire.kjawz.cn
http://armiger.kjawz.cn
http://barrel.kjawz.cn
http://bouzoukia.kjawz.cn
http://artifact.kjawz.cn
http://amygdalotomy.kjawz.cn
http://catalo.kjawz.cn
http://beginning.kjawz.cn
http://ambiquity.kjawz.cn
http://alexandrine.kjawz.cn
http://bughunter.kjawz.cn
http://autoalarm.kjawz.cn
http://antiar.kjawz.cn
http://agroindustry.kjawz.cn
http://afterbeat.kjawz.cn
http://boneless.kjawz.cn
http://boddhisattva.kjawz.cn
http://antevert.kjawz.cn
http://antiaircraft.kjawz.cn
http://baddy.kjawz.cn
http://beguine.kjawz.cn
http://bakery.kjawz.cn
http://balalaika.kjawz.cn
http://andromedotoxin.kjawz.cn
http://apocalypse.kjawz.cn
http://bluesman.kjawz.cn
http://anisole.kjawz.cn
http://cenobian.kjawz.cn
http://batuque.kjawz.cn
http://www.dtcms.com/a/215702.html

相关文章:

  • 英码科技携带 “无感知AI数字课堂”解决方案,亮相第22届广东教育装备展
  • 哈希算法:原理、应用、安全演进与推荐
  • 计算机网络学习20250527
  • 科技趋势分析系统(BBC)技术全解
  • 【数据结构】树形结构--二叉树
  • 【数据结构】 时间复杂度
  • 安卓学习笔记-声明式UI
  • 如何通过ETL对WebService进行调用
  • 《算法和数据结构》算法篇
  • 数据结构-散列表查找(哈希表)
  • qt之开发大恒usb3.0相机二
  • (1)课堂 1--5,这五节主要讲解 mysql 的概念,定义,下载安装与卸载
  • div或button一些好看实用的 CSS 样式示例
  • xcode手动安装iOS Simulator Runtime
  • 深入理解设计模式之状态模式
  • Keepalived 配置 VIP 的核心步骤
  • Qwen3与DeepSeek R1的性能对比
  • 为什么单张表索引数量建议控制在 6 个以内
  • PHP生成pdf方法
  • VR 赋能病毒分离鉴定:开启微观探索新视界
  • 基于cornerstone3D的dicom影像浏览器 第二十四章 显示方位、坐标系、vr轮廓线
  • Spark实时流数据处理实例(SparkStreaming通话记录消息处理)
  • FortiAI继续扩展Security Fabric 平台,打造智能化威胁防御体系
  • Mysql常用知识3:Kafka和数据库优化
  • 【HTML-13】HTML表格合并技术详解:打造专业数据展示
  • 高考加油(Python+HTML)
  • 物流项目第八期(线路规划之Neo4j的应用)
  • 在 Vue 2中使用 dhtmlxGantt 7.1.13组件,并解决使用时遇到的问题汇总.“dhtmlx-gantt“: “^7.1.13“,
  • 前端八股之HTML
  • Qt不同布局添加不同控件