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

Sti*_*MAN 32 javascript

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

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

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

我该怎么做呢?

CMS*_*CMS 35

像这样的东西:

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
}
Run Code Online (Sandbox Code Playgroud)

测试用法:

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"
Run Code Online (Sandbox Code Playgroud)

  • 为什么没有列出 InputEvent (`getGlobalProperties("Input")`)?那是一个全局变量,对吧? (2认同)

ple*_*shy 34

或者你可以简单地跑;

Object.keys(window);
Run Code Online (Sandbox Code Playgroud)

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

  • @gsamaras`Object.keys`适用于Chrome 5 +,Firefox 4 +,IE 9+和Opera 12+. (2认同)

Pau*_* S. 5

在某些情况下,您可能希望找到不可枚举的属性;因此for..in不会工作规范关于 chrome,也不会Object.keys因为两者都只使用可枚举的键。请注意,这for..in与 to 不同,in但我们不能使用 this 进行迭代。

这是使用的解决方案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..
Run Code Online (Sandbox Code Playgroud)

那么如果你想加入例如

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