2010-02-09 19 views
28

¿Hay alguna manera de recuperar los nombres/valores de todas las variables globales en una página?Obtención de todas las variables globales (javascript) en una página

me gustaría escribir una función javascript para hacer lo siguiente:

  1. Encuentra todas las variables globales con el prefijo 'xxx_' y pegarlas en una matriz (por ejemplo)
  2. construir una cadena de consulta utilizando los pares de nombre y valor de la siguiente manera: xxx_glob_var1 = valor1 & xxx_glob_var2 = valor2, etc

¿Cómo se hace esto?

+1

Posible duplicado de (excepto para la parte trivial de construcción de cadenas) [Javascript - descartando todas las variables globales] (https://stackoverflow.com/questions/8369338/javascript-dumping-all-global-variables) – Bergi

Respuesta

27

Algo como esto:

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 
} 

Un uso de la prueba:

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

¡Fantástico! muchas gracias –

+0

¿Por qué InputEvent no aparece en la lista ('getGlobalProperties (" Input ")')? Esa es una variable global, ¿verdad? –

2

se podría hacer algo como esto:

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

Aunque con esto, usted obtendrá un montón de propiedades DOM adicionales unidas a la ventana.

+3

'Objeto .keys (ventana); 'muestra muchas menos propiedades DOM. –

+0

@DanDascalescu todavía más de 200, por lo que no es útil cuando se quieren obtener objetos creados solo por su secuencia de comandos – Pawel

3

En algunos casos, es posible que desee encontrar no enumerable propiedades; por lo tanto, for..in no funcionará (spec, about chrome) y tampoco Object.keys ya que ambos solo usan claves enumerables. Observe que for..in es diferente a in pero no podemos usar esto para iterar.

Aquí hay una solución que usa Object.getOwnPropertyNames (la compatibilidad es IE9 +). También agregué compatibilidad para cuando solo desea propiedades enumerables o si desea buscar otra en contexto (no 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.. 

Luego, si quieres unirte, por ejemplo.

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

O simplemente puede ejecutar;

Object.keys(window); 

se mostrará un par de variables globales adicionales (~ 5), pero mucho menos que la respuesta for (var i in window).

+0

claves no está definido. – gsamaras

+2

@gsamaras 'Object.keys' está disponible en Chrome 5+, Firefox 4+, IE 9+ y Opera 12+. –

+0

Veo @ rink.attendant.6, gracias. pleshy, es posible que desee agregar esto en su respuesta ... – gsamaras

1

En mi caso, las dos mejores respuestas no funcionó, por lo tanto estoy añadiendo otra respuesta, para resaltar el comentario de Dan Dascalescu:

Object.keys(window); 

Cuando ejecuté y se lo dio:

arriba, ubicación, documento, ventana, externo, chrome, $, jQuery, matchMedia, jQuery1113010234049730934203, match_exists, player_exists, add_me, isLetter, create_match, delete_me, esperando, inseguro, refresh, delete_match, jsfunction, check, set_global, autoheight , updateTextbox, update_match, update_player, alertify, swal, sweetAlert, save_match, $ body, value_or_null, player, p OSICIÓN, capacidad, obj_need_save, xxx_saves, previousActiveElement

donde el jugador, positon, capacidad, obj_need_save, xx_saves son mis variables globales reales.


Acabo de ver que existe un parecido answer a otra pregunta.

Cuestiones relacionadas