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
相关产品推荐
相关产品推荐

