获取页面中的所有(javascript)全局变量

时间:2010-02-09 00:54:18

标签: javascript

有没有办法检索页面上所有全局变量的名称/值?

我想编写一个javascript函数来执行以下操作:

  1. 找到所有以'xxx_'为前缀的全局变量并将它们粘贴在一个数组中(例如)。
  2. 使用名称值对构建查询字符串,如下所示: xxx_glob_var1 = value1& xxx_glob_var2 = value2等
  3. 我该怎么做?

5 个答案:

答案 0 :(得分:33)

或者你可以简单地跑;

Object.keys(window);

它会显示一些额外的全局变量(~5),但远低于for (var i in window)答案。

答案 1 :(得分:32)

这样的事情:

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
}

测试用法:

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"

答案 2 :(得分:4)

在某些情况下,您可能希望找到非enumerable属性;因此,for..in无效specabout chromeObject.keys也不会,因为两者都只使用可枚举键。请注意for..inin不同,但我们不能使用它来迭代。

这是使用Object.getOwnPropertyNames的解决方案(兼容性是IE9 +)。我还添加了对只需要可枚举属性的时间或者如果要在上下文中搜索另一个属性(非全局)的支持。

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..

然后,如果你想加入,例如

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

答案 3 :(得分:3)

你可以这样做:

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

虽然有了这个,你会得到一堆额外的DOM属性附加到窗口。

答案 4 :(得分:1)

就我而言,两个最佳答案都不起作用,因此我要添加另一个答案,以突出Dan Dascalescu的评论:

Object.keys(window);

当我执行它时,它给出了:

  

顶部,位置,文件,窗口,外部,铬,$,jQuery的,matchMedia,jQuery1113010234049730934203,match_exists,player_exists,add_me,isLetter,create_match,delete_me,等待,不确定,刷新,delete_match,jsfunction,支票,set_global,autoheight ,updateTextbox,update_match,update_player,alertify,SwaI位,sweetAlert,save_match,$体,value_or_null,播放器,位置,能力,obj_need_save,xxx_saves,previousActiveElement

其中玩家,位置,能力,obj_need_save,xx_saves是我的实际全局变量。

我刚刚看到另一个问题存在类似的answer