Javascript中有没有办法获取列表或转储Javascript / jQuery脚本在页面上声明的所有全局变量的内容?我对数组特别感兴趣。如果我能得到阵列名称,那对我来说就足够了。看到它的价值是一个奖励。
答案 0 :(得分:44)
Object.keys( window );
这将为您提供window
对象的所有可枚举属性的数组(它们是全局变量)。
对于旧版浏览器,请添加the compatibility patch from MDN。
要查看其值,那么显然您只需要一个典型的枚举器,例如for-in
。
您应该注意我提到这些方法只会为您提供 可枚举的 属性。通常那些不是环境内置的那些。
可以在ES5支持的浏览器中添加不可枚举的属性。这些不会包含在Object.keys
中,也不会包含在for-in
语句中。
如@Raynos所述,您可以Object.getOwnPropertyNames( window )
获取非枚举。我不知道。谢谢@Raynos!
因此,要查看包含枚举的值,您需要执行此操作:
var keys = Object.getOwnPropertyNames( window ),
value;
for( var i = 0; i < keys.length; ++i ) {
value = window[ keys[ i ] ];
console.log( value );
}
答案 1 :(得分:4)
以下函数仅将添加的全局变量转储到窗口对象:
(function(){
//noprotect <- this comment prevents jsbin interference
var windowProps = function() {
// debugger;
var result = {};
for (var key in window) {
if (Object.prototype.hasOwnProperty.call(window, key)) {
if ((key|0) !== parseInt(key,10)) {
result[key] = 1;
}
}
}
window.usedVars = result;
};
var iframe = document.createElement('iframe');
iframe.style.display = 'none';
iframe.src = 'about:blank';
document.body.appendChild(iframe);
var fwin = iframe.contentWindow;
var fdoc = fwin.document;
fdoc.open('text/html','replace');
fdoc.write('<!DOCTYPE html><body><script>window.onload = ' + windowProps.toString() + '<\u002Fscript>');
fdoc.close();
var button = document.createElement('input');
button.type = 'button';
button.value = 'go';
document.body.appendChild(button);
button.onclick = function() {
var clean = fwin.usedVars;
windowProps();
var dirty = window.usedVars;
for (var key in clean) {
delete dirty[key];
}
for (var variable in dirty) {
var div = document.createElement('div');
div.textContent = variable;
document.body.appendChild(div);
}
document.body.removeChild(button);
document.body.removeChild(iframe);
};
})();
它通过使用iframe来获取全局窗口变量的干净列表,然后将其与当前窗口中的全局变量列表进行比较。它使用一个按钮,因为iframe是异步运行的。代码使用全局变量,因为这使代码更容易理解。
你可以看到它工作here或here,但请注意这些示例显示了jsbin本身“泄露”的许多全局变量(根据您使用的链接而不同)。
答案 2 :(得分:3)
由于所有全局变量都是window
对象的属性,因此可以使用以下命令获取它们:
for(var key in window) { // all properties
if(Array.isArray(window[key])) { // only arrays
console.log(key, window[key]); // log key + value
}
}
由于所有默认/继承属性都不是普通数组(主要是主机对象或函数),因此Array.isArray
检查就足够了。
答案 3 :(得分:1)
window
是浏览器中的全局对象,您可以使用for..in
循环来遍历其属性:
if(!Array.isArray) {
Array.isArray = function(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
};
}
for(var x in window) {
if(Array.isArray(window[x])) {
console.log('Found array ' + x + ' in ' + window + ', it has the value ' + window[x] + '!');
}
}
答案 4 :(得分:1)
答案 5 :(得分:0)
您可以使用名为get-globals的npm包。它将window
的属性与新创建的iframe
进行比较,以仅打印由dev(s)声明的变量,而不是浏览器供应商。
答案 6 :(得分:0)
Greasymonkey脚本获取泄露的全局
// ==UserScript==
// @name SCI
// @namespace ns
// @version 1
// @grant none
// @run-at document-start
// ==/UserScript==
console.log('SCI loaded');
var SCI = window.SCI = {
defprops: [],
collect: function(){
var wprops = [];
for(var prop in window){
wprops.push(prop);
}
return wprops;
},
collectDef: function(){
this.defprops = this.collect();
},
diff: function(){
var def = this.defprops,
cur = this.collect();
var dif = [];
for(var i = 0; i < cur.length; i++){
var p = cur[i];
if(def.indexOf(p) === -1){
dif.push(p);
}
}
return dif;
},
diffObj: function(){
var diff = this.diff();
var dobj = {};
for (var i = 0; i < diff.length; i++){
var p = diff[i];
dobj[p]=window[p];
}
return dobj;
}
};
SCI.collectDef();
使用在控制台SCI.diff()
中运行来获取名称列表,或使用SCI.diffObj()
来获取带变量的对象
答案 7 :(得分:0)
这是一个简单的,更现代的代码片段,该对象使用全局变量和(而不只是全局变量名称)记录对象,这通常是我在调试时要查找的内容: / p>
(function () {
const iframe = document.createElement('iframe')
iframe.setAttribute('hidden', '')
iframe.src = 'about:blank'
iframe.onload = function () {
// Iterate through the properties of the current `window` and reduce the output
// to only properties that are not in the iframe’s `window`.
console.debug(Object.entries(window).reduce((reducedObj, [property, value]) => {
// Check if the property does not exist in the iframe and if so, add it to
// the output object.
if (! (property in iframe.contentWindow))
reducedObj[property] = value
return reducedObj
}, {})))
// Clean up the iframe by removing it from the DOM.
iframe.remove()
}
// Append the iframe to the DOM to kick off loading.
document.body.append(iframe)
})()
提示:您也可以将'about:blank'
与window.location
交换,以仅获取自页面首次加载以来的全局设置。
这使用iframe来确定要忽略的属性,例如robocat’s answer,但它基于David Walsh’s solution。