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.

¿Fue útil?

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);

});
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top