Невозможно удалить событие touchmove - Vue watcher

Функция предотвращения прокрутки на мобильных устройствах:

const hideScroll = function(e) {
  e.preventDefault()
}

Добавление слушателя:

document.body.addEventListener('touchmove', hideScroll, { passive: false })

Удаление слушателя:

document.body.removeEventListener('touchmove', hideScroll)

В chrome devtools я ясно вижу, что добавление этого прослушивателя работает, я не могу прокручивать с помощью касания, но когда я запускаю removeEventListener, он не удаляется, я вижу это в chrome dev tools, и я не могу прокручивать с помощью касания. Используя это в наблюдателе Vue:

watch: {
  // hidescroll function is here: const hideScroll = function(e) {}
  chatWindow(newValue) {
    if (newValue) {
      // adding listener
    } else {
      // removing listener
    }
  }
}

Я только что попробовал его с хромом и «эмулятором» мобильного устройства, и он отлично работает. Добавление слушателя предотвращает прокрутку, удаление его снова заставляет прокрутку работать.

Seblor 17.05.2019 09:47

Что такое window в вашем компоненте Vue, и уверены ли вы, что наблюдатель вызывается с ложным значением?

Seblor 17.05.2019 09:50

@Seblor, chatWindow - это data() собственность. Когда я нажимаю на кнопку, она переключается на true или false. Я уже пытался поставить console.info() в обоих состояниях - они успешно стреляют.

Alexander Kim 17.05.2019 09:52

Вы можете добавить больше своего кода Vue? где вы храните свою функцию hideScroll?

fila90 17.05.2019 10:09

@fila90, обновил ответ, hideScroll действительно стреляет. Но не удаляя слушателя.

Alexander Kim 17.05.2019 11:07

@AlexanderKim, но watch - это объект, вы не можете так определить свою функцию? или вы определяете это внутри watch.chatWindow наблюдателя?

fila90 17.05.2019 11:39

@fila90, это объект, верно. Конечно, я могу определить это как метод. Почему ты думаешь, что я не могу?

Alexander Kim 17.05.2019 12:02

ну, вы не можете определить это так const hideScroll = function(e) {}, если это метод :D. вы можете скопировать весь свой компонент в jsfiddle или куда-то еще

fila90 17.05.2019 12:15

Отлично работает в этом кодовая ручка (проверено в Chrome 74 на macOS)

tony19 17.05.2019 12:18

@fila90, лол, действительно, я переместил этот const из watch: {}, и теперь он работает, как задумано :D Я написал об этом в своем ответе в качестве комментария: // hidescroll function is here: const hideScroll = function(e) {}

Alexander Kim 17.05.2019 12:33

@fila90, ответь, я приму.

Alexander Kim 17.05.2019 21:53
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
12
923
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

переместите функцию hideScroll из своего наблюдателя.

прямо сейчас вы создаете новую функцию каждый раз, когда срабатывает наблюдатель. функция выглядит так же, но это не тот экземпляр, который прикреплен к прослушивателю событий, и поэтому вы не можете его удалить.

Другие вопросы по теме