Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Отслеживание изменений value в input (https://javascript.ru/forum/events/30423-otslezhivanie-izmenenijj-value-v-input.html)

kosar 03.08.2012 15:40

Отслеживание изменений value в input
 
Здравствуйте, знаю были уже похожие темы, но ответа не нашел. Необходимо выполнить функцию если значение в поле было изменено и не менялось в течении скажем 5 секунд, если менялось то выждать еще 5 сек, если в течении 5 сек снова изменили, то снова 5 сек выждать и т. д. Как это сделать?

Объясню зачем это нужно, я делаю подбор товара по параметрам (аналог расширенного поиска яндекс-маркета) на ajax и в одном из полей используется ползунок (trackbar). Все бы ничего, но если параметров на товар много, то если двигать ползунок туда сюда быстро - получим огромную нагрузку на БД и зависание. На яндекс маркете как раз организовано описанное выше отслеживание полей рядом с ползунками, думаю в тех же целях (запрос в БД не пройдет, пока пользователь не перестанет баловаться с ползунком).

devote 03.08.2012 15:44

/**
* Функция не дает вызвать функцию больше чем timesPerSecond в секунду
* 
* @param {Function} fn функция которая будет вызываться
* @param {Number} timesPerSecond количество выполнений в секунду
* @return {Function} возвращает ссылку на функцию обертку
*/
function foo( fn, timesPerSecond ) {
    var oldStart = 0;
    return function() {
        var newStart = ( new Date() ).getTime();
        if ( newStart - oldStart < 1000 / ( timesPerSecond || 1 ) ) {
            return;
        }
        oldStart = newStart;
        return fn.apply( this, arguments );
    }
}

// Пример использования
// функция будет вызвана не чаще чем 2 раза в секунду
document.addEventListener( "click", foo(function( e ){
 console.log( "click to: " + e.target.nodeName );
}, 2 ), false );

devote 03.08.2012 15:51

если нужно вызывать функцию раз в 5 секунд, ставь вторым параметром значение 0.2, к примеру:
var handler = foo(function() {
    // some code
}, 0.2 );

handler();
будет вызвана не чаще чем раз в пять секунд.

Deff 03.08.2012 15:53

Соль в том - что интересней исследовать остановку ползунка на время стояния - вот коли он простоял не тронутый - пару секунд - отправляем запрос - каждое движение сбрасывает таймер тестирования "устаканивания" на 0

devote 03.08.2012 15:57

Цитата:

Сообщение от Deff
Соль в том - что интересней исследовать остановку ползунка на время стояния - вот коли он простоял не тронутый - пару секунд - отправляем запрос - каждое движение сбрасывает таймер тестирования "устаканивания" на 0

ну да, я немного не то кинул... каюсь

kosar 03.08.2012 16:01

Цитата:

Сообщение от Deff (Сообщение 194337)
Соль в том - что интересней исследовать остановку ползунка на время стояния - вот коли он простоял не тронутый - пару секунд - отправляем запрос - каждое движение сбрасывает таймер тестирования "устаканивания" на 0

На "JS-TrackBar" есть готовые решения в этом плане? Боюсь сам не смогу исследовать.

Deff 03.08.2012 16:05

kosar,
:write: Тут же Выше мастер отписал - подождите...


Часовой пояс GMT +3, время: 21:14.