2010-12-11 23 views
2

JavaScript:Comment référencer une variable globale depuis un gestionnaire d'événements en ligne?

lang = {'edit': 'Edit'}; // global variable 

HTML:

<select onchange="alert(lang.edit)"> // alerts undefined 

Chaque fois que l'événement se déclenche, il alerte "undefined". La variable lang est globale, alors pourquoi le code du gestionnaire d'événements inline ne peut-il pas le référencer?

+4

Il n'y a pas de JSON ici, juste un objet régulier (et la syntaxe ne serait pas encore JSON si vous la retiriez du JS, JSON utilise uniquement des guillemets doubles). Il n'y a aucune raison dans votre question de ne pas travailler, le problème est probablement ailleurs. – Quentin

Répondre

4
  1. Assurez-vous que le fichier JavaScript est définissant explicitement une variable globale:

    window['lang'] = {'edit': 'Edit'}; 
    
  2. Assurez-vous que votre code de gestionnaire d'événements fait explicitement référence à la variable globale "lang":

    <select onchange='alert(window.lang.edit)'> 
    

Le 1er est probablement déjà OK, mais j'ajoute juste pour m'en assurer. La deuxième chose, eh bien, l'interprétation des valeurs d'attribut "onfoo" est subtile et étrange. S'il y a un attribut « lang » attribut de l'élément <select> DOM ou une « lang » sur une étiquette <form> entourant le <select>, puis une référence à l'identifiant « lang » dans la valeur « onclick » va ramasser qui au lieu du "lang" global que vous définissez dans le fichier JavaScript. Votre valeur « onclick » est transformée en une fonction (pour que cela fonctionne comme un gestionnaire d'événements) par un processus qui ressemble plus ou moins comme ceci:

var handler = new Function("event", "with (this.form) { with (this) { alert(lang.edit); }}"); 

Il est bizarre, mais qui est en fait ce qui se passe avec ce genre de code de gestionnaire d'événements.

+0

problème résolu .. mais puis-je demander pourquoi il n'est pas accessible à partir d'un appel d'événement? J'ai aussi essayé ce $ lang.edit et l'objet était $ lang = {...} .. de cette façon se rapporte à jQuery dont j'utilise ce projet.!? – Dewan159

+1

Lorsque vous avez utilisé "$ lang" comme nom de variable, cela a-t-il fonctionné? Aussi, à quoi ressemble le reste du Javascript autour de cette déclaration "lang"? – Pointy

0

Chaque objet global dans javascript est une propriété de l'objet window. Donc vous devriez écrire window.lang = {'edit': 'Edit'};