Відповіді:
Ще краще для резервного:
var alertFallback = true;
if (typeof console === "undefined" || typeof console.log === "undefined") {
console = {};
if (alertFallback) {
console.log = function(msg) {
alert(msg);
};
} else {
console.log = function() {};
}
}
console.log доступний лише після того, як ви відкрили Інструменти для розробників (F12, щоб увімкнути його відкритим і закритим). Найсмішніше, що після того, як ви відкрили його, ви можете його закрити, а потім все ще опублікувати на ньому через дзвінки console.log, і вони будуть помічені, коли ви його знову відкриєте. Я думаю, що це якась помилка, і може бути виправлена, але ми побачимо.
Я, мабуть, просто використаю щось подібне:
function trace(s) {
if ('console' in self && 'log' in console) console.log(s)
// the line below you might want to comment out, so it dies silent
// but nice for seeing when the console is available or not.
else alert(s)
}
і навіть простіше:
function trace(s) {
try { console.log(s) } catch (e) { alert(s) }
}
alert
є зло. Деякі коди поводяться по-різному, коли використовуються сповіщення, оскільки документ втрачає фокус, що робить помилки ще складніше діагностувати або створювати ті, де раніше не було. Крім того, якщо ви випадково залишите console.log
свій код у виробничому коді, він є доброякісним (якщо припустити, що він не підірветься) - просто мовчки ввійде до консолі. Якщо ви випадково залишите alert
свій код у виробництві, користувацький досвід знищується.
Це мій погляд на різні відповіді. Я хотів насправді побачити зареєстровані повідомлення, навіть якщо у мене не було відкрито консолі IE, коли вони були випущені, тому я натискаю їх на console.messages
масив, який я створюю. Я також додав функцію console.dump()
для полегшення перегляду всього журналу. console.clear()
буде порожньою чергою повідомлень.
Це рішення також "обробляє" інші методи консолі (які, на мою думку, походять з API консолі Firebug )
Нарешті, це рішення має форму IIFE , тому не забруднює глобальну сферу застосування. Аргумент резервної функції визначається внизу коду.
Я просто опускаю його у свій головний JS-файл, який міститься на кожній сторінці, і забуваю про нього.
(function (fallback) {
fallback = fallback || function () { };
// function to trap most of the console functions from the FireBug Console API.
var trap = function () {
// create an Array from the arguments Object
var args = Array.prototype.slice.call(arguments);
// console.raw captures the raw args, without converting toString
console.raw.push(args);
var message = args.join(' ');
console.messages.push(message);
fallback(message);
};
// redefine console
if (typeof console === 'undefined') {
console = {
messages: [],
raw: [],
dump: function() { return console.messages.join('\n'); },
log: trap,
debug: trap,
info: trap,
warn: trap,
error: trap,
assert: trap,
clear: function() {
console.messages.length = 0;
console.raw.length = 0 ;
},
dir: trap,
dirxml: trap,
trace: trap,
group: trap,
groupCollapsed: trap,
groupEnd: trap,
time: trap,
timeEnd: trap,
timeStamp: trap,
profile: trap,
profileEnd: trap,
count: trap,
exception: trap,
table: trap
};
}
})(null); // to define a fallback function, replace null with the name of the function (ex: alert)
Рядок var args = Array.prototype.slice.call(arguments);
створює масив з arguments
об’єкта. Це потрібно, тому що аргументи насправді не є масивом .
trap()
є обробником за замовчуванням для будь-якої з функцій API. Я передаю аргументи message
таким чином, щоб ви отримали журнал аргументів, переданих на будь-який виклик API (не тільки console.log
).
Я додав додатковий масив, console.raw
який фіксує аргументи точно так, як передано trap()
. Я зрозумів, що args.join(' ')
це перетворення об'єктів на рядок, "[object Object]"
що іноді може бути небажаним. Дякую bfontaine за пропозицію .
trap
функції var args = Array.prototype.slice.call(arguments); var message = args.join(' ');
:? Чому ви передаєте аргументи через це в повідомлення?
Варто зазначити, що console.log
в IE8 не є справжньою функцією Javascript. Він не підтримує apply
або call
методи.
console.log=Function.prototype.bind.call(console.log,console);
щоб обійти це.
bind
.
Якщо припустити, що вам не байдуже резервне сповіщення, ось ще більш стислий спосіб вирішити недоліки Internet Explorer:
var console=console||{"log":function(){}};
Мені дуже подобається підхід, опублікований "orange80". Це елегантно, тому що ви можете його встановити один раз і забути.
Інші підходи вимагають від вас зробити щось інше (називати щось інше, ніж просто console.log()
кожен раз ), що просто просить клопоту ... Я знаю, що врешті-решт забуду.
Я зробив це на крок далі, увімкнувши код у функцію утиліти, яку ви можете зателефонувати один раз на початку вашого javascript, де завгодно, доки це не відбудеться перед будь-яким журналом реєстрації. (Я встановлюю це в продукт маршрутизатора даних моєї компанії. Це допоможе спростити дизайн крос-браузера нового інтерфейсу адміністратора.)
/**
* Call once at beginning to ensure your app can safely call console.log() and
* console.dir(), even on browsers that don't support it. You may not get useful
* logging on those browers, but at least you won't generate errors.
*
* @param alertFallback - if 'true', all logs become alerts, if necessary.
* (not usually suitable for production)
*/
function fixConsole(alertFallback)
{
if (typeof console === "undefined")
{
console = {}; // define it if it doesn't exist already
}
if (typeof console.log === "undefined")
{
if (alertFallback) { console.log = function(msg) { alert(msg); }; }
else { console.log = function() {}; }
}
if (typeof console.dir === "undefined")
{
if (alertFallback)
{
// THIS COULD BE IMPROVED… maybe list all the object properties?
console.dir = function(obj) { alert("DIR: "+obj); };
}
else { console.dir = function() {}; }
}
}
/**/console.log("...");
тому легко знайти та знайти тимчасовий код.
Якщо ви отримаєте "невизначений" для всіх ваших викликів console.log, це, ймовірно, означає, що ви все ще маєте старий файл firebuglite (firebug.js). Він замінить усі дійсні функції console.log IE8, навіть якщо вони існують. Це все одно зі мною трапилось.
Перевірте інший код, що перевищує об'єкт консолі.
Найкраще рішення для будь-якого браузера, якому не вистачає консолі, є:
// Avoid `console` errors in browsers that lack a console.
(function() {
var method;
var noop = function () {};
var methods = [
'assert', 'clear', 'count', 'debug', 'dir', 'dirxml', 'error',
'exception', 'group', 'groupCollapsed', 'groupEnd', 'info', 'log',
'markTimeline', 'profile', 'profileEnd', 'table', 'time', 'timeEnd',
'timeStamp', 'trace', 'warn'
];
var length = methods.length;
var console = (window.console = window.console || {});
while (length--) {
method = methods[length];
// Only stub undefined methods.
if (!console[method]) {
console[method] = noop;
}
}
}());
Відповідей дуже багато. Моє рішення для цього було:
globalNamespace.globalArray = new Array();
if (typeof console === "undefined" || typeof console.log === "undefined") {
console = {};
console.log = function(message) {globalNamespace.globalArray.push(message)};
}
Якщо коротко, якщо console.log не існує (або в цьому випадку не відкрито), тоді зберігайте журнал у глобальному масиві просторів імен. Таким чином, ви не загрожуєте мільйонами сповіщень, і ви все одно можете переглядати свої журнали, відкриваючи або закриваючи консоль розробника.
якщо (window.console && 'function' === typeof window.console.log) { window.console.log (o); }
window.console.log()
може бути доступне в IE8 навіть тоді, коли console.log()
його немає?
typeof window.console.log === "object"
, що ні"function"
Я знайшов це на github :
// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function f() {
log.history = log.history || [];
log.history.push(arguments);
if (this.console) {
var args = arguments,
newarr;
args.callee = args.callee.caller;
newarr = [].slice.call(args);
if (typeof console.log === 'object') log.apply.call(console.log, console, newarr);
else console.log.apply(console, newarr);
}
};
// make it safe to use console.log always
(function(a) {
function b() {}
for (var c = "assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","), d; !! (d = c.pop());) {
a[d] = a[d] || b;
}
})(function() {
try {
console.log();
return window.console;
} catch(a) {
return (window.console = {});
}
} ());
Я використовую підхід Вальтера зверху (див. Https://stackoverflow.com/a/14246240/3076102 )
Я змішую рішення, яке я знайшов тут https://stackoverflow.com/a/7967670, щоб правильно показати об’єкти.
Це означає, що функція пастки стає:
function trap(){
if(debugging){
// create an Array from the arguments Object
var args = Array.prototype.slice.call(arguments);
// console.raw captures the raw args, without converting toString
console.raw.push(args);
var index;
for (index = 0; index < args.length; ++index) {
//fix for objects
if(typeof args[index] === 'object'){
args[index] = JSON.stringify(args[index],null,'\t').replace(/\n/g,'<br>').replace(/\t/g,' ');
}
}
var message = args.join(' ');
console.messages.push(message);
// instead of a fallback function we use the next few lines to output logs
// at the bottom of the page with jQuery
if($){
if($('#_console_log').length == 0) $('body').append($('<div />').attr('id', '_console_log'));
$('#_console_log').append(message).append($('<br />'));
}
}
}
Я сподіваюся, що це корисно :-)
Він працює в IE8. Відкрийте Інструменти для розробників IE8, натиснувши F12.
>>console.log('test')
LOG: test
Мені подобається цей метод (з використанням док-файлу jquery готовий) ... він дозволяє використовувати консоль навіть у т. Е. ... єдиним уловом є те, що вам потрібно перезавантажити сторінку, якщо ви відкриєте інструменти розробки, тобто розроблені сторінки ...
це може бути меншим за рахунок врахування всіх функцій, але я використовую лише журнал, тому це я роблю.
//one last double check against stray console.logs
$(document).ready(function (){
try {
console.log('testing for console in itcutils');
} catch (e) {
window.console = new (function (){ this.log = function (val) {
//do nothing
}})();
}
});
Ось версія, яка входитиме до консолі, коли інструменти розробника відкриті, а не коли вони закриті.
(function(window) {
var console = {};
console.log = function() {
if (window.console && (typeof window.console.log === 'function' || typeof window.console.log === 'object')) {
window.console.log.apply(window, arguments);
}
}
// Rest of your application here
})(window)
apply
методу.
Створіть власну консоль у html .... ;-) Це може бути додано, але ви можете почати з:
if (typeof console == "undefined" || typeof console.log === "undefined") {
var oDiv=document.createElement("div");
var attr = document.createAttribute('id'); attr.value = 'html-console';
oDiv.setAttributeNode(attr);
var style= document.createAttribute('style');
style.value = "overflow: auto; color: red; position: fixed; bottom:0; background-color: black; height: 200px; width: 100%; filter: alpha(opacity=80);";
oDiv.setAttributeNode(style);
var t = document.createElement("h3");
var tcontent = document.createTextNode('console');
t.appendChild(tcontent);
oDiv.appendChild(t);
document.body.appendChild(oDiv);
var htmlConsole = document.getElementById('html-console');
window.console = {
log: function(message) {
var p = document.createElement("p");
var content = document.createTextNode(message.toString());
p.appendChild(content);
htmlConsole.appendChild(p);
}
};
}
console.log
є в IE8, алеconsole
об'єкт не створюється, поки ви не відкриєте DevTools. Тому заклик доconsole.log
може призвести до помилки, наприклад, якщо це відбувається при завантаженні сторінки, перш ніж у вас є шанс відкрити інструменти розробки. Перемоги відповідь тут пояснює це більш докладно.