"取消重新定义“;谷歌浏览器's控制台对象
"Un-redefining" Google Chrome's console Object
我正在处理一个系统,在该系统中,以下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() {}
}
这段代码似乎用于创建一个模拟console
对象,以防止在没有javascript控制台的环境中出现javascript错误。这是伟大的,除了它还阻止谷歌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中,删除console
对象有效:
<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.htmlchrome现在也支持@run-at,所以您可以设置它,甚至不必直接使用manifest.json。他们有一个使用@run at的示例脚本,位于document_starthttp://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/howto/userscript-runat/runat.user.js?view=markup
你不能把你自己的脚本直接放在html的顶部吗?
<script ...>
if (console) { window.cache_console = console; }
</script>
</head>
<body>
... html ...
<script>
window.console = window.cache_console;
</script>
</body>
</html>
你不可能比头脑清醒来得更早。
假设你担心的原因是你想在开发时正常使用控制台,你可以创建一个简单的chrome扩展,定义console.firebug,这样条件就会被评估为false。这样,您就不必担心使用其他框架的控制台对象可能会产生任何潜在的古怪行为,也不必担心在开发/部署时重复插入和删除黑客。
下面是我根据前面的答案编写的一个方法。它有一些额外的逻辑,因此您可以多次调用它,而无需重新创建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;
};
我预计,在最初重新定义console
的代码是自修复的情况下,需要多次调用fixConsole
。
- 为什么可以't我在谷歌浏览器中返回cookie
- 谷歌浏览器没有阅读Jsfidle程序
- 从AngularJs获取谷歌地图对象的正确方法是什么
- Javascript字母选择没有'我不能在谷歌浏览器上工作
- 我的时间倒计时脚本在谷歌浏览器中工作正常,但在其他浏览器中打开时它显示为南楠
- 列出谷歌浏览器中安装的所有扩展程序
- 谷歌浏览器模式正则表达式在使用setCustomValidity动态创建表单时不起作用
- 谷歌浏览器扩展程序画布图标
- 谷歌浏览器控制台,打印图像
- 为什么我的谷歌浏览器扩展程序在谷歌浏览器版本 41.0.2272.89 中不起作用
- 多个 socket.io 客户端连接不起作用(谷歌浏览器,火狐浏览器)
- 对象在谷歌浏览器中没有方法“焦点”
- 谷歌地图API v3自定义光标在谷歌浏览器中的热点
- 我们如何在谷歌浏览器的每个页面上打印表格标题
- 热门访问谷歌地图对象以获取LatLngToPoint
- 谷歌浏览器中的getUserMedia
- "取消重新定义“;谷歌浏览器's控制台对象
- 谷歌浏览器也有一个控制台对象.其中是其等效的 API 页面
- 谷歌浏览器扩展 - Javascript Map() 对象中项目的生存期
- 是否有任何工具/技巧/插件可以帮助我计算谷歌浏览器本身的 JSON URL 中的对象数量