Как сделать, чтобы событие вызывало скрипт один раз?

Рейтинг: 1Ответов: 1Опубликовано: 31.10.2014

Привет всем!

Есть функция jquery scroll() - волшебная вещь! Можно писать обработчики и все, что хочешь, анимашки и т. д.
Но есть одна проблема: когда крутишь колесико, эта функция вызывается несколько раз (до 20-30), и запрос ajax при скролле заставляет подумывать о самоубийстве. )

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

Кто нибудь знает, есть ли у функции scroll() какой-то callback ну или как сделать по простому без плагинов и каких-то премудростей, чтобы событие вызывало скрипт один раз. (SetTimeout не помог, все равно работает, даже хуже, то есть интервалами.)

Обновление

func Req () { /.. ajax./}
$('sometag').scroll( function () {
    if(something == anything){
      var go = setTimeout(Req,10);
      clearTimeout(go);
    }
})

Видимо, плохо изучал некоторые вещи, а что значит $.data и собачка, можете обьяснить?

Ответы

▲ 1

А покажите, как вы использовали setTimeout?

Правильный вариант будет примерно такой:

$(window).scroll ->
  clearTimeout $.data(@, 'scrollStopTimer')
  $.data @, 'scrollStopTimer', setTimeout ->
    $.ajax "/some/url/" # и ваще делаем что надо
  , 250

Обновление

Вот здесь про data написано: http://api.jquery.com/jquery.data/

А про собачку... Уж простите мне мой кофескрипт, слегка упрощаю себе жизнь. :) Собачка - это this. Вообще вот здесь можно переводить в чистый js.

Обновление 2

Ну, нет, не так. Это произвольные данные, привязанные к элементу DOM. Точнее, это функция, позволяющая манипулировать такими данными. Очень здорово пересекается с data-атрибутами html5. Значения дата-атрибутов этой функцией читаются тоже. Здесь мы привязываем свои данные к объекту window.

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