jQuery $(this)里面的函数

时间:2012-08-15 12:15:50

标签: javascript jquery this-pointer

我想将$(this)传递给函数,但我不确定。有一个类似的线程,但我仍然无法使其工作。我希望有人可以帮助我。

$(document).ready(function() {
  var delay = (function(){
    var timer = 0;
    return function(callback, ms){
      clearTimeout (timer);
      timer = setTimeout(callback, ms);
    };
  })();

  $('input').keyup(function() {
      delay(function(){
        alert($(this).val());
      }, 1000 );
  });
});

4 个答案:

答案 0 :(得分:6)

您应该保存对此的引用:

$('input').keyup(function() {
    var $this = $(this);
    delay(function(){
      alert($this.val());
    }, 1000 );
});

另一种选择是将this重新绑定到函数:

  $('input').keyup(function() {
      delay(function(){
        alert($(this).val());
      }.bind(this), 1000 );
  });

答案 1 :(得分:1)

你需要带上下文:

return function(callback, ms, context){
  clearTimeout (timer);
  timer = setTimeout(function() {
      callback.call(context);
   }, ms);
};

然后

delay(function() {
    alert($(this).val());
}, 1000, this );

但是正如其他人发布的那样,在本地变量中保存上下文可能就是你真正想要的。这是另一种方法:

$('input').keyup(function() {
  delay((function(self) {
    return function() {
      alert($(self).val());
    };
  }(this)), 1000);
});

答案 2 :(得分:0)

在函数外部引用$(this)

 // ...

    $('input').keyup(function() {
        var $this = $(this);
        delay(function() {
            alert( $this.val() );
        }, 1000)
    });

答案 3 :(得分:0)

由于功能范围的变化而改变了。 您需要使用闭包来存储值。

如果您传递的只是值,则不需要$(this)

$('input').keyup(function() {
  var val = this.value;
  delay(function(){
    alert(val);
  }, 1000 );
});

另一种方式是

$('input').keyup(function() {
  delay((function(val){
    return function() {
      alert(val);
    };
  }(this.value)), 1000 );
});