方法一:IOS 允许滚动会无效

  1. function scrControl (t) {
  2. if (t === 0) { // 禁止滚动
  3. document.body.addEventListener('touchmove', function (e) {
  4. e.preventDefault()
  5. }, { passive: false }) // passive 参数不能省略,用来兼容 IOS 和 Android
  6. } else if (t === 1) { // 允许滚动
  7. document.body.addEventListener('touchmove', function (e) {
  8. e.returnValue = true
  9. }, { passive: false })
  10. }
  11. }

passive,设置该属性的目的主要是为了在阻止事件默认行为导致的卡顿。等待监听器的执行是耗时的,有些甚至耗时很明显,这样就会导致页面卡顿。即便监听器是个空函数,也会产生一定的卡顿,毕竟空函数的执行也会耗时。加上 { passive: false } 能防止页面卡顿。
可以通过传递 passive 为 true 来明确告诉浏览器,事件处理程序不会调用 preventDefault 来阻止默认滑动行为。
如果设置了 passive 为 true,同时又阻止默认行为,阻止是不生效的。

  1. document.addEventListener('touchmove', function (event) {
  2. event.preventDefault() // 不产生作用
  3. }, { passive: true })

方法二:兼容 IOS

  1. function bodyScroll (event) {
  2. event.preventDefault()
  3. }
  4. function scrControl (t) {
  5. if (t === 0) { // 禁止滚动
  6. document.body.addEventListener('touchmove', this.bodyScroll, { passive: false })
  7. } else if (t === 1) { // 开启滚动
  8. document.body.removeEventListener('touchmove', this.bodyScroll, { passive: false })
  9. }
  10. }