Использование события колеса для вызова функции, которая выбирает новые переменные в массиве

Я добавил прослушиватель событий колеса в элемент HTML. В моем массиве 4 переменные. Теперь моя цель состоит в том, чтобы всякий раз, когда пользователь вращает колесико мыши/тачпад на объекте, к которому добавляется прослушиватель событий, должна выбираться следующая переменная.

Например, мой массив выглядит так [яблоко, апельсин, папайя, гуава]. Я хочу создать что-то, что будет выбирать яблоко при движении колеса, затем апельсин при следующем движении колеса, затем папайю при следующем движении колеса и так далее.

И та же работа в обратном направлении (от гуавы к папайе, чтобы настроить каждый раз, когда пользователь вращает колесо мыши или прокручивает тачпад)

Проблема, с которой я сталкиваюсь, заключается в этих двух:

  1. колесо мыши срабатывает слишком много раз и вызывает функцию (проклятие) слишком много раз. Даже если я напишу функцию для перебора массива в указанном мной порядке. Функция, вызываемая так много раз, рандомизирует вещи.

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

    var controller = document.querySelector(".main");
    var apple = document.querySelector(".box");
    var orange = document.querySelector(".box1");
    var papaya = document.querySelector(".box2");
    var guava = document.querySelector(".box3");
    var boxes = [apple,orange,papaya,guava];
    
    controller.addEventListener('wheel', damnIt);
    
    function damnIt(){
        console.info ("hey");
        //my function for array selection goes here
    }
    

Возможно, вам нужна функция debounce (например, lodash debounce) или аккумулятор для выполнения действия после N событий.

Vladislav Sevostyanov 03.07.2019 15:17

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

Bon Leofen 03.07.2019 15:22

Может проблема с мышкой? Или, может быть, прослушиватель событий добавлялся много раз? Можете ли вы попытаться изменить событие на «щелчок» и показать результаты?

Vladislav Sevostyanov 03.07.2019 15:27

Итак, если я изменю прослушиватель событий на щелчок, он запустит функцию (damnIt) только один раз. Я думаю, что это больше связано с природой слушателя колеса, который продолжает работать до тех пор, пока событие полностью не остановится. Проблема больше связана с сенсорной панелью ноутбука. Если я использую два пальца на тачпаде и прокручиваю вверх для жеста прокрутки, функция fuckingIt срабатывает слишком много раз, заливая мою консоль «привет»

Bon Leofen 03.07.2019 15:31

Возможно, вам нужно заменить событие «колесо» на событие «колесо мыши», а затем добавить событие «touchmove», которое вызовет событие «колесо мыши». Образец: css-tricks.com/forums/topic/triggering-a-wheel-event-on-mobi‌​le/… См. также: stackoverflow.com/questions/50688820/…

Vladislav Sevostyanov 03.07.2019 15:42

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

Bon Leofen 03.07.2019 15:46

Кажется, это работает лучше, чем debounce. lodash.com/docs/4.17.11#дроссель

Vladislav Sevostyanov 03.07.2019 16:01
Поведение ключевого слова "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) для оценки ваших знаний,...
2
7
680
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для меня "колесо"-событие работает нормально. Может у вас есть другие слушатели колес?

document.addEventListener('wheel', function() {
  console.info('Hi');
}.bind(this));

Извините, но функция по-прежнему срабатывает слишком много раз. К этому времени я не уверен, использую ли я правильный прослушиватель событий или нет. Итак, моя цель состоит в том, чтобы пользователь использовал два пальца на сенсорной панели своего ноутбука или колесико мыши, чтобы имитировать движение прокрутки. Но вместо прокрутки на экране отображается новый элемент. Эти элементы хранятся в массиве с соответствующим свойством CSS. Надеюсь, я смог более ясно изложить свою мысль. Извините, если я все еще не ясно здесь.

Bon Leofen 03.07.2019 15:42

Вы должны использовать дросселирование. Об этом много статей в сети. Например, https://codeburst.io/throttling-and-debouncing-in-javascript-b01cad5c8edf

Спасибо, я думаю, что это лучшее решение для моей проблемы

Bon Leofen 03.07.2019 15:48
Ответ принят как подходящий

Рысью (вызов не чаще, чем раз в 150 мс):

var controller = document.querySelector(".main");
var apple = document.querySelector(".box");
var orange = document.querySelector(".box1");
var papaya = document.querySelector(".box2");
var guava = document.querySelector(".box3");
var boxes = [apple,orange,papaya,guava];

controller.addEventListener('wheel', throttle(damnIt, 150));

function damnIt() {
  console.info ("hey");

    //my function for array selection goes here
}

function throttle(cb, timeout) {
  // You can rewrite this function by replacing the time limit with the
  // scroll pitch. I think that would be the best solution.
  // let delta = e.deltaY || e.detail || e.wheelDelta;
  // ... sum delta and call callback by the number of steps: accumulator/step

  let lastCall = 0;

  return function() {
    if (new Date() - lastCall > timeout) {
      lastCall = new Date();

      cb();
    }
  }
}

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