어떤 상황 window.console.log
에서 Internet Explorer 9에 정의되어 있습니까?
window.console.log
정의 window.console.log.apply
되어 window.console.log.call
있고 정의되지 않은 경우에도 마찬가지입니다. 왜 이런거야?
[IE8 관련 질문 : IE8 에서 console.log는 어떻게 되었습니까? .]
어떤 상황 window.console.log
에서 Internet Explorer 9에 정의되어 있습니까?
window.console.log
정의 window.console.log.apply
되어 window.console.log.call
있고 정의되지 않은 경우에도 마찬가지입니다. 왜 이런거야?
[IE8 관련 질문 : IE8 에서 console.log는 어떻게 되었습니까? .]
답변:
Internet Explorer 9 (및 8)에서 console
개체는 개발자 도구가 특정 탭에 대해 열려있을 때만 노출됩니다. 해당 탭의 개발자 도구 창을 숨기면 console
탐색하는 각 페이지에 대해 개체가 노출 된 상태로 유지됩니다. 새 탭을 열면 해당 탭의 개발자 도구도 열어야 console
개체가 노출됩니다.
console
객체는 표준의 일부가 아니며 문서 객체 모델의 확장입니다. 다른 DOM 객체와 마찬가지로 호스트 객체로 간주되며 기본 ECMAScript 함수 및 객체와 같이 Object
메소드 를 상속 하거나 메소드 를 상속하지 않아도됩니다 Function
. 이것이 이유 apply
이며 call
해당 방법에 대해서는 정의되어 있지 않습니다. IE 9에서는 대부분의 DOM 객체가 기본 ECMAScript 유형에서 상속되도록 개선되었습니다. 개발자 도구는 IE의 확장 기능 (내장 확장 기능 임)으로 간주되므로 나머지 DOM과 동일한 개선 사항을받지 못했습니다.
가치있는 것을 위해 , 약간의 마술로 Function.prototype
메소드에 몇 가지 메소드를 계속 사용할 수 있습니다 .console
bind()
var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"
console
객체도 마찬가지입니다 .
이 console.log 문제에 대한 간단한 해결책은 JS 코드의 시작 부분에 다음을 정의하는 것입니다.
if (!window.console) window.console = {};
if (!window.console.log) window.console.log = function () { };
이것은 모든 브라우저에서 작동합니다. 디버거가 활성화되지 않은 경우 console.log에 대한 더미 함수가 작성됩니다. 디버거가 활성화되면 console.log 메소드가 정의되고 정상적으로 실행됩니다.
나는 이것이 매우 오래된 질문이라는 것을 알고 있지만 이것이 콘솔 문제를 다루는 방법에 대한 귀중한 대안을 추가한다고 생각합니다. console. * (첫 번째 스크립트)을 호출하기 전에 다음 코드를 배치하십시오.
// 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;
}
}
}());
참조 :
https://github.com/h5bp/html5-boilerplate/blob/v5.0.0/dist/js/plugins.js
위의 Marc Cliament의 의견에서 기사를 읽은 후 이제 다목적 크로스 브라우저 console.log 기능을 다음과 같이 변경했습니다.
function log()
{
"use strict";
if (typeof(console) !== "undefined" && console.log !== undefined)
{
try
{
console.log.apply(console, arguments);
}
catch (e)
{
var log = Function.prototype.bind.call(console.log, console);
log.apply(console, arguments);
}
}
}
Function.prototype.apply.call(console.log, console, arguments);