IE8 中的 console.log 发生了什么?

IT技术 javascript logging internet-explorer-8 console
2021-01-13 23:22:29

根据这篇文章,它在测试版中,但不在发布中?

6个回答

console.log 仅在您打开开发人员工具后可用(F12 切换打开和关闭)。有趣的是,在你打开它之后,你可以关闭它,然后仍然通过 console.log 调用发布到它,当你重新打开它时会看到这些。我认为这是一个错误,可能会被修复,但我们会看到。

我可能只会使用这样的东西:

function trace(s) {
  if ('console' in self && 'log' in console) console.log(s)
  // the line below you might want to comment out, so it dies silent
  // but nice for seeing when the console is available or not.
  else alert(s)
}

甚至更简单:

function trace(s) {
  try { console.log(s) } catch (e) { alert(s) }
}
无论哪种方式,您都不应该盲目地调用 console.log,因为 $other-browsers 可能没有它,因此会因 JavaScript 错误而死。+1
2021-03-10 23:22:29
无论如何,您可能希望在发布之前关闭跟踪;)
2021-03-14 23:22:29
我想指出像这样包装 console.log 的一个缺点......你不会再看到你的日志记录来自哪里。我发现这有时非常有用,但最重要的是让每个控制台行都来自代码中的完全相同的位置,这看起来是错误的。
2021-03-24 23:22:29
在没有打开开发人员工具的情况下不要登录是有道理的,但是如果不是静默失败而是让它抛出异常才是真正令人困惑的决定。
2021-03-25 23:22:29
alert是邪恶的。使用警报时,某些代码的行为会有所不同,因为文档会失去焦点,从而使错误更难以诊断或创建以前没有的错误。此外,如果您不小心console.log在您的生产代码中留下 a ,它是良性的(假设它没有爆炸) - 只是默默地登录到控制台。如果你不小心alert在你的生产代码中留下了一个,用户体验就会被破坏。
2021-04-09 23:22:29

更好的回退是这样的:


   var alertFallback = true;
   if (typeof console === "undefined" || typeof console.log === "undefined") {
     console = {};
     if (alertFallback) {
         console.log = function(msg) {
              alert(msg);
         };
     } else {
         console.log = function() {};
     }
   }

请参阅对幸运先生回答的评论
2021-03-12 23:22:29
这太不切实际了——你怎么可能用每次调用 console.log() 时都会发出警报的东西来调试网站。如果您的代码中有 10 次以上对 log() 的调用怎么办。如果 msg 是一个对象呢?作为起点,沃尔特的回答更有意义。
2021-03-19 23:22:29
@Precastic:人们只会停止使用浏览器:P
2021-03-29 23:22:29
一个不显眼(虽然不完美)的替代方法是设置 document.title。至少它不会通过模式警报锁定浏览器。
2021-04-04 23:22:29

这是我对各种答案的看法。我想实际查看记录的消息,即使它们被触发时我没有打开 IE 控制台,所以我将它们推送到console.messages我创建数组中。我还添加了一个功能console.dump(),方便查看整个日志。console.clear()将清空消息队列。

该解决方案还“处理”了其他 Console 方法(我相信它们都源自Firebug Console API

最后,这个解决方案是一个IIFE的形式,所以它不会污染全局范围。回退函数参数在代码底部定义。

我只是将它放在我的主 JS 文件中,该文件包含在每个页面中,然后忘记它。

(function (fallback) {    

    fallback = fallback || function () { };

    // function to trap most of the console functions from the FireBug Console API. 
    var trap = function () {
        // create an Array from the arguments Object           
        var args = Array.prototype.slice.call(arguments);
        // console.raw captures the raw args, without converting toString
        console.raw.push(args);
        var message = args.join(' ');
        console.messages.push(message);
        fallback(message);
    };

    // redefine console
    if (typeof console === 'undefined') {
        console = {
            messages: [],
            raw: [],
            dump: function() { return console.messages.join('\n'); },
            log: trap,
            debug: trap,
            info: trap,
            warn: trap,
            error: trap,
            assert: trap,
            clear: function() { 
                  console.messages.length = 0; 
                  console.raw.length = 0 ;
            },
            dir: trap,
            dirxml: trap,
            trace: trap,
            group: trap,
            groupCollapsed: trap,
            groupEnd: trap,
            time: trap,
            timeEnd: trap,
            timeStamp: trap,
            profile: trap,
            profileEnd: trap,
            count: trap,
            exception: trap,
            table: trap
        };
    }

})(null); // to define a fallback function, replace null with the name of the function (ex: alert)

一些额外的信息

该行var args = Array.prototype.slice.call(arguments);arguments对象创建一个数组这是必需的,因为arguments 并不是真正的 Array

trap()是任何 API 函数的默认处理程序。我将参数传递给 ,message以便您获得传递给任何 API 调用(不仅仅是console.log的参数的日志

编辑

我添加了一个额外的数组console.raw,它完全按照传递给trap(). 我意识到args.join(' ')将对象转换为字符串"[object Object]",这有时可能是不可取的。感谢bfontaine建议

很好的答案。真的很喜欢你提到的 IIFE 文章,可能是我迄今为止读过的最好的文章之一。您能否详细说明这两行trap功能的目的是什么var args = Array.prototype.slice.call(arguments); var message = args.join(' ');为什么要通过 this 将参数传递给消息?
2021-03-11 23:22:29
我认为你的“console.clear()”函数的第二行应该是“console.raw.length = 0”,而不是“console.row.length = 0”。
2021-03-19 23:22:29
@user1555863 我已经更新了我的答案来回答您的问题,请参阅代码下方的部分。
2021-04-01 23:22:29
+1 这是唯一开始有意义的解决方案。在什么世界,你会不会想看到你明确地发送控制台消息!
2021-04-02 23:22:29

值得注意的是,console.log在 IE8 中并不是真正的 Javascript 函数。它不支持applyorcall方法。

[笑话] 微软说“让我们人们覆盖控制台对象对我们来说是不安全的”:/
2021-03-19 23:22:29
+1 这是我今天早上的确切错误。我正在尝试将参数应用于 console.log 并且 IE8 讨厌我。
2021-03-24 23:22:29
我一直在使用:console.log=Function.prototype.bind.call(console.log,console);来解决这个问题。
2021-04-01 23:22:29

假设您不关心警报的回退,这里有一种更简洁的方法来解决 Internet Explorer 的缺点:

var console=console||{"log":function(){}};
+1 由于我在匿名函数中确定代码的范围,因此将控制台放入这样的变量中对我来说是最好的解决方案。帮助我不干扰其他库中正在进行的任何其他控制台挂钩。
2021-03-12 23:22:29
一些 IE 插件定义了 console 和 console.log,但它们是空对象,而不是函数。
2021-03-12 23:22:29
您希望在开发人员工具打开后立即开始记录。如果您将此解决方案置于长期作用域中(例如,将内部函数注册为回调),它将继续使用静默回退。
2021-03-28 23:22:29
+1/-1 = 0: +1 因为解决方案应该更多地基于防止 console.logs 破坏 IE 中的站点 - 不用于调试......如果你想调试,只需点击 f12 并打开控制台: ) -1 因为您应该在覆盖它之前检查控制台是否存在。
2021-04-09 23:22:29