2010-02-26 148 views
0

我想爲jQuery創建特殊事件。我想進行控制延遲,當用戶停止0.5秒時這將會起作用。但我不能使用setTimeout。jQuery鍵盤延遲事件

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

有什麼問題嗎? – 2010-02-26 14:00:33

+1

什麼防止setTimeout使用?可能有解決方法 – 2010-02-26 14:01:30

回答

1

我猜測它可能是你在超時使用「this」:當延遲後運行函數時,「this」將是窗口對象。

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); 
    } 
};