【问题标题】:setTimeout function not working with value changesetTimeout 函数不适用于值更改
【发布时间】:2014-06-19 18:32:25
【问题描述】:

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 秒后改变值。有什么缺陷或什么吗?谁能帮忙找出问题所在?

【问题讨论】:

  • here,同样的问题。问题是this 的范围,您应该在setTimeout 之外创建对它的引用
  • 问题是你传递给setTimeout()的函数中this的值不是你想要的。
  • 是的,明白了,问题解决了,请把它作为你的答案:)

标签: javascript jquery


【解决方案1】:

范围问题

在您的 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"
    }
});

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这也应该可以解决问题

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

      【讨论】:

        猜你喜欢
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        相关资源
        最近更新 更多