Pourquoi cette variable pas définie dans une fonction setTimeout?
-
28-10-2019 - |
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
.
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);
});