2010-08-30 3 views
1

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

Любые мысли?

var delay = (function(){ 
    var timer = 0; 
    return function(callback, ms) { 
     clearTimeout (timer); 
     timer = setTimeout(callback, ms); 
    }; 
})(); 

$('input').keyup(function(){ 
    if($(this).val().length == 5) { 
     delay(function(){ $("#saveForm2").focus(); }, 2000); 
    } 
}) 
+0

Я не вижу, где вы используете метод '.delay()' jQuery. – user113716

+0

На самом деле я не, я пренебрег этим фактом, когда я писал тему, это настраиваемая функция задержки – stephenway

ответ

3

Если вы ищете простой способ связать экземпляр тайм-аута с элементом, рассмотрите метод jQuery .data().

Нечто подобное.

$('input').keyup(function() { 
    var $th = $(this); 
    var data = $th.data(); 
    if(data.timeout === undefined) { 
     data.timeout = null; 
    } 
    if ($th.val().length == 5) { 
     clearTimeout(data.timeout); 
     data.timeout = setTimeout(function() { 
      $("#saveForm2").focus(); 
     }, 2000); 
    } else { 
     clearTimeout(data.timeout); 
    } 
});​ 

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

EDIT: Сделано немного более эффективно с ранее сохраненной ссылкой на data().

0

Каждый раз, когда вы звоните delay(), вы затирать свой тайм-аут ручки, а это значит, что вы не можете управлять им после факта. Это также означает, что вы будете запускать запрос каждый раз, когда вы нажимаете 5 символов, если я правильно их прочитаю. Попробуйте что-то вроде этого:

var delayTimer; 
var nextField = function() { $("#saveForm2").focus(); } 
$('input').keyup(function(){ 
    clearTimeout(delayTimer); 
    if($(this).val().length >= 5) { 
    delayTimer = setTimeout(nextField, 2000); 
    } 
}) 

Это будет а) выстрелить не более 1 запрос, если не ждать более 2 секунд между нажатиями клавиш, и б) будет отменить любой ожидающий запрос, если вы падаете назад до 5 символов, прежде чем истекает время ожидания. В качестве бонуса он не создаст беспорядка анонимных функций.

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