[javascript] IE8에서 console.log는 어떻게 되었습니까?

이 게시물 에 따르면 베타 버전이지만 릴리스되지 않았습니까?



답변

대체를 위해 더 나은 것은 이것입니다 :


   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) }
}


답변

이것은 다양한 답변을 취하는 것입니다. 해고되었을 때 IE 콘솔을 열지 않아도 실제로 기록 된 메시지를보고 싶었습니다. 그래서 내가 만든 console.messages배열 로 밀어 넣습니다 . 또한 console.dump()전체 로그를 쉽게 볼 수 있는 기능 을 추가했습니다 . console.clear()메시지 대기열을 비 웁니다.

이 솔루션은 또한 다른 콘솔 방법을 “처리”합니다. Firebug Console API )

마지막으로이 솔루션은 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객체 에서 배열을 만듭니다 . 인수는 실제로 Array가 아니기 때문에 필수 입니다.

trap()모든 API 함수의 기본 핸들러입니다. 나는 인수를 message전달하여 API 호출에 전달 된 인수의 로그를 얻습니다 console.log.

편집하다

console.raw전달 된대로 정확하게 인수를 캡처 하는 추가 배열 을 추가 했습니다 trap(). 때로는 바람직하지 않은 args.join(' ')객체를 문자열로 변환하고 있음을 깨달았습니다 "[object Object]". 덕분에 bfontaine 에 대한 제안 .


답변

console.logIE8에서는 진정한 자바 스크립트 기능이 아니라는 점에 주목할 가치가 있습니다. apply또는 call메소드를 지원하지 않습니다 .


답변

경고 할 폴백에 신경 쓰지 않는다고 가정하면 Internet Explorer의 단점을 해결하는 더 간결한 방법이 있습니다.

var console=console||{"log":function(){}};


답변

“orange80″에 의해 게시 된 접근 방식이 정말 마음에 듭니다. 한 번 설정하고 잊을 수 있기 때문에 우아합니다.

다른 접근 방식은 문제를 요구하는 다른 무언가를 수행해야합니다 ( console.log()매번 평소 이외의 것을 호출하십시오 ).

로깅하기 전의 어느 위치에서나 자바 스크립트의 시작 부분에서 한 번만 호출 할 수있는 유틸리티 함수로 코드를 래핑하여 한 단계 더 발전했습니다. (저는 회사의 이벤트 데이터 라우터 제품에 이것을 설치하고 있습니다. 새로운 관리자 인터페이스의 브라우저 간 디자인을 단순화하는 데 도움이됩니다.)

/**
 * 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 호출에 “정의되지 않음”이 표시되면 오래된 firebuglite (firebug.js)가 여전히로드되어 있음을 의미합니다. IE8의 console.log의 모든 유효한 기능이 존재하더라도이를 무시합니다. 이것은 어쨌든 나에게 일어난 일입니다.

콘솔 객체를 재정의하는 다른 코드를 확인하십시오.