Как определить, было ли событие прокрутки создано программно? - PullRequest
3 голосов
/ 12 февраля 2009

Я бы хотел, чтобы обработчик срабатывал всякий раз, когда пользователь выполняет прокрутку, но я не хочу, чтобы это происходило, когда браузер выполняет прокрутку от имени пользователя. Например, документ ниже прокручивается как часть загрузки. Это запускает мой обработчик прокрутки, но я не хочу этого. Даже если я удаляю загрузку, остается проблема: если пользователь прокручивает, а затем перезагружает страницу, обработчик срабатывает при перезагрузке. Опять же, я этого не хочу.

Может ли обработчик определить, кто его вызвал?

<html>
 <body onscroll="alert('scroll detected')"
       onload="window.scrollBy(0, document.height)">
  aaa<br/>bbb<br/>ccc<br/>ddd<br/>eee<br/>fff<br/>ggg<br/>hhh<br/>iii<br/>
  jjj<br/>kkk<br/>lll<br/>mmm<br/>nnn<br/>ooo<br/>ppp<br/>qqq<br/>rrr<br/>
  sss<br/>ttt<br/>uuu<br/>vvv<br/>www<br/>xxx<br/>yyy<br/>zzz
 </body>
</html>

Ответы [ 4 ]

3 голосов
/ 13 февраля 2009

Как насчет установки (логического) флага всякий раз, когда вы перемещаете экран программным способом, и отмены сброса, когда перемещение закончено? Тогда ваш слушатель прокрутки сначала проверит этот флаг и на основании этого выполнит свои действия?

1 голос
/ 13 февраля 2009

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

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

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

  • в результате прокрутки документа
  • когда человек выполняет прокрутку
  • когда браузер выполняет прокрутку

Когда человек прокручивает документ, он может:

  • нажмите клавишу (стрелка вниз, стрелка вверх, страница вниз, страница вверх, ctrl-end, ctrl-home)
  • переместить указатель на полосу прокрутки, немного щелкнуть, отойти от полосы прокрутки

Следующий шаблон событий указывает на прокрутку человека:

  • нажата соответствующая прокрутке клавиша ИЛИ мышь перемещается с холста браузера (на полосу прокрутки)
  • документ прокручивается

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

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

0 голосов
/ 13 февраля 2009

Короче говоря: вы не можете

Хотя сделать что-то подобное с помощью библиотеки javascript, такой как Prototype, было бы очень легко, используя пользовательские события:

<script language="javascript">
    document.observe('user:scrolling', function() { alert('yay!'); });
</script>
...
<body onscroll="document.fire('user:scrolling')">
0 голосов
/ 12 февраля 2009

Как насчет добавления события onscroll во время события document.onReady вместо встроенного в команде body? Я думаю, что это должно позволить браузеру прокрутить до позиции, прежде чем вы добавите событие onScroll.

Другой вариант - добавить setTimeout(), чтобы вызвать функцию для добавления события onscroll через несколько сотен миллисекунд после полной визуализации документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...