Вход в консоль JavaScript Magento

У меня есть пользовательские phtml-страницы в Magento. Насколько я знаю, Magento использует библиотеки jQuery и прототипов.

Например, если мне нужен внешний jQuery/jQueryUI, мне нужно использовать .noConflict()

Но если я хочу использовать

console.log('Hello world');

В консоли Chrome 15 я не получил ответа, ничего. Также попробовал Firebug.

Очевидно, что существует некоторый конфликт с кодом JavaScript Magento. Есть ли какое-либо решение?

Ответ 1

Итак, в свете того, что я не хочу намазать этот сайт ненормативной лексикой, я просто скажу, что кто-то не думал в команде пурпурного, или каким-то образом какой-то дерьмовый код попал в живые релизы....

Если ваш console.log() не работает над установкой Magento, вероятно, из-за следующего:

В magento/js/varien/js.js @line ~ 636, Magento ver. 1.6.2.0

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

Это эффективно предотвращает работу console.log() в любом браузере, кроме firefox с firebug.

Чтобы защитить IE, конечно, но я думаю, что это неправильный способ получить arround, вместо этого люди должны знать, что они делают с их протоколированием, и сталкиваются с последствиями, когда они этого не делают.

Чтобы исправить это, просто убедитесь, что вы положили delete window['console']; (javascript), прежде чем пытаться выполнить console.log(), или если вы не возражаете против изменения основных файлов, удалите приведенный выше код.

Обратите внимание: удалите исправление консоли для производства, удаление не работает в IE6-8 и выдает ошибку

Ответ 2

Добавление этого обновления макета в app/design/frontend/default/default/layout/local.xml или тему app/design/frontend/default/default/layout/page.xml в дескрипторе <default> - это самый чистый и самый прямой способ добавить обратно консольный объект во все браузеры на всех страницах.

<default>
    <reference name="content">
        <block type="core/text" name="fix.console" as="fix.console">
            <action method="setText">
                <text><![CDATA[<script type="text/javascript">
                    iframe                  = document.createElement('iframe');
                    iframe.style.display    = 'none';
                    document.getElementsByTagName('body')[0].appendChild(iframe);
                    window.console          = iframe.contentWindow.console;
                    console.firebug         = "faketrue";                   
                </script>]]></text>
            </action>
        </block>
    </reference>
</default>

Ответ 3

В файле js.js есть этот код:

if (!("console" in window) || !("firebug" in console))
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

Итак, что он на самом деле делает, если консоль не является консолью firebug (в firefox), она деактивирует ее. Так что во встроенной консоли google chrome она не работает.

Существует 2 варианта: используйте firefox с firebug или удалите этот блок кода.

Ответ 5

Почему бы не проверить, сначала ли определен объект консоли?

Вместо:

if (!("console" in window) || !("firebug" in console))

Вы можете написать:

if( typeof console === 'undefined' )

Ответ 6

Все, что вам нужно сделать, прежде чем консоль регистрировать в первый раз на странице.

 delete window['console'];

Ответ 7

После сообщения AlexB я использовал эту работу.

var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;

if (!("console" in window) || !("firebug" in console) && !is_chrome)
{
    var names = ["log", "debug", "info", "warn", "error", "assert", "dir", "dirxml",
    "group", "groupEnd", "time", "timeEnd", "count", "trace", "profile", "profileEnd"];

    window.console = {};
    for (var i = 0; i < names.length; ++i)
        window.console[names[i]] = function() {}
}

Как вы можете видеть, is_chrome var возвращает true или false, добавив: is_chrome останавливает выполнение кода.

Ответ 8

Использование console.log() в браузерах с использованием Firebug 1.9.0+ с Magento до 1.6.2.0 завершится неудачно, потому что Magento проверяет свойство console.firebug, но это свойство было удален с Firebug 1.9.0 в целях конфиденциальности.

Смотрите файл js/varien/js.js:

if (!("console" in window) || !("firebug" in console))
{
    // :
}

Так как Magento 1.7.0.0 все это условие закомментировано, чтобы исправить эту (и другую) проблему (ы).

Ответ 9

Это больше не проблема с последней версией ядра Mage. Код, который разбивает console.log(), закомментирован. Я точно не знаю, в какой версии он был исправлен, но он исправлен с CE 1.7.0.2.