touchstart 事件在 iOS 上为啥不生效?
我在做一个移动端的滑动组件,用了 touchstart 监听开始触摸,但在 iPhone 上完全没反应,安卓倒是正常的。
试过加 passive: false,也试过给元素加 touch-action: none,还是不行。是不是 iOS 有啥特殊限制?
相关代码是这样的:
const el = document.getElementById('slider');
el.addEventListener('touchstart', (e) => {
console.log('touch started');
e.preventDefault();
}, { passive: false });
最可能的原因是你的目标元素不是"可交互元素"。iOS 默认情况下,普通的 div、span 这类元素是不会触发 touchstart 的,只有 button、a、input 这类原生可交互元素才行。
解决办法很简单,给这个元素加个 CSS 属性让它变成可交互:
或者用 JS 直接设置:
iOS 的逻辑是这样的:它需要明确知道这个元素是"可以点的",才会把触摸事件传递给它。安卓没这个限制,所以你那边安卓正常、iOS 挂了。
另外提一嘴,
touch-action: none这个属性慎用,它会完全禁用浏览器默认的触摸行为,包括滚动和缩放。如果你这个滑动组件是在页面滚动区域里,可能会把整个页面的滚动都搞没。试试加
cursor: pointer,应该就能解决了。