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

JavaScript中touchend事件无法触发的问题求助

解决JavaScript中touchend事件无法触发的问题

看起来你遇到的问题很典型——touchstart能正常触发,但touchend死活没反应,这种情况大概率是浏览器的默认触摸行为在搞鬼!让我一步步帮你排查和解决:

核心原因分析

当你在移动端(或桌面Chrome的触摸模拟模式)触摸元素时,浏览器会自带一些默认的触摸相关行为,比如页面滚动、长按弹出菜单、文本选择等。如果这些默认行为被触发,浏览器可能会中断完整的触摸事件序列,直接跳过touchend事件的执行,甚至会用touchcancel事件来替代它。

在你的代码里,touchstart触发后,浏览器可能立刻启动了默认的触摸行为(比如滚动检测),直接打断了后续的touchend事件流程。

解决方案

1. 在touchstart事件中阻止默认行为

修改你的touchZoom函数,加入event.preventDefault()来阻止浏览器的默认触摸动作,这样就能保证触摸事件序列完整执行(touchstart → touchend):

let touchZoom = (event) =>{
    // 阻止浏览器默认触摸行为,避免中断touchend事件
    event.preventDefault();
    console.log('touch')
    headerVisible = !headerVisible;
    if (!headerVisible){
        header.style.background="green";
    } else {
        header.style.background="white";
    }
}

2. 监听touchcancel事件排查问题

为了确认是不是默认行为导致的事件中断,可以临时添加touchcancel的监听,看看它是否被触发:

activeZoom.addEventListener('touchcancel', () => {
    console.log('touchcancel triggered!');
});

如果控制台输出了这条日志,就完全验证了我们的猜测——浏览器确实取消了触摸事件,这时候上面的preventDefault()就能解决问题。

3. 额外优化:确保元素是可触摸的

虽然不是主要原因,但可以给目标元素添加CSS属性,明确告诉浏览器这是一个可交互的触摸元素:

.active-magic-slide {
    touch-action: none; /* 禁用浏览器的触摸行为优化 */
    cursor: pointer; /* 标识为可点击元素 */
}

touch-action: none会直接禁用该元素上的所有浏览器默认触摸行为,比在JS里阻止默认行为更彻底。

验证修改后的效果

修改完成后,触摸元素时:

  • touchstart触发,header变为绿色
  • 抬起手指时,touchend触发,header变回白色
  • 控制台能看到两次touch日志,说明两个事件都正常执行了

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 23:22:41