2010-02-26 125 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); 
    } 
};