clearTimeout & setTimeout не работает - PullRequest
2 голосов
/ 07 марта 2011

В продолжение этого вопроса я бы хотел знать, почему это не работает

$("#textarea").keydown(function(){
oldValue = $("#textarea").val();
});
$("#textarea").keyup(function(){
var startTimer = null;
if(startTimer) clearTimeout(startTimer);
startTimer = setTimeout(function(){
var newValue = $("#textarea").val();
// get something out of the comparison
alert(something) // alert the comparison
  oldValue = newValue;

},2000);

Требуемое поведение - получать предупреждающее сообщение, только если пользователь ничего не набрал в течение 2 секунд. Это работает как для части сравнения, однако, это не останавливает сообщение с предупреждением, когда я продолжаю печатать как следует. Вместо этого я получаю то же количество предупреждений, что и количество нажатых клавиш. Я попробовал версию этого создания и удаления куки, которая работала нормально. Что не так в этом конкретном случае?

Ответы [ 2 ]

6 голосов
/ 07 марта 2011

Вы получаете новый startTimer (и инициализируете его как null) при каждом вызове вашего обработчика keyup. Попробуйте объявить это за пределами области:

(function() {
    var startTimer = null;
    var oldValue; // Declare this too, so it isn't global

    $("#textarea").keydown(function(){
        oldValue = $("#textarea").val();
    });
    $("#textarea").keyup(function(){
        if(startTimer) {
            clearTimeout(startTimer);
        }
        startTimer = setTimeout(function(){
            var newValue = $("#textarea").val();
            // get something out of the comparison
            alert(something) // alert the comparison
            oldValue = newValue;
        },2000);
    });
})();
1 голос
/ 07 марта 2011

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

http://benalman.com/projects/jquery-throttle-debounce-plugin/

Регулирование Используя jQuery throttle / debounce, вы можете передать задержку и функцию в $ .throttle, чтобы получить новую функцию, котораяпри повторном вызове выполняет исходную функцию (в том же контексте и со всеми переданными аргументами) не чаще одного раза в миллисекунды с задержкой.

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

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

...