前端全屏光标闪烁异常排查清单
// 检测当前获取焦点的元素
const activeEl = document.activeElement;
console.log('当前聚焦元素:', activeEl);
// 定义需要显示光标的合法元素类型
const validInputTags = ['INPUT', 'TEXTAREA', 'SELECT'];
const isContentEditable = activeEl.isContentEditable;
const isValid = validInputTags.includes(activeEl.tagName) || isContentEditable;
// 若为异常聚焦元素,自动取消焦点
if (!isValid) {
console.warn('检测到异常聚焦的非输入元素,已取消焦点');
activeEl.blur();
} else {
console.log('当前聚焦元素为合法输入类元素,无需处理');
}
// 可选:监听全局聚焦事件,实时监控异常聚焦
document.addEventListener('focus', function(e) {
const target = e.target;
const targetIsValid = validInputTags.includes(target.tagName) || target.isContentEditable;
if (!targetIsValid) {
console.warn('捕获到异常聚焦元素:', target);
}
}, true);
/**
* 页面异常聚焦检测与修复脚本
* 自动检测非输入类元素的异常聚焦,可开启实时监听
*/
(function() {
// 配置项:是否开启实时聚焦监听
const CONFIG = {
enableRealTimeMonitor: true
};
// 合法的可聚焦输入类元素标签
const VALID_INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT'];
/**
* 检测单个元素是否为合法聚焦元素
* @param {HTMLElement} el 待检测元素
* @returns {boolean} 是否合法
*/
function isLegalFocusElement(el) {
return VALID_INPUT_TAGS.includes(el.tagName) || el.isContentEditable;
}
/**
* 检测并修复当前聚焦的异常元素
*/
function checkAndFixActiveElement() {
const activeEl = document.activeElement;
if (!isLegalFocusElement(activeEl)) {
console.warn('[聚焦检测] 发现异常聚焦元素:', activeEl);
activeEl.blur();
}
}
// 页面加载完成后执行一次检测
if (document.readyState === 'complete') {
checkAndFixActiveElement();
} else {
window.addEventListener('load', checkAndFixActiveElement);
}
// 开启实时监听(可选)
if (CONFIG.enableRealTimeMonitor) {
document.addEventListener('focus', function(e) {
if (!isLegalFocusElement(e.target)) {
console.warn('[实时监听] 捕获异常聚焦元素:', e.target);
}
}, true);
}
})();
vue项目:
<template>
<!-- 无 UI 渲染,仅作逻辑执行 -->
</template>
<script>
export default {
name: 'FocusDetector',
mounted() {
// 页面挂载后立即执行一次检测
this.checkAndFixActiveElement();
// 开启实时监听
this.enableRealTimeMonitor();
},
beforeUnmount() {
// 组件卸载时移除监听,防止内存泄漏
document.removeEventListener('focus', this.handleFocus, true);
},
methods: {
isLegalFocusElement(el) {
const validTags = ['INPUT', 'TEXTAREA', 'SELECT'];
return validTags.includes(el.tagName) || el.isContentEditable;
},
checkAndFixActiveElement() {
const activeEl = document.activeElement;
if (!this.isLegalFocusElement(activeEl)) {
console.warn('[Vue 聚焦检测] 发现异常元素:', activeEl);
activeEl.blur();
}
},
enableRealTimeMonitor() {
this.handleFocus = (e) => {
if (!this.isLegalFocusElement(e.target)) {
console.warn('[Vue 实时监听] 捕获异常聚焦:', e.target);
}
};
document.addEventListener('focus', this.handleFocus, true);
}
}
};
</script>
<template>
<div id="app">
<FocusDetector />
<!-- 其他业务组件 -->
</div>
</template>
<script>
import FocusDetector from './components/FocusDetector.vue';
export default { components: { FocusDetector } };
</script>
posted on 2026-01-16 21:36 fox_charon 阅读(0) 评论(0) 收藏 举报
浙公网安备 33010602011771号