2010-02-09 79 views
28

有沒有辦法檢索頁面上所有全局變量的名稱/值?在頁面中獲取所有(javascript)全局變量

我想編寫一個JavaScript函數來執行以下操作:

  1. 找到與「xxx_」前綴的全局變量和陣列中的堅持它們(例如)
  2. 使用建立一個查詢字符串名稱值對如下: xxx_glob_var1 =值& xxx_glob_var2 =數值等

我該怎麼辦呢?

+1

可能的重複(除了繁瑣的字符串構建部分)[Javascript - 轉儲所有全局變量](https://stackoverflow.com/questions/8369338/javascript-dumping-all-global-variables) – Bergi 2014-07-18 09:24:31

回答

27

事情是這樣的:

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" 
+0

太棒了!非常感謝 – 2010-02-09 08:42:23

+0

爲什麼InputEvent未列出('getGlobalProperties(「Input」)')?這是一個全球變量,對吧? – 2015-09-14 13:20:59

2

你可以做這樣的事情:

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

雖然這一點,你會得到一堆附加於窗額外的DOM屬性。

+3

'Object .keys(window);'顯示更少的額外的DOM屬性。 – 2014-02-26 08:40:47

+0

@DanDascalescu仍然超過200,所以當想要獲得僅由您的腳本創建的對象時無用 – Pawel 2016-09-20 09:37:39

3

在您可能希望找到非enumerable性能某些情況下;因此for..in將不起作用specabout 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.. 
25

或者你可以簡單地跑;

Object.keys(window); 

它會顯示一些額外的全局(〜5),但遠高於for (var i in window)答案少。

+0

鍵未定義。 – gsamaras 2015-09-13 19:17:25

+2

@gsamaras Object.keys可用於Chrome 5+,Firefox 4+,IE 9+和Opera 12+。 – 2016-02-08 19:40:00

+0

我看@ rink.attendant.6,謝謝。肉厚,你可能想添加到你的答案.. – gsamaras 2016-02-08 20:06:01

1

在我的情況下,兩個頂部的答案沒有工作,所以我加入了另一個答案,要突出達恩·達斯卡萊斯卡的評論:

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,SwaI位,sweetAlert,save_match,$身體,value_or_null,球員,p osition,能力,obj_need_save,xxx_saves,previousActiveElement

,球員,現在的位置,能力,obj_need_save,xx_saves是我的實際全局變量。


我剛纔看到存在類似answer的另一個問題。