2014-06-19 28 views
2

setTimeout函数不按预期工作。 这里是我的代码:setTimeout函数不能使用值更改

$(document).delegate('.pur','click', function(e){ 
    var productid = $(this).attr('id'); 
    var quantity = $('#qua').val(); 
    if(quantity>0){ 
     this.value='Adding'; 
    } 
    else{ 
     this.value='Min 100'; 
     setTimeout(function(){this.value='Buy now'}, 3000); 
    } 
}); 

上面的代码不会在所有的工作,它不会在3秒后,因为它是意料之中的事改变数值。任何缺陷或其中的东西?任何人都可以帮助找出它有什么问题吗?

+1

见[这里](http://stackoverflow.com/q/11714397/1633510),同样的问题。问题在于'this'的范围,你应该在'setTimeout'之外创建一个引用。' –

+1

问题是你传递给'setTimeout()'的函数中'this'的值不会是什么你想要它。 – Pointy

+0

是的,知道了,问题解决了,请把它作为你的回答:) –

回答

1

在匿名函数中对“this”的引用不指向任何内容。你可以改变它像这样(即self是在您的匿名函数的可见范围内的变量):

 this.value='Min 100'; 
    var self = this; 
    setTimeout(function(){self.value='Buy now'}, 3000); 
1

这也应该做的伎俩

setTimeout(function() { this.value = 'Buy now'; }.bind(this), 3000) 
2

范围界定问题

内你的setTimeout,“this”不是指setTimeout外的同一个对象。

修复它像这样

$(document).delegate('.pur','click', function(e){ 
    var productid = $(this).attr('id'); 
    var quantity = $('#qua').val(); 
    if(quantity>0){ 
     this.value='Adding'; 
    } 
    else{ 
     this.value='Min 100'; 
     var that = this; // hold a reference to "this" as "that" 
     setTimeout(function(){that.value='Buy now'}, 3000); // use "that" instead of "this" 
    } 
});