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

JavaScript检测触摸设备手指抬起事件解决按钮高亮失效问题

问题原因
  • 你所使用的(any-pointer: none)媒体查询适配性不足,多数纯触摸设备的浏览器无法准确匹配该规则,导致touchend事件未完成绑定,手指抬起时没有触发恢复样式的逻辑
  • 未监听touchcancel事件:触摸过程中如果出现系统中断、手指滑出按钮区域等情况,浏览器会触发touchcancel事件而非touchend,缺少该监听会导致按钮一直保持高亮状态
  • 部分触摸浏览器会在触摸事件结束后模拟鼠标hover行为,和现有逻辑冲突导致样式残留
修复方案

JS代码修复

优化事件绑定逻辑,去掉冗余的媒体查询判断,新增touchcancel事件监听,同时阻止触摸事件的默认行为避免模拟鼠标事件冲突,修改后代码如下:

const searchBtn = document.getElementById("search_button");

if (!this.isTouch) {
  // 桌面端鼠标事件绑定
  searchBtn.addEventListener("mouseover", highlightButton);
  searchBtn.addEventListener("mouseout", restoreButton);
} else {
  // 触摸端事件绑定
  searchBtn.addEventListener("touchstart", (e) => {
    e.preventDefault();
    highlightButton();
  });
  // 同时监听两种触摸结束场景
  searchBtn.addEventListener("touchend", restoreButton);
  searchBtn.addEventListener("touchcancel", restoreButton);
}

更简单的CSS替代方案

该高亮效果可以完全通过CSS实现,不需要JS逻辑,稳定性更高:

/* 适配桌面端悬停场景 */
@media (hover: hover) {
  #search_button:hover {
    /* 替换为你的高亮样式规则 */
    background-color: #eee;
    border-color: #ccc;
  }
}
/* 适配触摸端点击场景 */
@media (hover: none) {
  #search_button:active {
    /* 替换为你的高亮样式规则 */
    background-color: #eee;
    border-color: #ccc;
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:24:02