有没有办法检索页面上所有全局变量的名称/值?
我想编写一个 javascript 函数来执行以下操作:
- 找到所有以 'xxx_' 为前缀的全局变量并将它们粘贴在一个数组中(例如)
- 使用名称值对构建查询字符串,如下所示:xxx_glob_var1=value1&xxx_glob_var2=value2 等
我该怎么做呢?
有没有办法检索页面上所有全局变量的名称/值?
我想编写一个 javascript 函数来执行以下操作:
我该怎么做呢?
或者你可以简单地运行;
Object.keys(window);
它将显示一些额外的全局变量 (~5),但远少于for (var i in window)
答案。
Object.keys 在 Chrome 5+、Firefox 4+、IE 9+ 和 Opera 12 中可用,ty @rink.attendant.6
像这样的东西:
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"
在某些情况下,您可能希望找到不可枚举的属性;因此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..
那么如果你想加入例如
findPrefixed('webkit').map(function (e) {return e+'='+window[e];}).join('&');
// "webkitAudioContext=function AudioContext() { [native code] }&webkitRTCPeerConnection=function RTCPeerConnection() etc..
你可以这样做:
for (var i in window) {
// i is the variable name
// window[i] is the value of the variable
}
尽管如此,你会得到一堆附加到 window.DOM 的额外 DOM 属性。
就我而言,两个最重要的答案不起作用,因此我添加了另一个答案,以突出 Dan Dascalescu 的评论:
Object.keys(window);
当我执行它时,它给出了:
顶部,位置,文档,窗口,外部,镀铬,$,jQuery,matchMedia,jQuery1113010234049730934203,match_exists,player_exists,add_me,isLetter,create_match,delete_me,等待,不确定,刷新,delete_match,jsfunction,check,update_global 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 是我的实际全局变量。
我刚刚看到另一个问题有类似的答案。