检测窗口控制台存在的正确方法是什么



我有这段代码:

            var has_logger = (window.console && window.console.log);
            if (has_logger) {
                window.console.log(data);
            }

has_logger,不是布尔值,而是初始化为函数对象(function log() { [native code] }

我的问题:

  • 无需在现代浏览器中测试控制台.log对吗?

  • has_logger初始化为布尔值而不是函数对象的正确方法是什么?

如果未启用 Firebug,如果您不检查,Firefox 将抛出错误。

var has_logger = !!(window.console && window.console.log);

将永远是布尔值。

是的,这是一种非常好的测试方法,是的,你必须测试。请注意,您的has_logger变量实际上以对该函数的引用结束,因此您可以使用 Amadan 所说的双爆炸将其转换为布尔值。

不过,要注意IE9在console.log周围的奇怪行为。

但是,如果您希望您的代码在浏览器以外的其他 JavaScript 环境中工作,您可以使用以下内容:

has_logger = typeof console === "object" && console.log;

您可以安全地测试自由引用的类型,即使它未定义。这将适用于浏览器(您有window)和其他环境(您没有)。

通常,

当控制台.log功能在其他浏览器中不存在时,我仍然希望将结果输出到某处。而不是每次我想写入日志时都有一个 if 语句,而是创建了以下 javascript 位,当 window 对象尚不存在时,它会向 window 对象添加一个控制台.log方法。这意味着在我的代码中,无论我想在哪里使用控制台.log我都可以这样做,而不必担心它在其他浏览器中会中断。

(function () {
        if (typeof window.console !== "object")
            window.console = {
                log: function (message) {
                    // Write the message somewhere in browsers that don't support console.log
                }
            };
    } ());

由于我使用 jQuery,因此我使用以下方法将每条消息写入div。

$(function () {
    (function () {
        if (typeof window.console !== "object")
            window.console = {
                log: function (message) {
                    $('<div>' + message + '</div>').appendTo('#consoleArea');
                }
            };
        } ());
});

Firefox 3.6 及更早版本没有window.console 。 我不知道你会把它算作现代的。

对于你的第二个问题,JavaScript 中的 && 运算符不返回布尔值;它返回其左侧表达式(如果它是 falsy)或右侧表达式(如果左侧不是 falsy)。 如果您出于某种原因确实想要布尔值,请使用 !!(whatever-value)

所有人都会给你一个布尔值:

var has_logger = (window.console && window.console.log) ? true : false;
var has_logger = new Boolean(window.console && window.console.log);
var has_logger = !!(window.console && window.console.log);
这是我最近想出的,试图

真正完全防弹......我希望你们能告诉我,如果我错过了什么。它似乎可以防止引用错误,除非日志是一个函数,否则它是假的。如果有人将其他函数附加到 window.console.log则会引发错误,那么对此无能为力。

var hasLog = !!("console" in window && 
                window.console && 
                "log" in window.console && 
                window.console.log && 
                typeof window.console.log == 'function')

我读完后想出了这个 https://stackoverflow.com/a/3390426/1172174

相关内容

最新更新