2010-11-27 2 views
14

Я пытаюсь найти способ сделать это. У меня есть список ящиков, каждый около 150px высокий. Я использую javascript (и jquery) и хочу, чтобы после того, как пользователь прокручивает страницу вниз, страница будет автоматически прокручиваться, чтобы поля соответствовали остальной части страницы (то есть, если пользователь прокручивает и y позиция страницы не делится на 150, она будет прокручиваться до ближайшей точки).Javascript: выполните действие после того, как пользователь выполнит прокрутку

Теперь, я знаю, что могу активировать событие, используя событие jquery .scroll(), и я могу заставить его перейти к определенной точке, используя .scrollTop(). Но каждый пиксель, который пользователь перемещает полосой прокрутки, активирует всю функцию. Так есть способ отсрочить функцию от стрельбы до тех пор, пока пользователь не прокрутит, и если они начнут прокручиваться снова, функция остановится?

ответ

19

Как вы уже используете JQuery, взгляните на Ben Alman's doTimeout plugin, который уже обрабатывает debouncing методов (что вы после).

Пример бессовестно украдены с его сайта:

$(window).scroll(function(){ 
    $.doTimeout('scroll', 250, function(){ 
     // do something computationally expensive 
    }); 
}); 
+2

+1 Хороший плагин, и только 1k. Debouncing должен быть включен в jQuery 1.5 :) –

+1

Чувак. Красивая и блестящая. Я не думал, что когда-нибудь смогу полюбить такой плагин. – DavidR

+1

Я надеялся, что кто-то осуществил эту идею и на самом деле добился успеха. Благодаря!! – Matt

6

Убедитесь, что в обработчике событий для события прокрутки отключить setTimeout на 100 или 200 миллисекунд позже. Пусть эта функция setTimeout, установленная внутри обработчика событий прокрутки, делает логику позиционирования, указанную выше. Кроме того, обработчик события прокрутки очистит все тайм-ауты, установленные самим. Таким образом, при последнем запуске события прокрутки функция setTimeout завершится, так как событие прокрутки не очистило его.

6

Код:

var scrollTimeout = null; 
var scrollendDelay = 500; // ms 

$(window).scroll(function() { 
    if (scrollTimeout === null) { 
     scrollbeginHandler(); 
    } else { 
     clearTimeout(scrollTimeout); 
    } 
    scrollTimeout = setTimeout(scrollendHandler, scrollendDelay); 
}); 

function scrollbeginHandler() { 
    // this code executes on "scrollbegin" 
    document.body.style.backgroundColor = "yellow"; 
} 

function scrollendHandler() { 
    // this code executes on "scrollend" 
    document.body.style.backgroundColor = "gray"; 
    scrollTimeout = null; 
} 
-1

Это будет сценарий, где ваниль JavaScript будет полезным.

var yourFunction = function(){ 
    // do something computationally expensive 
} 

$(window).scroll(function(){ 
    yfTime=setTimeout("yourFunction()",250); 
}); 
+1

1) '$ (window)' is not JavaScript, это jQuery и 2), это будет очереди на множество setTimeouts для каждого пикселя, который прокручивает пользователь ... – aug

6

Это в основном так же, как ответ Šime Vidas', но менее Comlex:

var scrollTimeout = null; 
$(window).scroll(function(){ 
    if (scrollTimeout) clearTimeout(scrollTimeout); 
    scrollTimeout = setTimeout(function(){yourFunctionGoesHere()},500); 
}); 

500 является задержка. Должно быть хорошо для мыши.

Смежные вопросы