Почему эта переменная не установлена ​​в функции setTimeout? - PullRequest
0 голосов
/ 15 июня 2011

Привет, программисты,

У меня есть базовая текстовая область:

<textarea id='text_comment'></div>

У меня есть эта функция:

$('#text_comment').live('keypress', function() {

    setTimeout(function() {
    string = $(this).val();         

         alert(string);
    }, 500);

});

Он должен предупредить значение, которое находится в текстовой области, но ничего не предупреждает.

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

Ответы [ 5 ]

5 голосов
/ 15 июня 2011

контекст становится window, поскольку setTimeout является методом window.

$('#text_comment').live('keypress', function() {

    var el = this;

    setTimeout(function() {
         var string = $(el).val();         

         alert(string);
    }, 500);

});

, если вы сохраните ссылку на el таким способом, вы можете положиться на нее вместо this

А также, вы можете просто использовать el.value, поскольку нет необходимости оборачивать его в jQuery и делать то же самое внутренне с помощью .val()

1 голос
/ 15 июня 2011

Поскольку обратный вызов выполняется не в области действия события keypress, а в глобальной области действия window.

Скопируйте ссылку на локальную переменную, чтобы она была включена в замыкание:

$('#text_comment').live('keypress', function() {

  var element = this;

  window.setTimeout(function() {
    var string = $(element).val();         
    alert(string);
  }, 500);

});
1 голос
/ 15 июня 2011

Значение this зависит от того, как была вызвана текущая функция.Функция, которую вы передаете setTimeout, отличается от функции обработчика событий, поэтому значение this отличается.

Сначала создайте копию this.

$('#text_comment').live('keypress', function() {
    var that = this;
    setTimeout(function() {
    string = $(that).val();         
         alert(string);
    }, 500);

});
1 голос
/ 15 июня 2011

Значение this изменяется внутри функции, переданной в setTimeout.Сделайте это так:

$('#text_comment').live('keypress', function() {

    var self = this

    setTimeout(function() {
    string = $(self).val();         

         alert(string);
    }, 500);

});
0 голосов
/ 15 июня 2011

при возникновении события «нажатие клавиши» значение this в функции будет textarea объект.Но когда функция в setTimeout запущена (через 500 миллисекунд), значение this было изменено на что-то другое (возможно, window объект)

Измените код на:

$('#text_comment').live('keypress', function() {

    var textarea = this;
    setTimeout(function() {
    string = $(textarea).val();         

         alert(string);
    }, 500);

});
...