【问题标题】:How to override console.log如何覆盖 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) 是否有用。

标签: javascript jquery ios cordova


【解决方案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)
};

当你标记了问题,那么你也可以使用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,它就会发生变化(紧随其后)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2015-12-24
  • 2011-10-25
  • 2013-08-24
相关资源
最近更新 更多