2010-02-09 11 views
28

Existe-t-il un moyen de récupérer les noms/valeurs de toutes les variables globales sur une page?Récupérer toutes les variables globales (javascript) dans une page

Je voudrais écrire une fonction javascript pour effectuer les opérations suivantes:

  1. Trouver toutes les variables globales préfixées avec xxx_ »et les coller dans un tableau (par exemple)
  2. construire une chaîne de requête à l'aide les paires de valeurs de nom comme suit: xxx_glob_var1 = valeur1 & xxx_glob_var2 = valeur2 etc

Comment puis-je faire?

+1

Possible copie de (sauf pour la partie de construction de chaîne triviale) [Javascript - dumping toutes les variables globales] (https://stackoverflow.com/questions/8369338/javascript-dumping-all-global-variables) – Bergi

Répondre

27

Quelque chose comme ceci:

function getGlobalProperties(prefix) { 
    var keyValues = [], global = window; // window for browser environments 
    for (var prop in global) { 
    if (prop.indexOf(prefix) == 0) // check the prefix 
     keyValues.push(prop + "=" + global[prop]); 
    } 
    return keyValues.join('&'); // build the string 
} 

Une utilisation de test:

var xxx_foo = "foo"; 
xxx_bar = "bar"; 
window.xxx_baz = "baz"; 

var test = getGlobalProperties('xxx_'); 
// test contains "xxx_baz=baz&xxx_bar=bar&xxx_foo=foo" 
+0

Fantastique! merci beaucoup –

+0

Pourquoi InputEvent n'est pas listé ('getGlobalProperties (" Input ")')? C'est une variable globale, n'est-ce pas? Les clés –

2

Vous pouvez faire quelque chose comme ceci:

for (var i in window) { 
    // i is the variable name 
    // window[i] is the value of the variable 
} 

Bien avec cela, vous aurez un tas de propriétés DOM supplémentaires attachés à la fenêtre.

+3

'Objet .keys (window); 'montre beaucoup moins de propriétés DOM supplémentaires. –

+0

@DanDascalescu encore plus de 200 donc ce n'est pas utile lorsque vous voulez obtenir des objets créés uniquement par votre script – Pawel

3

Dans certains cas, vous voudrez peut-être trouver enumerable non propriétés; par conséquent, for..in ne fonctionnera pas (spec, about chrome) et les Object.keys n'utiliseraient pas les clés énumérables. Notez que for..in est différent de in mais nous ne pouvons pas l'utiliser pour itérer.

Voici une solution utilisant Object.getOwnPropertyNames (la compatibilité est IE9 +). J'ai également ajouté le support pour quand vous voulez seulement des propriétés énumérables ou si vous voulez rechercher un autre dans le contexte (pas global).

function findPrefixed(prefix, context, enumerableOnly) { 
    var i = prefix.length; 
    context = context || window; 
    if (enumerableOnly) return Object.keys(context).filter(function (e) {return e.slice(0,i) === prefix;}); 
    else return Object.getOwnPropertyNames(context).filter(function (e) {return e.slice(0,i) === prefix;}); 
} 
findPrefixed('webkit'); 
// ["webkitAudioContext", "webkitRTCPeerConnection", "webkitMediaStream", etc.. 

Ensuite, si vous souhaitez rejoindre par ex.

findPrefixed('webkit').map(function (e) {return e+'='+window[e];}).join('&'); 
// "webkitAudioContext=function AudioContext() { [native code] }&webkitRTCPeerConnection=function RTCPeerConnection() etc.. 
25

Ou vous pouvez simplement exécuter;

Object.keys(window); 

Il montrera quelques GLOBALS supplémentaires (~ 5), mais beaucoup moins que la réponse for (var i in window).

+0

ne sont pas définies. – gsamaras

+2

@gsamaras 'Object.keys' est disponible dans Chrome 5+, Firefox 4+, IE 9+ et Opera 12+. –

+0

Je vois @ rink.attendant.6, merci. pleshy, vous voudrez peut-être ajouter cela dans votre réponse .. – gsamaras

1

Dans mon cas, les deux premières réponses ne fonctionnent pas, donc j'ajoute une autre réponse, pour mettre en évidence le commentaire de Dan Dascalescu:

Object.keys(window); 

Quand je l'exécutaient, il a donné:

haut, emplacement, document, fenêtre, externe, chrome, $, jQuery, matchMedia, jQuery1113010234049730934203, match_exists, player_exists, add_me, isLettre, create_match, delete_me, attente, incertain, refresh, delete_match, jsfunction, vérification, set_global, autoheight , updateTextbox, update_match, update_player, alertifier, swal, douxAlert, save_match, $ body, valeur_ou_null, joueur, p osition, capacité, obj_need_save, xxx_saves, previousActiveElement

où le joueur, positon, capacité, obj_need_save, xx_saves sont mes variables globales réelles.


Je viens de voir qu'il existe un answer semblable à une autre question.