【问题标题】:Proxy all console outputs [logs, error, warning, etc] into HTML将所有控制台输出 [日志、错误、警告等] 代理到 HTML
【发布时间】:2020-01-15 18:04:20
【问题描述】:

我正在寻找一种解决方案,将我在控制台中看到的内容打印到 HTML 中的 div 元素中。 我正在将 Web 技术开发成电视,因此没有提供浏览器工具。 我找到了这个解决方案:

(function () {
    if (!console) {
        console = {};
    }
    var old = console.log;
    var logger = document.getElementById('log');
    console.log = function (message) {
        if (typeof message == 'object') {
            logger.innerHTML += 'LOG: ' + (JSON && JSON.stringify ? JSON.stringify(message) : String(message)) + '<br />';
        } else {
            logger.innerHTML += 'LOG: ' + message + '<br />';
        }
    }
    console.error = function (message) {
        if (typeof message == 'object') {
            logger.innerHTML += 'ERROR: ' + (JSON && JSON.stringify ? JSON.stringify(message) : String(message)) + '<br />';
        } else {
            logger.innerHTML += 'ERROR: ' + message + '<br />';
        }
    }
    console.warn = function (message) {
        if (typeof message == 'object') {
            logger.innerHTML += 'WARN: ' + (JSON && JSON.stringify ? JSON.stringify(message) : String(message)) + '<br />';
        } else {
            logger.innerHTML += 'WARN: ' + message + '<br />';
        }
    }
})();

但我需要一个更强大的解决方案来打印控制台的所有内容,而不仅仅是通过这三个函数传递的内容。 这可以通过 ES5 JavaScript 实现吗?

【问题讨论】:

  • 如果您覆盖应该影响所有内容的window.console.whatevermethod,前提是它们不会在 IIFE 中捕获这些方法
  • @Taplar 我已经测试了这个解决方案,它可以工作,但不是控制台输出中的所有信息都是日志、警告或错误,并且由 Javascript 提供。有时浏览器本身会记录信息,或者一般来说控制台对象有几种方法。

标签: javascript debugging console smart-tv


【解决方案1】:

您可以使用 lodash 函数 _.functions 并包装所有 console.methods

_.functions(console).forEach(function (methodName) {
var oldMethodName = console[methodName];
console[methodName] = function (message) {
    if (typeof message == 'object') {
        logger.innerHTML += methodName + ' : ' + (JSON && JSON.stringify ? JSON.stringify(message) : String(message)) + '<br />';
    } else {
        logger.innerHTML += methodName + ' : ' + message + '<br />';
    }
    return oldMethodName.call(console, arguments)
}
})

我还建议将onError 侦听器添加到窗口并重新定义setTimeout 以从中获取错误。

【讨论】:

  • 代理是个好东西。但它不适用于大多数智能电视
  • 你能用 MDN 之类的兼容性表演示吗?
  • 没有。请记住,netcast(2011-2014 年的旧 lg)和 orsai(旧三星)不支持它们。但是有一个代理 polyfill 可以导入和使用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-27
  • 2019-08-05
相关资源
最近更新 更多