Как отменить следующие вызовы событий?

У меня есть событие "pointerdown", но я хочу, чтобы оно отменяло вызов события, когда в одном из обратных вызовов выполняется определенное условие. Таким образом, все следующие обратные вызовы не должны вызываться.

Я пробовал evt.preventDefault(); но это не работает, я также пробовал evt.stopPropagation(); но это не работает.

const pointer = getMousePos(evt);
if (inBounds(pointer)) {
    evt.preventDefault();
    evt.stopPropagation();
}

Функция inBounds возвращает true, как и ожидалось, но следующие обратные вызовы события все еще вызываются. Это событие добавляется первым, перед другими событиями, которые я хочу отменить, но это не так.

stopPropagation предназначен для предотвращения передачи текущего события внешним элементам в DOM. preventDefault() предотвращает нормальное действие события (например, нажатие кнопки отправки отправляет форму). Ни один из них не имеет никакого отношения к более поздним событиям.
Barmar 20.06.2019 04:45

Есть ли какое-либо событие, которое позволяет мне прекратить вызывать более поздние события? Или мне придется кодировать это самому?

Ripper 20.06.2019 04:46

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

Barmar 20.06.2019 04:47

Например, если я добавлю функцию A в событие "pointerdown". И затем я добавляю функцию B в событие "pointerdown". Я хочу вызвать что-то в функции A, чтобы она не вызывала все следующие функции, которые включают функцию B.

Ripper 20.06.2019 04:49

Попробуйте установить для useCapture (третий параметр) значение true, чтобы посмотреть, поможет ли это.

Pinetree 20.06.2019 04:58

Я сделал. Ничего не изменилось :(

Ripper 20.06.2019 05:00
Поведение ключевого слова "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
6
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

let doBFunction = true;
element.addEventListener("pointerdown", function(evt) {
    const pointer = getMousePos(evt);
    if (inBounds(pointer)) {
        doBFunction = false;
    } else {
        doBFunction = true;
    }
    // rest of code
});
element.addEventListner("pointerdown", function(evt) {
    if (!doBfunction) {
        return;
    }
    // rest of code
});

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

Если ваши слушатели прикреплены к одному и тому же элементу, вам нужно будет использовать stopImmediatePropagation() вместо stopPropagation()

The stopImmediatePropagation() method of the Event interface prevents other listeners of the same event from being called.

If several listeners are attached to the same element for the same event type, they are called in the order in which they were added. If stopImmediatePropagation() is invoked during one such call, no remaining listeners will be called.

https://developer.mozilla.org/en-US/docs/Web/API/Event/stopImmediatePropagation

Вы также можете найти небольшое описание разницы между обоими методами здесь: stopPropagation против stopImmediatePropagation

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

let counter = 0

const button = document.getElementById('TheButton')

button.addEventListener('click', e => {
  counter++
  
  console.info(`first listener: ${counter}`)
  
  if (counter % 2 === 0) e.stopImmediatePropagation()
})

button.addEventListener('click', e => {
  console.info(`second listener: ${counter}`)
})
<button id = "TheButton">
OK
</button>

Это именно то, что мне было нужно! Спасибо!

Ripper 20.06.2019 08:25

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