Better Scroll 滚动后无法触发 click 事件怎么办?
我用 Better Scroll 做了一个横向滚动的导航栏,但点击里面的按钮没反应,click 事件完全不触发。查了文档说是因为 BS 阻止了原生点击,但我已经加了 click: true 配置,还是不行。
试过用 @click.native(Vue 项目),也试过监听 bs.on('click', ...),但要么没效果,要么拿到的不是我想要的元素。是不是哪里配置错了?
const bs = new BScroll('.nav-wrapper', {
scrollX: true,
scrollY: false,
click: true,
tap: true
})
// 事件绑定在子元素上
document.querySelector('.nav-item').addEventListener('click', () => {
console.log('clicked!')
})
你配置
click: true其实没毛病,但问题在于 BS 拦截了原生 click事件后,所谓的"click" 其实是 BS 自己模拟的,跟原生的 click 事件完全两码事。你在子元素上直接绑原生addEventListener是没用的,因为事件根本没传到那儿。正确的做法是用 BS 提供的事件系统:
两种解决思路:
第一种,用 BScroll 实例来监听 click。它会返回被点击的原始事件对象:
第二种,用事件委托,在外层容器直接监听原生 click(适用于较新版本的 Better Scroll):
另外提醒一下,Better Scroll 2.x 版本对 click 的处理有些变化。如果你用的是 2.x,可以检查一下是否需要额外配置
probeType: 3才能保证事件正常触发。还有一个坑是如果子元素是动态渲染的,记得在nextTick之后再去初始化 BScroll,否则可能会出现元素获取不到的情况。