Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 11.02.2016, 13:24
Интересующийся
Отправить личное сообщение для webrepa Посмотреть профиль Найти все сообщения от webrepa
 
Регистрация: 11.02.2016
Сообщений: 11

В каком направлении и сколько раз был прокручен скролл
Всем привет, собственно сабж. Нужно определить сколько раз и в каком направлении был прокручен скролл (не позиция скролла на странице, а именно сколько раз был прокручен).

Есть классический скрипт:

// Функция для добавления обработчика событий
function addHandler(object, event, handler, useCapture) {
    if (object.addEventListener) {
        object.addEventListener(event, handler, useCapture ? useCapture : false);
    } else if (object.attachEvent) {
        object.attachEvent('on' + event, handler);
    } else alert("Add handler is not supported");
}
// Добавляем обработчики
/* Gecko */
addHandler(window, 'DOMMouseScroll', wheel);
/* Opera */
addHandler(window, 'mousewheel', wheel);
/* IE */
addHandler(document, 'mousewheel', wheel);
// Обработчик события
function wheel(event) {
    var delta; // Направление скролла
    // -1 - скролл вниз
    // 1  - скролл вверх
    event = event || window.event;
    // Opera и IE работают со свойством wheelDelta
    if (event.wheelDelta) {
        delta = event.wheelDelta / 120;
        // В Опере значение wheelDelta такое же, но с противоположным знаком
        if (window.opera) delta = -delta;
    // В реализации Gecko получим свойство detail
    } else if (event.detail) {
        delta = -event.detail / 3;
    }
    // Запрещаем обработку события браузером по умолчанию
    if (event.preventDefault)  event.preventDefault();
    event.returnValue = false;	
   alert(delta);
   return delta;
	
}


Но, тут при каждом движении скролла переменные стираются и переписываются заново. Т.е. можно определить положение, но сколько раз не выходит. Тут идет delta = -1 если вниз и +1 если вверх. Как бы сделать так, чтобы сначала было -1, затем, -2, -3 и т.д. ну или +1, +2, 3 и т.д.

Может быть я конечно и не в том направлении иду. Вообще нужно, чтобы при скроллинге 1 элемент (на всю высоту экрана) заменялся другим и т.д., а сам скролл на сайте был бы отключен.

Спасибо.
Ответить с цитированием
  #2 (permalink)  
Старый 11.02.2016, 13:29
Аватар для DynkanMaclaud
Профессор
Отправить личное сообщение для DynkanMaclaud Посмотреть профиль Найти все сообщения от DynkanMaclaud
 
Регистрация: 08.08.2014
Сообщений: 261

webrepa,
почему вы не поставите счетчик на событие mousewheel??? То есть если дельта больше 120 то в переменная i +=1; else q+=1; соответственно i,q - глобальные переменные для этой функции по умолчанию равные 0

Последний раз редактировалось DynkanMaclaud, 11.02.2016 в 13:34.
Ответить с цитированием
  #3 (permalink)  
Старый 11.02.2016, 13:33
Интересующийся
Отправить личное сообщение для webrepa Посмотреть профиль Найти все сообщения от webrepa
 
Регистрация: 11.02.2016
Сообщений: 11

Буду рад если подскажите как
Ответить с цитированием
  #4 (permalink)  
Старый 11.02.2016, 13:37
Интересующийся
Отправить личное сообщение для webrepa Посмотреть профиль Найти все сообщения от webrepa
 
Регистрация: 11.02.2016
Сообщений: 11

Сообщение от DynkanMaclaud Посмотреть сообщение
webrepa,
почему вы не поставите счетчик на событие mousewheel??? То есть если дельта больше 120 то в переменная i +=1; else q+=1; соответственно i,q - глобальные переменные для этой функции по умолчанию равные 0
Не совсем понимаю как это сделать - можете показать? Спасибо.
Ответить с цитированием
  #5 (permalink)  
Старый 11.02.2016, 13:43
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

webrepa,
Сообщение от webrepa
Как бы сделать так, чтобы сначала было -1, затем, -2, -3 и т.д. ну или +1, +2, 3 и т.д.
Пропишите глобальную переменную, напр.
var countDelta;

а в конце функции
countDelta += delta;
Ответить с цитированием
  #6 (permalink)  
Старый 11.02.2016, 13:44
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,120

webrepa,
строка 16 var q = 0;
строка 34 q += delta;
Ответить с цитированием
  #7 (permalink)  
Старый 11.02.2016, 14:13
Интересующийся
Отправить личное сообщение для webrepa Посмотреть профиль Найти все сообщения от webrepa
 
Регистрация: 11.02.2016
Сообщений: 11

И всего-то. Спасибо всем огромное. Не пойму почему у меня так не получалось. Раз 100 делал. Видимо натупил в области видимости и объявлял переменные внутри функций. Спасибо еще раз.
Ответить с цитированием
  #8 (permalink)  
Старый 11.02.2016, 15:28
Интересующийся
Отправить личное сообщение для webrepa Посмотреть профиль Найти все сообщения от webrepa
 
Регистрация: 11.02.2016
Сообщений: 11

Возникла новая ситуация. Т.к. я использую эту функцию, чтобы мотать "блоки", то выходит, что если пользователь со всей дури мотанул скролл, то значение увеличивается\уменьшается не на 1. Как бы этого избежать? Буду признателен ответу
Ответить с цитированием
  #9 (permalink)  
Старый 11.02.2016, 15:33
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,120

webrepa,
копать debounce
Ответить с цитированием
  #10 (permalink)  
Старый 11.02.2016, 17:36
Интересующийся
Отправить личное сообщение для webrepa Посмотреть профиль Найти все сообщения от webrepa
 
Регистрация: 11.02.2016
Сообщений: 11

Что-то так ничего и не выходит. Сейчас скрипт такой:

<script>
	// Функция для добавления обработчика событий
function addHandler(object, event, handler, useCapture) {
    if (object.addEventListener) {
        object.addEventListener(event, handler, useCapture ? useCapture : false);
    } else if (object.attachEvent) {
        object.attachEvent('on' + event, handler);
    } else alert("Add handler is not supported");
}
// Добавляем обработчики
/* Gecko */
addHandler(window, 'DOMMouseScroll', wheel);
/* Opera */
addHandler(window, 'mousewheel', wheel);
/* IE */
addHandler(document, 'mousewheel', wheel);
// Обработчик события
var q = 0;
function wheel(event) {
    var delta; // Направление скролла
    // -1 - скролл вниз
    // 1  - скролл вверх
    event = event || window.event;
    // Opera и IE работают со свойством wheelDelta
    if (event.wheelDelta) {
        delta = event.wheelDelta / 120;
        // В Опере значение wheelDelta такое же, но с противоположным знаком
        if (window.opera) delta = -delta;
    // В реализации Gecko получим свойство detail
    } else if (event.detail) {
        delta = -event.detail / 3;
    }
	// Запрещаем обработку события браузером по умолчанию
    if (event.preventDefault)  event.preventDefault();
    event.returnValue = false;	
	q += delta;
	document.getElementById('div1').innerHTML = q;		
	return delta;
	
}
	</script>

в div1 вывожу результат, чтобы проверять, т.к. через alert стопорит после первого изменения.
Не пойму как debounce сюда впихнуть.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определить сколько раз страница прокручена до конца. dolte Events/DOM/Window 1 19.09.2013 22:21