jQuery $(this) внутренняя функция


Я хочу передать $(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 2

4 ответа:

Вы должны сохранить ссылку на это:

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

Другим вариантом является повторная привязка this к функции:

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

Вам нужно будет привести контекст:

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);
});

Держите ссылку на $(this) вне функции.

 // ...

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

Это изменилось из-за изменения области действия функции. Вам нужно сохранить значение, используя закрытие.

Если все, что вы передаете, - это значение, вам не нужно $(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 );
});