2010-02-26 5 views
0

Я пытаюсь создать специальное событие для jQuery. Я хочу сделать контролируемую задержку, которая будет работать, когда пользователь остановится на 0,5 с. Но я не могу использовать setTimeout.jQuery событие задержки keyup

jQuery.event.special.keyupdelay = { 
    add : function(handler, data, namespaces) { 
     var delay = data && data.delay || 100; 

     return function(event) {             
      setTimeout(function() { handler.apply(this, arguments);}, data); 
     } 
    }, 

    setup: function(data, namespaces) { 
     jQuery(this).bind("keyup", jQuery.event.special.keyupdelay.handler); 
    }, 

    teardown: function(namespaces) { 
     jQuery(this).unbind("keyup", jQuery.event.special.keyupdelay.handler);   
    }, 

    handler: function(event) {    
     event.type = "keyupdelay"; 
     jQuery.event.handle.apply(this, arguments); 
    } 
}; 

Чтобы использовать его как это

$(".money").bind("keyupdelay", {delay: 1000}, function(event) { 
    alert('Delayed!'); 
}); 

SetTimeout не работает.

я могу сделать это, как этот

var timer; 

$(".quantity input").keyup(function() { 
     var self = $(this); 

     if(timer) { 
      clearTimeout(timer); 
      timer = null; 
     } 
     timer = setTimeout(function() { 
      var qty = self.val(); 
      $(".qty").html(qty); 
     }, 300); 
}); 

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

+1

что еще вопрос? –

+1

Что предотвращает использование setTimeout? Может быть, вокруг –

ответ

1

Я предполагаю, что это может быть ваше использование «этого» в тайм-ауте: когда функция запускается после задержки, «это» будет объектом окна.

jQuery.event.special.keyupdelay = { 
    add : function(handler, data, namespaces) { 
     var delay = data && data.delay || 100, 
      that = this; 

     return function(event) {             
      setTimeout(function() { handler.apply(that, arguments);}, data); 
     } 
    }, 

    setup: function(data, namespaces) { 
     jQuery(this).bind("keyup", jQuery.event.special.keyupdelay.handler); 
    }, 

    teardown: function(namespaces) { 
     jQuery(this).unbind("keyup", jQuery.event.special.keyupdelay.handler);   
    }, 

    handler: function(event) {    
     event.type = "keyupdelay"; 
     jQuery.event.handle.apply(this, arguments); 
    } 
}; 
Смежные вопросы