【问题标题】:Fetching all (javascript) global variables in a page获取页面中的所有(javascript)全局变量
【发布时间】:2011-01-14 14:57:24
【问题描述】:

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

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

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

我该怎么做?

【问题讨论】:

标签: javascript


【解决方案1】:

或者你可以简单地运行;

Object.keys(window);

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

Object.keys 适用于 Chrome 5+、Firefox 4+、IE 9+ 和 Opera 12,ty @rink.attendant.6

【讨论】:

  • @gsamaras Object.keys 适用于 Chrome 5+、Firefox 4+、IE 9+ 和 Opera 12+。
  • 我看到了@rink.attendant.6,谢谢。 pleshy,您可能想将此添加到您的答案中..
【解决方案2】:

类似这样的:

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"

【讨论】:

  • 为什么 InputEvent 没有列出 (getGlobalProperties("Input"))?那是一个全局变量,对吧?
【解决方案3】:

在某些情况下,您可能希望找到非enumerable 属性;因此for..in 将不起作用(spec, about 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..

【讨论】:

    【解决方案4】:

    你可以这样做:

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

    尽管如此,你会得到一堆额外的 DOM 属性附加到窗口。

    【讨论】:

    • Object.keys(window); 显示的额外 DOM 属性要少得多。
    • @DanDascalescu 仍然超过 200,所以当想要获取仅由您的脚本创建的对象时它没有用
    【解决方案5】:

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

    Object.keys(window);
    

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

    顶部,位置,文档,窗口,外部,chrome,$,jQuery,matchMedia,jQuery1113010234049730934203,match_exists,player_exists,add_me,isLetter,create_match,delete_me,等待,不确定,刷新,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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-12
      • 2012-01-12
      • 2017-04-23
      • 1970-01-01
      • 2023-01-29
      • 1970-01-01
      • 1970-01-01
      • 2011-09-09
      相关资源
      最近更新 更多