Перехватить вызовы в console.log в Chrome.
У меня есть script, который я не могу изменить, что вызывает много вызовов console.log. Я хочу добавить еще один слой и ответить, если вызовы содержат определенные строки. Это работает в FF, но в 4-й строке в Chrome появляется ошибка "Недействительный вызов":
var oldConsole = {};
oldConsole.log = console.log;
console.log = function (arg) {
oldConsole.log('MY CONSOLE!!');
oldConsole.log(arg);
}
Любые идеи, как обойти это? Я также попытался клонировать консоль...
Ответы
Ответ 1
Вам нужно позвонить console.log
в контексте console
для chrome:
(function () {
var log = console.log;
console.log = function () {
log.call(this, 'My Console!!!');
log.apply(this, Array.prototype.slice.call(arguments));
};
}());
Ответ 2
Вы также можете использовать ту же логику, но вызывать ее от объекта консоли, чтобы контекст был одним и тем же.
if(window.console){
console.yo = console.log;
console.log = function(str){
console.yo('MY CONSOLE!!');
console.yo(str);
}
}
Ответ 3
С новым оператором распространения ES6 вы можете написать его так:
(function () {
var log = console.log;
console.log = function () {
log.call(this, 'My Console!!!', ...arguments);
};
}());
Ответ 4
Я знаю, что это старый пост, но он может быть полезен, так как другие решения не совместимы со старыми браузерами.
Вы можете переопределить поведение каждой функции консоли (и всех браузеров) следующим образом:
// define a new console
var console = (function(oldCons){
return {
log: function(text){
oldCons.log(text);
// Your code
},
info: function (text) {
oldCons.info(text);
// Your code
},
warn: function (text) {
oldCons.warn(text);
// Your code
},
error: function (text) {
oldCons.error(text);
// Your code
}
};
}(window.console));
//Then redefine the old console
window.console = console;