¿Por qué esta variable no se establece en una función SetTimeOut?
-
28-10-2019 - |
Pregunta
Tengo un textea básico:
<textarea id='text_comment'></div>
Tengo esta función:
$('#text_comment').live('keypress', function() {
setTimeout(function() {
string = $(this).val();
alert(string);
}, 500);
});
Debe alertar el valor que está en TextARea, pero no alerta nada.
Me gustaría que obtenga el valor de TextARea después de 500 ms, pero no parece establecer la variable si está dentro del setTimeout
función.
Solución
El contexto se convierte en window
'S desde setTimeout
es un método de window
.
$('#text_comment').live('keypress', function() {
var el = this;
setTimeout(function() {
var string = $(el).val();
alert(string);
}, 500);
});
Si guarda una referencia al EL de esta manera, puede confiar en él en lugar de this
Y también, puedes usar el.value
Dado que no hay necesidad de envolverlo en jQuery y hacer exactamente lo mismo internamente por .val()
Otros consejos
El valor de this
Cambios dentro de la función pasada a SetTimeout. Hazlo asi:
$('#text_comment').live('keypress', function() {
var self = this
setTimeout(function() {
string = $(self).val();
alert(string);
}, 500);
});
El valor de this
depende de cómo se haya llamado a la función actual. La función a la que pasas setTimeout
es una función diferente para el controlador de eventos, por lo que el valor de this
es diferente.
Hacer una copia de this
primero.
$('#text_comment').live('keypress', function() {
var that = this;
setTimeout(function() {
string = $(that).val();
alert(string);
}, 500);
});
Porque la devolución de llamada no se ejecuta en el alcance del keypress
evento, pero en el alcance global window
.
Copie la referencia a una variable local para que se incluya en el cierre:
$('#text_comment').live('keypress', function() {
var element = this;
window.setTimeout(function() {
var string = $(element).val();
alert(string);
}, 500);
});
Cuando se dispara el evento 'KeyPress', el valor de this
en la función sería textarea
objeto. Pero cuando la función en setTimeout
se ejecuta (después de 500 milisegundos), el valor de this
se ha cambiado a otra cosa (tal vez window
objeto)
Cambie su código a:
$('#text_comment').live('keypress', function() {
var textarea = this;
setTimeout(function() {
string = $(textarea).val();
alert(string);
}, 500);
});