2014-06-19 54 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" 
    } 
});