Я хотел бы знать, почему следующий код не работает в Google Chrome:
// creates a xss console log
var cl = ( typeof( console ) != 'undefined' ) ? console.log : alert;
cl('teste');
вывод: Uncaught TypeError: незаконный вызов
спасибо.
Я хотел бы знать, почему следующий код не работает в Google Chrome:
// creates a xss console log
var cl = ( typeof( console ) != 'undefined' ) ? console.log : alert;
cl('teste');
вывод: Uncaught TypeError: незаконный вызов
спасибо.
Когда вы пишете cl();
, вы вызываете log
в глобальном контексте.
Chrome console.log
не хочет вызываться в объекте window
.
Вместо этого вы можете написать
cl = function() { return console.log.apply(console, arguments); };
Это вызовет log
в контексте console
.
https://groups.google.com/a/chromium.org/d/msg/chromium-bugs/gGVPJ1T-qA0/F8uSupbO2R8J
Очевидно, вы также можете определить журнал:
log = console.log.bind(console);
а затем номера строк также работают
К сожалению, ответ @SLaks не применяется к IE, потому что он использует оконный объект как контекст в console.log-методе.
Я бы предложил другой способ, который не зависит от браузера:
!window.console && (console = {});
console.debug = console.debug || $.noop;
console.info = console.info || $.noop;
console.warn = console.warn || $.noop;
console.log = console.log || $.noop;
var src = console, desc = {};
desc.prototype = src;
console = desc;
desc.log = function(message, exception) {
var msg = message + (exception ? ' (exception: ' + exception + ')' : ''), callstack = exception && exception.stack;
src.log(msg);
callstack && (src.log(callstack));
//logErrorUrl && $.post(logErrorUrl, { message: msg + (callstack || '') }); // Send clientside error message to serverside.
};