
由于原生 `
在 Web 开发中,常有需求在用户将鼠标移至下拉选项(
因此,不能依赖
- 利用 event.target.options 获取所有
集合; - 结合 event.target.selectedIndex 获取当前选中项索引;
- ⚠️ 注意:selectedIndex 只反映“已选中项”,而非“悬停项” —— 所以该方案存在本质局限:它无法真正检测未选中的悬停行为,仅能在用户操作下拉菜单过程中,借助浏览器内部的视觉焦点变化(部分浏览器会在展开状态下更新 selectedIndex)进行粗略推断。
更可靠且兼容性更好的替代方案是:放弃原生 ✅ 优势: ❌ 原生 综上,若需精确、稳定、可扩展的选项悬停事件,请优先构建语义化、可访问的自定义下拉控件;仅当项目强约束必须使用原生 +
const CustomSelect = ({ options, value, onChange }) => {
const [isOpen, setIsOpen] = useState(false);
return (
<div className="custom-select" onMouseLeave={() => setIsOpen(false)}>
<div
className="select-trigger"
onClick={() => setIsOpen(!isOpen)}
>
{value || '请选择'}
</div>
{isOpen && (
<ul className="select-options">
{options.map((opt, i) => (
<li
key={i}
className={`option-item ${value === opt.value ? 'active' : ''}`}
onMouseEnter={() => console.log('Hovered:', opt.value)}
onClick={() => {
onChange(opt.value);
setIsOpen(false);
}}
>
{opt.label}
</li>
))}
</ul>
)}
</div>
);
};










