覆盖后访问window.console

时间:2011-08-16 16:19:08

标签: javascript console

是否有可能在覆盖后以某种方式访问​​console.log?

window.console = { log: function (msg) { alert(msg); }, /* etc... */ };

是否有可能重新获得原始的console.log功能?

4 个答案:

答案 0 :(得分:18)

您可以在覆盖之前备份控制台。

var oldConsole = window.console;
window.console = { log:function(msg){alert(msg)} //...};

然后您可以使用oldConsole变量。

oldConsole.log('test');

如果你无法备份,你可以创建一个iFrame,然后从那里窃取控制台(这可能不适用于所有浏览器):

var i = document.createElement('iframe');
i.style.display = 'none';
document.body.appendChild(i);
window.console = i.contentWindow.console;

演示:http://jsfiddle.net/jcG7E/2

答案 1 :(得分:5)

编辑(2017-04-08):此建议已过时,在Firefox 52中,Chrome 57 console不再在窗口原型上定义,删除它会真正删除它


至少使用Firefox和Chrome定义的console对象,您只需删除覆盖的属性即可恢复原始属性:

window.console = {};
delete window.console;
window.console.log("This works!");

这就像在console对象的原型上定义window属性一样 - 除了它不是,浏览器在这里做了一些魔术。

答案 2 :(得分:0)

这是不可能的。除非覆盖它的人包含了一些代码来撤消它。

答案 3 :(得分:0)

var customLog = {
    oriLog: '',
    Log: function(){
        // create string to display
        var displaystring = '';
        for (var i = 0, len = arguments.length; i < len; i++) {
            displaystring += arguments[i];
            if (i + 1 != len) 
                displaystring += ', ';
        }
        alert(displaystring);
        customLog.oriLog(arguments);
    }
}
window.onload = function(){
    if (console != null) {
        customLog.oriLog = console.log;
        console.log = customLog.Log;
    }

}