2010-08-23 7 views
6

J'essaie d'utiliser une valeur de variable en dehors de la fonction dans laquelle elle a été définie. Je pensais juste besoin de déclarer la variable en dehors de la fonction mais cela ne la coupe pas . Faut-il être facile pour ceux qui savent?

Fiddle Herejquery/javascript - accéder aux variables depuis l'extérieur d'une fonction

jQuery(document).ready(function() { 

    var readOut; 
    var readOut2; 

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

    }); 

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

Merci à tous, en particulier Andy E avec le explaination et solution.

+0

Essayez de supprimer « var » de la déclaration de variable, car cela devrait les variables globales, ou en les plaçant en dehors de la fonction prête. Pas assez confidents pour mettre cela dans une réponse si :) Faites-moi savoir si cela fonctionne. Je pense que les variables sont locales à la fonction ready() seulement. –

+0

Quel est votre problème? Sauf pour la faute de frappe ('var readOut;' vs 'readOut1 = ...') votre code semble fonctionner comme il se doit. – adamse

+0

@tom: Vous avez tort. Ce que vous suggérez fonctionnera, mais il devrait fonctionner comme maintenant. Les globales implicites ne sont pas mauvaises. Le gestionnaire interne ('mousemove') a accès à toutes les variables du gestionnaire' ready'. (Chercher des mots-clés pour en savoir plus: javascript, fermetures) – adamse

Répondre

5

Affectation aux variables via une fonction de rappel enregistrée dans un gestionnaire d'événements. Cela signifie que lorsque cela fonctionne:

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

readOut2 a une valeur de non définie parce qu'il n'a pas été fixé par la fonction de gestionnaire encore mousemove. Ce gestionnaire ne se déclenchera pas jusqu'à ce que le code en attente d'exécution cesse d'être exécuté et que l'utilisateur déplace sa souris. Vous pouvez définir une fonction dans la même portée que les variables et appeler cette fonction à partir du gestionnaire mousemove.

Re: vos commentaires sur une autre réponse, vous pouvez utiliser une minuterie:

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. ça a tout éclairci pour moi, bravo! – jack

2

Je suppose que vous voulez suivre les coordonnées du curseur, consultez le code source mis à jour:

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 merci, je l'utilisais plus comme un exemple.oui je veux suivre les mouvements du curseur, mais je veux utiliser la valeur en dehors de la fonction on mousemove, c'est pourquoi j'ai déplacé la ligne var2. – jack

1

Cela ressemble à un problème de synchronisation.

Cette ligne

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

est appelé à gonna get document.ready, alors que l'événement mousemove n'a pas encore été appelée, si readOut2 aura pas encore une valeur.

+0

ah oui, comment dense de moi. puis-je utiliser setInterval pour mettre à jour constamment readOut2? – jack

1

mais souhaitez utiliser la valeur en dehors de la sur la fonction mousemove

Comme les variables readOut1 et readOut2 pourrait ne pas être réglé avant que le gestionnaire d'événements mousemove est exécuté, vous devrez appeler un code qui utilisera ces variables du gestionnaire de mousemove.

Exemple:

$(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

Bravo c'est très utile. Je me demande si l'affichage de readOut2 peut être appelé par une minuterie comme setInterval au lieu de mousemove? – jack

Questions connexes