Показать элементы при регистрации объекта jQuery в консоли Chrome Dev Tools?

Кажется, что что-то изменилось в последнее время с помощью Chrome Dev Tools. Ведение журнала объекта jQuery с помощью console.log, используемого для отображения элемента DOM node в консоли. Что-то вроде этого:

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

Теперь он изменился на кликабельный объект, подобный этому:

[<a>, context: <a>]

Есть ли способ вернуться к старому стилю регистрации объектов или даже к другому методу вызова console?

В настоящее время я использую версию 23.0.1271.64. Не уверен, какая версия принесла изменения.

Ответ 1

Если вы хотите, чтобы console.log() выплевывал элемент DOM, вам необходимо зарегистрировать элемент DOM, а не объект jQuery. Элемент DOM всегда доступен как 0-й элемент селектора jQuery. Таким образом, способ доступа к фактическому элементу DOM из селектора jQuery выглядит следующим образом:

   $("#someSingleDOMObjectSelector")[0]

И чтобы элемент DOM появился в журнале так, как вам хотелось бы, вы бы сделали следующее:

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

И для селекторов jQuery, которые содержат/возвращают несколько элементов DOM, вы можете их закодировать следующим образом:

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

Что касается того, почему инструменты Chrome dev делают это, я могу только догадываться, что это сделано, потому что имеет смысл записывать объект jQuery в качестве объекта.

Ответ 2

Я нашел это полезным:

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

Кроме того, если вы запустите console.log = inspect; внутри консоли, все будет выводить старый путь, но это не сработает, если вы просто сделаете это из своего кода, это должно быть из консоли.

Ответ 3

Это было нарушено разработчиками Chrome 12 ноября и не было исправлено с Canary сегодня.

Используйте https://github.com/pimvdb/jquery.chromelog, чтобы восстановить предыдущее поведение в качестве обходного пути.

Синтаксис несколько отличается:

$('a').log()

Но он предназначен для отражения старого, рабочего поведения Chrome.

Ответ 4

Отвечает ли это на ваш вопрос console.dir( element )..?


Update:
Не делайте этого

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

Но используйте:

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

Ответ 5

Похоже, что это не будет исправлено в ближайшем будущем. У Chrome Canary все еще есть эта проблема. Мне нравится новое поведение консоли с предварительным просмотром объектов, но я хочу исключение для объектов jQuery.

Вы можете немного "запланировать" console.log, чтобы он отображал объекты jQuery, как раньше. Возможно "преобразовать" объекты jQuery в список отдельных аргументов. Например:

$('div');

В консоли может отображаться как:

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

Я написал script, который будет изменять аргументы console.log только для объектов jQuery:

(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;
}())

Теперь вы можете включить этот script на своей странице, чтобы переопределить поведение консоли, но это не очень хороший способ устранить эту проблему, поэтому я обернул это в Расширение Chrome, которое будет делать это автоматически для всех страниц.