【问题标题】:Show Elements when logging jQuery object in Chrome Dev Tools console?在 Chrome 开发工具控制台中记录 jQuery 对象时显示元素?
【发布时间】:2012-11-13 04:43:31
【问题描述】:

Chrome 开发工具最近似乎发生了一些变化。使用 console.log 记录一个 jQuery 对象,用于在控制台中显示 DOM 节点的元素。像这样的:

[<a href="#employees">Employees</a>]

现在它已经变成了这样的可点击对象:

[<a>, context: <a>]

有没有办法回到旧式的对象日志记录,或者甚至是一种不同的方法来调用console

我目前正在使用版本23.0.1271.64。不确定究竟是哪个版本带来了变化。

【问题讨论】:

  • 为我工作。哪个版本?
  • 版本 23.0.1271.64。我也不喜欢这些变化。此外,上下文菜单“在元素面板中显示”不显示。
  • 我的版本也是 23.0.1271.64。它显示了 DOM 节点,旁边有一个小箭头,里面有省略号。
  • 1) 转到 jquery.com 2) 打开控制台 3) 输入 $('h2')console.log($('h2'))。这将显示差异。
  • 您必须在控制台中手动运行console.log = inspect;,然后才能在代码中使用console.log。但是每次都这样做很痛苦……

标签: javascript jquery google-chrome google-chrome-devtools


【解决方案1】:

如果你想让 console.log() 输出 DOM 元素,你需要记录 DOM 元素而不是 jQuery 对象。 DOM 元素始终可以作为 jQuery 选择器的第 0 个元素访问。因此,您从 jQuery 选择器访问实际 DOM 元素的方式是这样的:

   $("#someSingleDOMObjectSelector")[0]

要让 DOM 元素以您希望的方式出现在日志中,您可以这样做:

   console.log($("#someSingleDOMObjectSelector")[0]);

对于包含/返回多个 DOM 元素的 jQuery 选择器,您可以循环它们,如下所示:

   $('.someMultipleDOMObjectSelector').each(function(){
           //console.log($(this)[0]); //or -->
           console.log(this);
   });

至于 Chrome 的开发工具为什么会这样做,我只能猜测是这样做的,因为将 jQuery 对象记录为对象更有意义。

【讨论】:

  • $(this)[0] 与仅使用this 相同时,您为什么要这样做?
  • 演示第 0 个元素的用法......你是对的。 this = $(this)[0]
  • .each(console.log) 也会给你索引,而且更短。
【解决方案2】:

我发现这很有帮助:

console.log.apply(console, $("a"));

另外,如果你从控制台内部运行console.log = inspect;,事情会以旧的方式输出,但如果你只是从你的代码中执行它就行不通,它必须来自控制台。

【讨论】:

  • inspect 的技巧似乎对我不起作用,但console.log.apply(console, $("a")); 很好。
  • @DavidTuite console.log=inspect 的东西只有在你直接输入控制台时才有效,并且只适用于之后从控制台触发的日志。一般来说,这不是一个很好的解决方案。.apply(console, 的东西更有帮助。
【解决方案3】:

Chrome 开发人员在 11 月 12 日打破了这一问题,直到今天的 Canary 仍未修复。

使用https://github.com/pimvdb/jquery.chromelog 恢复以前的行为作为解决方法。

语法略有不同:

$('a').log()

但它旨在反映 Chrome 的旧工作行为。

【讨论】:

    【解决方案4】:

    这是否回答了您的问题console.dir( element ) ..?


    更新:
    不要这样做

    console.dir( $("el") ); // Dont do this
    

    但是使用:

    console.dir( document.getElementById("el") ); // Do this
    

    【讨论】:

    • @darkajax 你没有按照我的意图解释我的回答;)
    • 没问题,但是 +1 有用吗? xD
    • 只记录如下内容:jQuery.fn.jQuery.init[1].
    • 我去了 jQuery.com 并在控制台console.dir( document.getElementById("jq-siteContain")) 中进行了尝试,它给了我你想要的东西。它没有给我初始化函数。不要使用 $("#el") 而是使用 document.getElementById(el)
    • @EricG 这是一个元素,而不是一个 JQuery 对象(有区别)。
    【解决方案5】:

    这似乎不会在最近的将来得到解决。 Chrome Canary 仍然有这个问题。 我喜欢带有对象预览的新控制台行为,但我希望 jQuery 对象例外。

    您可以“修补”console.log 一点点,使其像以前一样显示 jQuery 对象。 可以将 jQuery 对象“转换”为单独参数的列表。例如:

    $('div');
    

    在控制台中可以显示如下:

    console.log('[', div[0], div[1], ..., ']');
    

    我编写的脚本将只修改 jQuery 对象的 console.log 参数:

    (function(){
        var arraySlice = Array.prototype.slice;
        var originalFunction = console.log;
    
        var replaceObject = function(sourceArray, objectIndex) {
            var currentObject = sourceArray[objectIndex];
            var spliceArguments = Array.prototype.slice.apply(currentObject);
    
            if(currentObject.length) {
                // add commas and brackets
                for(var i = spliceArguments.length - 1; i > 0; i--) {
                    spliceArguments.splice(i, 0, ',');
                }
                spliceArguments.splice(0, 0, objectIndex, 1, '[');
                spliceArguments.splice(spliceArguments.length, 0, ']');
    
                // patch source array
                sourceArray.splice.apply(sourceArray, spliceArguments);
            } else {
                sourceArray.splice(objectIndex, 1, '[]');
            }
        };
    
        var fixFunction = function() {
        if(typeof jQuery === 'function' && jQuery.fn) {
            var newArgs = Array.prototype.slice.apply(arguments);
            for (var i = newArgs.length - 1; i >= 0; i--) {
                if(newArgs[i] instanceof jQuery) {
                    replaceObject(newArgs, i);
                }
            }
            originalFunction.apply(console, newArgs);
        } else {
            originalFunction.apply(console, arguments);
        }
        };
    
        fixFunction.toString = function() {
            return originalFunction.toString();
        };
    
        console.log = fixFunction;
    }())
    

    现在您可以在页面中包含此脚本以覆盖控制台行为,但这不是解决此问题的好方法,因此我将其封装在 Chrome Extension 中,它将自动为所有页面执行此操作。

    【讨论】:

      猜你喜欢
      • 2022-08-12
      • 2015-12-15
      • 2012-07-25
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-10-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多