jQuery键控延迟事件

jQuery键控延迟事件,jquery,delay,Jquery,Delay,我正在尝试为jQuery创建特殊事件。我想使控制延迟,这将工作时,用户停止0.5秒。但是我不能使用setTimeout jQuery.event.special.keyupdelay = { add : function(handler, data, namespaces) { var delay = data && data.delay || 100; return function(event) {

我正在尝试为jQuery创建特殊事件。我想使控制延迟,这将工作时,用户停止0.5秒。但是我不能使用setTimeout

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!');
});  
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);
});
设置超时不工作

我可以这样做

$(".money").bind("keyupdelay", {delay: 1000}, function( event ) {
    alert('Delayed!');
});  
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);
});

但是我想创建一个特殊的事件,它会延迟触发。我有很多控件必须与延迟一起工作。

我猜可能是您在超时中使用了“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);
    }
};

什么可以阻止setTimeout的使用?可能有一个解决办法