在页面内的 div 中显示控制台错误和警报

IT技术 javascript browser
2021-03-17 15:16:03

我正在为我的 Web 应用程序构建一个调试工具,我需要在 div 中显示控制台错误。我知道我可以像对象一样使用我自己制作的控制台并使用它,但是为了将来使用,我需要将所有控制台错误发送到 window.console 。其实我想捕捉控制台事件。

6个回答

要保持控制台正常工作:

if (typeof console  != "undefined") 
    if (typeof console.log != 'undefined')
        console.olog = console.log;
    else
        console.olog = function() {};

console.log = function(message) {
    console.olog(message);
    $('#debugDiv').append('<p>' + message + '</p>');
};
console.error = console.debug = console.info =  console.log
只是认为检查!= "undefined"只是部分完成,后来我们console.log 无论如何分配给......
2021-04-21 15:16:03
对于此解决方案不起作用的人:您是否考虑过,由于此选择器,此解决方案需要 jQuery $('#debugDiv')尝试使用这样的东西:document.getElementById('debugDiv').innerHTML += ('<p>' + message + '</p>');
2021-05-03 15:16:03

这是一种使用闭包的方法,在新的范围内包含旧的控制台日志功能。

console.log = (function (old_function, div_log) { 
    return function (text) {
        old_function(text);
        div_log.value += text;
    };
} (console.log.bind(console), document.getElementById("error-log")));
这有效!但是通过使用 div_log.innerHTML += text + '<br />'; 会更清楚
2021-04-22 15:16:03
是的 textContent 看起来确实是今天使用的正确属性。Justin - 当您覆盖浏览器 API 时,通常您希望存储对该 API 的引用并调用该 API,因此您分配的新函数仍应调用旧函数console.errorconsole.log函数。如果您使用一个函数设置多个属性,我认为这是不可能的 - 将需要多个函数。
2021-04-28 15:16:03
添加console.error = console.log = (function...使我的工作出错。这也适用于其他console.[whatever]人。此外,@srgsanky 的更改也是我的工作所必需的。
2021-05-08 15:16:03
我通过使用它来工作 div_log.textContent += text;
2021-05-12 15:16:03

这里的答案都没有考虑传递多个参数的控制台消息。例如console.log("Error:", "error details"))。

替换默认日志函数的函数更好地考虑所有函数参数(例如,通过使用arguments对象)。下面是一个例子:

console.log = function() {
  log.textContent += Array.prototype.slice.call(arguments).join(' ');
}

Array.prototype.slice.call(...)简单地将arguments对象转换为数组,因此可以轻松地将其与 连接join()。)

当原始日志也应该保持工作时:

console.log = (function (old_log, log) { 
    return function () {
        log.textContent += Array.prototype.slice.call(arguments).join(' ');
        old_log.apply(console, arguments);
    };
} (console.log.bind(console), document.querySelector('#log')));
  

一个完整的解决方案:

var log = document.querySelector('#log');
['log','debug','info','warn','error'].forEach(function (verb) {
    console[verb] = (function (method, verb, log) {
        return function () {
            method.apply(console, arguments);
            var msg = document.createElement('div');
            msg.classList.add(verb);
            msg.textContent = verb + ': ' + Array.prototype.slice.call(arguments).join(' ');
            log.appendChild(msg);
        };
    })(console[verb], verb, log);
});

(发出带有多个参数的消息的框架的一个例子是 Video.js。但肯定还有很多其他的。)

编辑:多个参数的另一个用途是控制台的格式化功能(例如console.log("Status code: %d", code).

关于未显示的错误

(2021 年 12 月更新)

如果任何代码因未捕获的错误而崩溃,则 in 可能不会显示在 div 中。如果可能,一种解决方案是将所有代码包装在一个try块中以捕获此类错误并将它们手动记录到 div。

try {
    // Code that might throw errors...
} catch(err) {
    // Pass the error to the overridden error log handler
    console.error(err);
}
啊,我认为msg.textContent = verb + ' ' + JSON.stringify(Array.prototype.slice.call(arguments));有效。
2021-04-26 15:16:03
+1。这是一个比大多数人更深思熟虑的答案。但是如果你能以某种方式JSON.stringify()为每个输出结果会更好arguments,因为它们通常是对象。目前它只是输出[object Object],我还没有想出JSON.stringify()在你的代码中使用的位置。不过,谢谢你的开始。
2021-05-02 15:16:03
这是最接近我正在寻找的。虽然我仍然无法得到像 Uncaught ReferenceError、GET 错误或任何其他出现在控制台上的错误。有什么办法可以返回任何错误吗?
2021-05-17 15:16:03
我也花了一段时间才意识到我需要将您的代码放在 $(document).ready(function () { ... });
2021-05-20 15:16:03

否则,如果您担心保持logwarn并且error彼此分开,您可以做这样的事情(改编自 MST 的回答):

var log = document.querySelector('#log');

['log','warn','error'].forEach(function (verb) {
    console[verb] = (function (method, verb, log) {
        return function (text) {
            method(text);
            // handle distinguishing between methods any way you'd like
            var msg = document.createElement('code');
            msg.classList.add(verb);
            msg.textContent = verb + ': ' + text;
            log.appendChild(msg);
        };
    })(console[verb].bind(console), verb, log);
});

#log你的 HTML 元素在哪里变量verb是一个'log''warn''error'然后,您可以使用 CSS 以可区分的方式设置文本样式。请注意,此代码中有很多与旧版本的 IE 不兼容。

完美答案。我在 Codepen 中测试过
2021-05-06 15:16:03
这没有捕获仍发送到 Chrome Dev Tools 输出的任何错误。
2021-05-07 15:16:03
检查。本主题中的最佳控制台解决方案。
2021-05-21 15:16:03

像这样简单的事情怎么样:

console.log = function(message) {$('#debugDiv').append('<p>' + message + '</p>');};
console.error = console.debug = console.info =  console.log
这可能会发送硬编码在 JS 中的控制台消息,但它不会发送浏览器自己的错误。
2021-05-08 15:16:03
@AndrewPaul 我希望我知道。
2021-05-12 15:16:03
我投票赞成你的答案。这真的很聪明。但它导致实际控制台停止工作
2021-05-13 15:16:03
@DannyBeckett 仅使用 document.getElementById 进行编辑会比在 2011 年的答案中拖拽 -1s 更具建设性。
2021-05-19 15:16:03
@johnywhy - 我们如何访问浏览器自身的错误?
2021-05-20 15:16:03