“取消定义” Google Chrome浏览器的控制台对象

|| 我正在处理一个系统,该系统在页面的早期执行了以下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() {}
}
该代码似乎用于创建模拟“ 1”对象,以防止在没有JavaScript控制台的环境中出现javascript错误。这很不错,除了它还会阻止Google Chrome浏览器的控制台运行。有条件地检查
firebug
,仅此而已
    if (!(\"console\" in window) || !(\"firebug\" in console))
因此,有没有办法告诉Chrome的调试器重新初始化其控制台对象?也就是说,用简单的英语告诉Chrome   嘿,您知道何时加载页面并定义供我使用的控制台对象吗?再次执行此操作,以便我们可以覆盖用户空间中某人所做的事情。 我意识到我可以做类似的事情
console.firebug = \"faketrue\";
并捕获了条件,但我在系统中受到限制,并且在上述控制台重新定义命中之前没有办法添加JavaScript。换句话说,不,我不能只是在脑袋开始之后添加一些JavaScript代码。     
已邀请:
我相信您可以通过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>
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>
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>
    
在Google Chrome浏览器中,删除“ 1”对象有效:
<script>
window.console = {};
delete console;
console.log(\'still works\');
</script>
但是,这似乎在Firefox 4中不起作用。不过,这只是一个开始。     
这似乎可行:
iframe = document.createElement(\'iframe\');
document.body.appendChild(iframe);
console = iframe.contentWindow.console;
但是,您似乎无法删除iframe     
您可以编写一个非常基本的用户脚本来分配控制台,如上所述。然后进入该用户脚本的manifest.json,并将run_at设置(请参阅http://code.google.com/chrome/extensions/content_scripts.html)更改为document_start。这将使用户脚本现在在任何页面脚本运行之前运行,因此在控制台被弄乱之前。 ...编辑... 实际上,我从http://blog.chromium.org/2011/07/chrome-extensions-now-with-more.html注意到chrome现在也支持@ run-at,因此您可以进行设置,而不必甚至不必直接与manifest.json搞混。他们在http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/howto/userto-userscript-runat/runat.user的document_start上使用@ run-at编写了一个示例脚本。 .js?view = markup     
您不能将自己的脚本直接放在顶部的html头中吗?
<script ...>
    if (console) { window.cache_console = console; }
</script>
</head>
<body>
... html ...

<script>
    window.console = window.cache_console;
</script>
</body>
</html>
您不可能比在HEAD中早得多。     
假设您担心的原因是要在开发过程中正常使用控制台,则可以启动一个简单的chrome扩展程序,该扩展程序定义console.firebug,以便条件评估为false。这样,您就不必担心使用其他框架的控制台对象可能引起的任何潜在的古怪行为,也不必担心在开发/部署时反复插入和删除hack。     
这是我根据之前的答案写的一种方法。它具有一些额外的逻辑,因此您可以多次调用它而无需重新创建iframe。
function fixConsole() {

    var iframe;
    if(!(iframe = document.getElementById(\'fixConsole\'))) {
        iframe = document.createElement(\'iframe\');
        iframe.id = \'fixConsole\';
        document.body.appendChild(iframe);
    }
    delete console;    
    console = iframe.contentWindow.console;

};
如果原先重新定义“ 1”的代码是自修复的,我预计需要多次调用“ 13”。     

要回复问题请先登录注册