Вопрос

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

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

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

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

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

         alert(string);
    }, 500);

});

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

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

Это было полезно?

Решение

контекст становится 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()

Другие советы

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

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

    var self = this

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

         alert(string);
    }, 500);

});

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

Делать копию this первый.

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

});

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

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

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

  var element = this;

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

});

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

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

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

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

         alert(string);
    }, 500);

});
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top