在页面中获取所有(JavaScript)全局变量

48

有没有一种方法可以检索页面上所有全局变量的名称/值?

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

  1. 查找以“xxx_”为前缀的所有全局变量,并将它们放入数组中(例如)
  2. 使用名称值对构建查询字符串,格式如下: xxx_glob_var1=value1&xxx_glob_var2=value2等等

我该怎么做?


1
可能是重复的(字符串构建部分除外)[JavaScript-转储所有全局变量](https://dev59.com/ZWsy5IYBdhLWcg3wtwQd) - Bergi
请查看此答案以列出window上的所有自定义属性 - KyleMit
5个回答

50

或者你可以简单地运行;

Object.keys(window);

它将显示一些额外的全局变量(大约5个),但远比使用for (var i in window)方法少。

Object.keys在Chrome 5+,Firefox 4+,IE 9+和Opera 12中可用,感谢@rink.attendant.6提供的信息。


3
Object.keys 在 Chrome 5+、Firefox 4+、IE 9+ 和 Opera 12+ 中可用。 - rink.attendant.6
我看到了@rink.attendant.6,谢谢。pleshy,你可能想把这个加入到你的答案中。 - gsamaras

38

类似以下内容:

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
为什么InputEvent没有列在(getGlobalProperties("Input"))中?那不是全局变量吗? - Mads Skjern

5

在某些情况下,您可能希望查找非可枚举属性; 因此for..in不起作用(规范, 关于Chrome)Object.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
您可以这样做:
for (var i in window) {
    // i is the variable name
    // window[i] is the value of the variable
}

虽然如此,您将得到许多额外的DOM属性附加到窗口。


4
Object.keys(window);显示的额外DOM属性要少得多。 - Dan Dascalescu
@DanDascalescu 还有200多,所以当想要获取仅由您的脚本创建的对象时,它并不实用。 - Pawel

1
在我的情况下,前两个答案不起作用,因此我正在添加另一个答案,以突出Dan Dascalescu的评论。
Object.keys(window);

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

top、location、document、window、external、chrome、$、jQuery、matchMedia、jQuery1113010234049730934203、match_exists、player_exists、add_me、isLetter、create_match、delete_me、waiting、unsure、refresh、delete_match、jsfunction、check、set_global、autoheight、updateTextbox、update_match、update_player、alertify、swal、sweetAlert、save_match、$body、value_or_null、player、position、ability、obj_need_save、xxx_saves、previousActiveElement

其中 player、positon、ability、obj_need_save 和 xxx_saves 是我的实际全局变量。

我刚刚看到有一个类似的答案与另一个问题相关联。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接