Я использую Firebug и у меня есть несколько утверждений, таких как:
console.log("...");
на моей странице. В IE8 (возможно, и в более ранних версиях) я получаю ошибки скрипта, говорящие, что «console» не определена. Я попытался поместить это вверху моей страницы:
<script type="text/javascript">
if (!console) console = {log: function() {}};
</script>
все еще я получаю ошибки. Есть ли способ избавиться от ошибок?
typeof
в вашем if, это позволит избежать неопределенных ошибок:if(typeof console === "undefined") { var console = { log: function (logMsg) { } }; }
Ответы:
Пытаться
На неопределенную переменную нельзя ссылаться напрямую. Однако все глобальные переменные являются атрибутами одного и того же имени глобального контекста (
window
в случае браузеров), и доступ к неопределенному атрибуту - это нормально.Или используйте,
if (typeof console === 'undefined') console = ...
если хотите избежать магической переменнойwindow
, см. Ответ @Tim Down .источник
<script type="text/javascript"> if (!window.console) console = {log: function() {}}; </script>
вверху страницы! Спасибо Кенни.var console = console || { log: function() {} };
window
:var console = window.console || { log: function() {} };
Вставьте следующее в верхней части вашего JavaScript (перед использованием консоли):
Оболочка закрытия функции предназначена для охвата переменных, чтобы не определять никаких переменных. Это защищает как от неопределенных, так
console
и от неопределенныхconsole.debug
(и других отсутствующих методов).РЕДАКТИРОВАТЬ: я заметил, что HTML5 Boilerplate использует аналогичный код в своем файле js / plugins.js, если вы ищете решение, которое (вероятно) будет обновляться.
источник
Другой альтернативой является
typeof
оператор:Еще одна альтернатива - использовать библиотеку журналов, такую как мой собственный log4javascript .
источник
var
? Это только запутает вещи здесь. Или ты имеешь в виду присвоение,window.console
а неconsole
?var
. С чего бы это здесь путать?typeof
гарантированно возвращает строку и"undefined"
является строкой. Когда два операнда имеют одинаковый тип==
и===
определены для выполнения точно одинаковых шагов. Использованиеtypeof x == "undefined"
- это надежный способ проверить,x
не определено ли значение в любой области и в любой среде, совместимой с ECMAScript 3.Для более надежного решения используйте этот фрагмент кода (взят из исходного кода Twitter):
источник
В моих сценариях я использую сокращение:
или, если невозможно или невозможно отредактировать каждую строку console.log, я создаю поддельную консоль:
источник
if(!console) {console = {} ; console.log = function(){};}
!window.console && (window.console = { log: function () { } });
Вы можете использовать,
console.log()
если у васDeveloper Tools
открыт в IE8, а также вы можете использоватьConsole
текстовое поле на вкладке скрипта.источник
источник
this
относитсяwindow
.На основании двух предыдущих ответов
и документация для
Вот лучшая реализация этой проблемы, означающая, что если существует console.log, который действительно существует, он заполняет пробелы для несуществующих методов через console.log.
Например, для IE6 / 7 вы можете заменить ведение журнала предупреждением (глупо, но работает), а затем включить нижеприведенного монстра (я назвал его console.js): [Не стесняйтесь удалять комментарии, как считаете нужным, я оставил их для справки, минимизатор может справиться с ними]:
и console.js:
источник
methods.hasOwnProperty(method) &&
в цикле for.> x = { a: 1, b: 2}
->Object {a: 1, b: 2}
иfor(var f in x) {console.log(f + " " + x[f]);} 'end'
->a 1 b 2 "end"
. Таким образом, созданный анонимный объект не имеет никакого дополнительного свойства иmethods
просто создается передfor
циклом. Возможно ли взломать вышесказанное?var x = { a: 1, b: 2}; Object.prototype.surprise = 'I\'m in yer objectz'; for (var f in x) {console.log(f, x[f]);}
Вы никогда не знаете, что библиотека сделала с объектами в цепочке наследования объекта, с которым вы работаете. Таким образом, рекомендуется использовать такие инструменты качества кода javascript, как jshint и jslinthasOwnProperty
.В IE9, если консоль не открыта, этот код:
покажет "объект", но этот код
вызовет исключение TypeError, но не вернет неопределенное значение;
Итак, гарантированная версия кода будет выглядеть примерно так:
источник
Я использую только console.log в моем коде. Так что я включаю очень короткий 2 лайнер
источник
Заметил, что OP использует Firebug с IE, поэтому предположим, что это Firebug Lite . Это забавная ситуация, поскольку консоль определяется в IE при открытии окна отладчика, но что происходит, когда Firebug уже запущен? Не уверен, но, возможно, метод firebugx.js может быть хорошим способом для тестирования в этой ситуации:
источник:
https://code.google.com/p/fbug/source/browse/branches/firebug1.2/lite/firebugx.js?r=187
(обновленные ссылки 12/2014)
источник
Я использую fauxconsole ; Я немного изменил CSS, чтобы он выглядел лучше, но работает очень хорошо.
источник
Для отладки в IE, проверьте этот log4javascript
источник
Для IE8 или поддержки консоли, ограниченной console.log (без отладки, трассировки, ...), вы можете сделать следующее:
Если console ИЛИ console.log не определено: создайте фиктивные функции для функций консоли (trace, debug, log, ...)
window.console = { debug : function() {}, ...};
Иначе, если console.log определен (IE8) И console.debug (любой другой) не определен: перенаправьте все функции ведения журнала в console.log, это позволяет сохранить эти журналы!
window.console = { debug : window.console.log, ...};
Не уверен насчет поддержки assert в различных версиях IE, но любые предложения приветствуются. Также опубликовал этот ответ здесь: Как я могу использовать консольное ведение журнала в Internet Explorer?
источник
источник
Заглушка консоли в TypeScript:
источник
Вы можете использовать нижеприведенную форму, чтобы получить дополнительную степень страховки, покрывающую все базы. Использование
typeof
first позволит избежать любыхundefined
ошибок. Использование===
также гарантирует, что имя типа на самом деле является строкой «undefined». Наконец, вы захотите добавить параметр в сигнатуру функции (я выбралlogMsg
произвольно) для обеспечения согласованности, поскольку вы передаете все, что вы хотите, в консоль, функции журнала. Это также обеспечивает точность ваших сведений и позволяет избежать любых предупреждений / ошибок в вашей IDE-осведомленной среде JS.источник
Иногда консоль работает в IE8 / 9, но в других случаях происходит сбой. Такое непредсказуемое поведение зависит от того, открыты ли у вас инструменты разработчика, и описано в вопросе stackoverflow. Поддерживает ли IE9 console.log и является ли это реальной функцией?
источник
Обнаружена похожая проблема при запуске console.log в дочерних окнах IE9, созданного функцией window.open.
Кажется, что в этом случае консоль определяется только в родительском окне и не определяется в дочерних окнах, пока вы не обновите их. То же относится и к детям дочерних окон.
Я имею дело с этой проблемой, оборачивая журнал в следующую функцию (ниже фрагмент модуля)
источник
После того, как у меня возникло так много проблем (трудно отладить ошибку, так как, если вы откроете консоль разработчика, ошибка больше не произойдет!), Я решил создать избыточный код, чтобы никогда больше не беспокоиться об этом:
Лично я использую только console.log и console.error, но этот код обрабатывает все остальные функции, как показано в сети разработчиков Mozzila: https://developer.mozilla.org/en-US/docs/Web/API/console , Просто поместите этот код в верхней части вашей страницы, и вы закончите с этим навсегда.
источник
Вы можете использовать console.log (...) напрямую в Firefox, но не в IE. В IE вы должны использовать window.console.
источник