"取消重新定义"Google Chrome的控制台对象

Ala*_*orm 14 javascript google-chrome google-chrome-devtools

我正在处理一个系统,其中在页面的早期正在执行以下Javascript代码(这是我无法控制的)

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];
    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}
Run Code Online (Sandbox Code Playgroud)

此代码似乎用于创建模拟console对象,以防止在没有JavaScript控制台的环境中出现javascript错误.这很棒,但它也阻止了谷歌Chrome控制台的运行.条件firebug明确地检查,但就是这样

    if (!("console" in window) || !("firebug" in console))
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法告诉Chrome的调试器重新初始化其控制台对象?也就是说,用简单的英语告诉Chrome

嘿,你知道当你加载一个页面并定义一个控制台对象供我使用吗?再次这样做,以便我们可以覆盖用户空间中的某个人所做的事情.

我意识到我可以做类似的事情

console.firebug = "faketrue";
Run Code Online (Sandbox Code Playgroud)

并且条件被捕获,但我在系统中受到限制,并且在上述控制台重新定义命中之前没有办法添加javascript.换句话说,不,我不能只是在头部开始后添加一些javascript代码.

Jar*_*ish 17

我相信你可以使用iframe注入然后复制iframe的控制台对象:

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
</script>
<iframe id="text"></iframe>
<script type="text/javascript">
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
</script>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/nmY6k/

请注意,这只是该概念应该起作用的证明.

编辑

使用纯JS iframe:

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
</script>
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/nmY6k/1/

编辑

当然,如果您之后需要删除iframe元素:

<script type="text/javascript">
console = {};
try {
    console.log('1');
} catch(e){
    alert('No console');
}
var iframe = document.createElement('iframe');
document.body.appendChild(iframe);
console = window.frames[0].console;
try {
    console.log('test');
} catch(e){
    alert('No console');
}
console.log(typeof window.frames);
document.body.removeChild(iframe);
console.log(typeof window.frames);
</script>
Run Code Online (Sandbox Code Playgroud)