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

带click事件的下拉菜单在触屏设备上需双击触发问题求助

解决触屏设备下拉菜单需双击展开的问题

问题根源

触屏设备里,浏览器会给click事件加300ms延迟来区分点击和双击;如果你的菜单项是<a>这类自带交互的元素,第一次触屏操作还可能被浏览器识别为「模拟hover」,第二次才会触发真正的click事件,最终导致双击才能展开菜单。

修复方案

方案1:同时绑定touchstart事件

在原有click事件基础上,添加touchstart监听,优先响应触屏操作,同时修复原代码的变量污染问题:

var MenuItem_WithChild = document.querySelectorAll("#menu .menu-item-has-children");

// 把函数提到循环外,避免重复创建
function subMenuOpen(e) {
    // 阻止默认行为和事件冒泡,避免浏览器干扰
    e.preventDefault();
    e.stopPropagation();
    
    // 用let声明i,避免闭包变量共享问题
    for (let i = 0; i < MenuItem_WithChild.length; i++) {
        MenuItem_WithChild[i].classList.remove("active");
    }
    this.classList.add("active");
}

for(let i=0; i< MenuItem_WithChild.length; i++){
    MenuItem_WithChild[i].addEventListener("touchstart", subMenuOpen);
    MenuItem_WithChild[i].addEventListener("click", subMenuOpen);
}

方案2:禁用触屏设备的hover模拟

如果菜单有hover样式,浏览器会把第一次触屏点击当成hover触发,可通过CSS媒体查询禁用触屏下的hover效果:

@media (hover: none) and (pointer: coarse) {
    #menu .menu-item-has-children:hover {
        pointer-events: none;
    }
    #menu .menu-item-has-children.active {
        pointer-events: auto;
    }
}

方案3:移除元素默认跳转行为(若为<a>标签)

如果菜单项是<a>标签且不需要跳转功能,直接在事件处理中阻止默认行为:

// 在subMenuOpen函数开头添加
e.preventDefault();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 22:05:01