2014-02-21 3 views
0

Я реализую текстовое поле с подсказками автоматического предложения, которое принимает значения из базы данных mysql на каждой нажатой клавише. Поскольку у меня есть большой набор значений в базе данных, мои функции требуют времени. к функции выполняется последовательноВыполнение автопредложений при каждой нажатой клавише

Предположим, Я нажал клавишу, которая запускает событие и выполнение func. Затем я нажал клавишу B, которая снова запускает событие, но теперь я хочу, чтобы более ранняя функция была убита до запуска второй функции

Как я могу достичь этого?

При поиске через я нашел, что threading может использоваться для реализации этого. Но все равно я не смог реализовать даже через потоки. Если кто-то знает точную процедуру?

+0

Запрос на базу данных для каждого нажатия клавиши? Хлоп. Не можете ли вы просто сохранить это в памяти? (ps использует [trie] (http://en.wikipedia.org/wiki/Trie) или [дерево оснований] (http://en.wikipedia.org/wiki/Radix_tree) – roippi

+0

Нет, у меня большая база данных и я должен отфильтровать результаты для каждой нажатой клавиши –

ответ

1

Это было использовано как отличный вопрос (на мой взгляд), и Натан Леклер wrote about it on his blog.

Соответствующий отрывок:

, если мы используем window.setTimeout мы можем задержать вызов на 200 миллисекунд. ... Но это не поможет нам в случае, когда пользователь печатает быстро или даже просто обычную скорость. Поэтому нам нужен способ прервать таймаут, если пользователь продолжает печатать.

...

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

И, наконец, он разделяет пример кода, который, я думаю, может помочь вам оптимизировать вашу функцию!

$(document).ready(function() { 
    $('input').keypress(function() { 
    if (this.timeoutId) 
     window.clearTimeout(this.timeoutId); 
    this.timeoutId = window.setTimeout(function() { 
     $.ajax({ 
      // do some stuff 
     }); 
    }, 200); 
    }); 
}); 
Смежные вопросы