2010-08-23 19 views
6

Estoy tratando de usar un valor de variable fuera de la función en la que fue definido. Pensé que solo necesitaba declarar la variable fuera de la función, pero eso no la corta . ¿Debe ser fácil para aquellos que saben?

Fiddle Herejquery/javascript - accediendo a variables desde fuera de una función

jQuery(document).ready(function() { 

    var readOut; 
    var readOut2; 

    $(document).mousemove(function(e) { 
     readOut1 = e.pageX; 
     readOut2 = e.pageY; 
     $('#var1').html(readOut1); 

    }); 

    $('#var2').html(readOut2); 
})​ 

Gracias a todos, especialmente Andy E con la explicación y solution.

+0

Trate de no incluir 'var' de la declaración de variables, ya que esto debería hacer que las variables globales variables, o colocándolos fuera de la función listo. No lo suficiente como para poner eso en una respuesta :) Avíseme si funciona. Creo que las variables son locales para la función ready() solamente. –

+0

¿Cuál es su problema? Excepto por el error tipográfico ('var readOut;' vs 'readOut1 = ...') su código parece estar funcionando como debería. – adamse

+0

@tom: Estás equivocado. Lo que está sugiriendo que funcionará, sin embargo, debería funcionar como lo está haciendo ahora. Los globales implícitos no son malos. El controlador interno ('mousemove') tiene acceso a todas las variables que tiene el controlador' ready'. (Buscar palabras clave para obtener más información sobre esto: javascript, cierres) – adamse

Respuesta

5

Está asignando las variables a través de una función de devolución de llamada que está registrada en un controlador de eventos. Esto significa que cuando esta se ejecuta:

$('#var2').html(readOut2); 

readOut2 tiene un valor de indefinido debido a que no se ha establecido por la función de controlador mousemove todavía. Ese controlador no se activará hasta que el código en cola actual deje de ejecutarse y el usuario mueva el mouse. Puede definir una función en el mismo ámbito que las variables y llamar a esa función desde el manejador de mouse mousemove.

Re: sus comentarios en otra respuesta, se podría utilizar un temporizador:

jQuery(document).ready(function() {  
    var readOut1; 
    var readOut2; 

    $(document).mousemove(function(e) { 
     readOut1 = e.pageX; 
     readOut2 = e.pageY; 
     $('#var1').html(readOut1); 

    }); 

    window.setInterval(function() { 
     $('#var2').html(readOut2); 
    }, 300); 
})​; 
+0

niceone. eso lo ha aclarado todo, ¡salud! – jack

2

supongo que se desea realizar un seguimiento coordenadas del cursor, revisar el código fuente actualización:

jQuery(document).ready(function() { 

    var readOut1; 
    var readOut2; 

    $(document).mousemove(function(e) { 
     readOut1 = e.pageX; 
     readOut2 = e.pageY; 
     $('#var1').html(readOut1); 
     $('#var2').html(readOut2); 
    }); 

})​ 

http://jsfiddle.net/xSa2T/2/

+0

hey gracias, estaba usando esto más como un ejemplo.sí, quiero seguir los movimientos del cursor, pero quiero usar el valor fuera de la función mousemove, por lo que moví la línea var2. – jack

1

Parece un problema de tiempo.

Esta línea

$('#var2').html(readOut2); 

va a ser llamado a document.ready, mientras que el evento MouseMove no ha sido llamado todavía, así readOut2 no tendrá un valor aún.

+0

ah sí, qué denso de mí. ¿podría usar setInterval para actualizar constantemente readOut2? – jack

1

pero desea utilizar el valor fuera del sobre la función mousemove

Como las variables readOut1 y readOut2 no esté definida antes de que el controlador de eventos mousemove se ejecute, tendrá que llamar a cualquier código que utilice estas variables del manejador de mousemove.

Ejemplo:

$(document).mousemove(function(e) { 
    readOut1 = e.pageX; 
    readOut2 = e.pageY; 

    doStuffWithReadOuts(/* possibly passing readouts as arguments instead... */); 
}); 

function doStuffWithReadOuts() { 
     $('#var1').html(readOut1); 
     $('#var2').html(readOut2); 
} 
+0

aplausos eso es bastante útil. Me pregunto si la pantalla readOut2 podría ser llamada a un temporizador como setInterval en lugar de mousemove? – jack

Cuestiones relacionadas