2009-11-04 15 views
8

Estoy tratando de usar una declaración jQuery dentro de una función setTimeout, pero No consigo que funcione. He intentado muchas variantes, como éste (estoy usando 'esto' porque el setTimeout está dentro de un cada función, y el selector se almacena en caché/almacenado en un objeto, por tanto, el selector $):Variables en una función setTimeout (jQuery)

setTimeout("" + this.$selector + ".val('" + this.savVal + "')", 1); 

¿Cómo debo escribir esto?

Gracias!

+3

Las cadenas en 'setTimeout()' y 'setInterval()' están obsoletas. Las funciones se deben utilizar en su lugar. –

Respuesta

1

Probablemente pueda hacer algo como esto, si las variables que está tratando de usar están definidas en cada paso del ciclo.

var myObj = { 
    $selector: myConfigObj.$myCachedSelector 
} 

$.each([ myObj, mySecondObj, myThirdObj ], function(n, $selector) { 
    setTimeout(function() { 
     $selector.val(saveVal); 
    }, 1); 
}); 
+0

Marco, "myConfigObj. $ MyCachedSelector" parece ser el problema. Devuelve "indefinido". Lo reemplacé con una cadena simple que se devuelve correctamente ... – north

19

Cuando se necesita para preservar el elemento actual this al llamar a setTimeout utilizar esta estructura: -

setTimeout((function(self) { 
    return function() { $selector.val(self.savVal) }; 
})(this), 1); 

Esto crea un cierre del contexto funciones de ejecución externa. La función externa devuelve una función interna que tendrá acceso al parámetro self. Es la función interna que se llama cuando se agota el tiempo de espera pero el valor de self se mantendrá en el valor original de this.

+0

Elegante si un poco críptico para las personas que no están familiarizadas con los cierres. Siento tonto, esto no fue lo primero que me vino a la mente cuando me di cuenta de que IE no estaba pasando parámetros. Le suplico "Desarrollador .NET" como mi excusa. Eso es una cosa, ¿verdad? –

0

gracias por sus respuestas.

Estoy usando una función dentro de setTimeout ahora. Pero descubrí que el verdadero problema se encuentra en otra parte: en cada función estoy tratando de acceder a las propiedades del objeto que apuntan a las propiedades dentro de un objeto config, pero el resultado (por ejemplo para este. $ Selector) es "indefinido" .

var myObj = { 
    $selector: myConfigObj.$myCachedSelector 
} 

$.each([ myObj, mySecondObj, myThirdObj ], function() { 
    //code 
});     

No estoy seguro de cuál es el problema. Ambos objetos están en la misma función/alcance.

7

AnthonyWJones proporcionó una gran respuesta, pero hay otra similar, que es un poco más fácil de escribir y leer. Simplemente almacena el valor de "this" en una variable local., Es decir.

var storedThis = this; 
setTimeout(function() { $selector.val(storedThis.savVal); }, 1); 
Cuestiones relacionadas