Question

J'ai un textarea de base:

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

J'ai cette fonction:

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

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

         alert(string);
    }, 500);

});

Il devrait alerter la valeur qui est dans la zone de texte, mais rien alertes.

Je voudrais pour obtenir la valeur du textarea après 500ms, mais il ne semble pas la variable si elle est à l'intérieur de la fonction setTimeout.

Était-ce utile?

La solution

contexte devient depuis window de la setTimeout est une méthode de window.

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

    var el = this;

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

         alert(string);
    }, 500);

});

si vous enregistrez une référence à l'el de cette manière, vous pouvez compter sur elle au lieu de this

Et aussi, vous pouvez simplement utiliser el.value depuis Theres aucun besoin de l'envelopper dans jQuery et faire exactement la même chose en interne par .val()

Autres conseils

La valeur de this change à l'intérieur de la fonction passée à setTimeout. Faites comme ceci:

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

    var self = this

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

         alert(string);
    }, 500);

});

La valeur de this dépend de la façon dont la fonction actuelle a été appelée. La fonction que vous passez à setTimeout est une autre fonction au gestionnaire d'événements, de sorte que la valeur de this est différent.

Faites une copie de this premier.

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

});

Parce que le rappel n'est pas exécuté dans le cadre de l'événement keypress, mais dans le window de portée mondiale.

Copie la référence à une variable locale afin qu'il soit inclus dans la fermeture:

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

  var element = this;

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

});

lorsque l'événement « keypress » est tiré, la valeur de this dans la fonction serait l'objet textarea. Mais lorsque la fonction est exécutée dans setTimeout (après 500 millisecondes), la valeur de this a été changé à autre chose (peut-être l'objet window)

Changer votre code:

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

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

         alert(string);
    }, 500);

});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top