如何覆盖 console.log
Posted
技术标签:
【中文标题】如何覆盖 console.log【英文标题】:How to override console.log 【发布时间】:2013-08-12 15:03:38 【问题描述】:我正在使用以下代码覆盖console.log
函数,因为我只想在showConsole
返回true
时打印console.log
。
var proxyConsolelog = window.console.log;
console.log=function(msg)
try
if(Boolean(showConsole))
proxyConsolelog(msg);
catch(e)
alert(JSON.stringify(e.message));
proxyConsolelog('ERROR-->>'+e.message);
proxyConsolelog
行产生了问题,alert(JSON.stringify(e.message));
给了我一个“类型错误”。
我明白了:
void SendDelegateMessage(NSInvocation *): 委托 (webView:runjavascriptAlertPanelWithMessage:initiatedByFrame:) 失败 等待 10 秒后返回。主运行循环模式: kCFRunLoopDefaultMode
在日志中。
我怎样才能做到这一点?
【问题讨论】:
你试过proxyConsolelog.apply(console, arguments);
吗?
我不知道showConsole
是什么,但我怀疑Boolean(showConsole)
是否有用。
【参考方案1】:
您遇到的问题是您调用函数时的接收者 (this
) 不是控制台。
你可以这样做:
var proxyConsolelog = window.console.log.bind(window.console);
如果你需要兼容 IE8(没有bind
),你可以这样做:
var logFun = window.console.log;
var proxyConsolelog = function()
logFun.apply(window.console, arguments)
;
当你标记了问题jquery,那么你也可以使用proxy:
var proxyConsolelog = $.proxy(window.console.log, window.console);
一旦你有了你的新函数,你就可以像console.log
一样调用它:
proxyConsolelog('some', arg:'uments');
【讨论】:
感谢哥们工作得很好!你能告诉我这里的“一些”是什么吗 不过,如果要覆盖console.log
,您的 IE8 兼容方式将不起作用。 :) (考虑到这是 Cordova,也可以不提它。)
@minitech 哦,是的,我监督了最终目标,你说得对,谢谢。我已经编辑了。
@dystroy 也许是一个愚蠢的问题,但你最后一次编辑实际上做了什么?我想知道是否因为我没有使用 Cordova 的经验,所以我错过了一些明显的东西。但似乎你的最后一个编辑刚刚存储了对console.log
(并调用该)而不是直接调用console.log.apply
(当然,添加window.
)。老实说只是想知道
以前版本的问题是proxyConsolelog
动态引用window.console.log
。因此,只要您更改 window.console.log
,它就会发生变化(紧随其后)。以上是关于如何覆盖 console.log的主要内容,如果未能解决你的问题,请参考以下文章