javascript 콘솔 - IE8에서 console.log에 무슨 일이 일어 났습니까?




오류 error (15)

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


Answers

대체로 더 좋습니다.


   var alertFallback = true;
   if (typeof console === "undefined" || typeof console.log === "undefined") {
     console = {};
     if (alertFallback) {
         console.log = function(msg) {
              alert(msg);
         };
     } else {
         console.log = function() {};
     }
   }


나는이 방법을 좋아한다. (jquery의 doc을 사용한다.) ... ie 콘솔을 사용할 수있다. 페이지가로드 된 후에 ie dev의 도구를 열면 페이지를 다시 읽어 들일 필요가있다.

모든 기능을 고려하면 더 매끄럽지 만 로그 만 사용하므로 이것이 내가하는 일입니다.

//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
        }})();
    }
});

이것은 다양한 대답에 대한 나의 생각입니다. IE의 콘솔이 열렸을 때 실제로 로그 된 메시지를보고 싶었 기 때문에 내가 만든 console.messages 배열로 밀어 넣었습니다. 또한 전체 로그보기를 용이하게하기 위해 console.dump() 함수를 추가했습니다. console.clear() 는 메시지 큐를 비 console.clear() .

이 솔루션은 또한 다른 Console 메소드 ( " 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 뿐만 아니라)에 전달 된 인수의 로그를 얻습니다.

편집하다

trap() 전달 된 인수를 정확하게 캡처하는 추가 배열 console.raw 를 추가했습니다. 나는 args.join(' ') 이 객체를 "[object Object]" 문자열로 변환하는 것을 깨닫고 때로는 바람직하지 않을 수도 있습니다. suggestion 감사드립니다.


너무 많은 답변이 있습니다. 내 솔루션은 다음과 같습니다.

globalNamespace.globalArray = new Array();
if (typeof console === "undefined" || typeof console.log === "undefined") {
    console = {};
    console.log = function(message) {globalNamespace.globalArray.push(message)};   
}

즉, console.log가 없거나이 경우 열려 있지 않으면 전역 네임 스페이스 Array에 로그를 저장합니다. 이렇게하면 수백만 개의 경고 메시지가 표시되지 않고 개발자 콘솔을 열거 나 닫은 상태에서도 로그를 볼 수 있습니다.


모든 console.log 호출에 대해 "정의되지 않은"상태가된다면 아마도 오래된 firebuglite가로드 된 상태 일 것입니다 (firebug.js). IE8의 console.log 파일이 존재하더라도 모든 유효한 기능을 덮어 씁니다. 이것은 어쨌든 나에게 일어난 일이다.

콘솔 오브젝트를 겹쳐 쓰는 다른 코드가 있는지 점검하십시오.


여기 내 "IE는 충돌하지 마세요"입니다.

typeof console=="undefined"&&(console={});typeof console.log=="undefined"&&(console.log=function(){});

콘솔이없는 모든 브라우저에 가장 적합한 솔루션은 다음과 같습니다.

// 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;
        }
    }
}());

나는 이것을 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 = {});
    }
} ());

그것은 IE8에서 작동합니다. F12를 눌러 IE8의 개발자 도구를 엽니 다.

>>console.log('test')
LOG: test

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

html로 자신의 콘솔을 만드십시오. ;-) 이것은 imprved 될 수 있지만 다음으로 시작할 수 있습니다 :

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

다음은 개발자 도구가 열려있을 때 콘솔에 로그인하고 닫을 때 콘솔에 로그온하지 않는 버전입니다.

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

IE8의 console.log 는 진정한 Javascript 기능이 아닙니다. apply 또는 call 메소드를 지원하지 않습니다.


if (window.console && 'function' === typeof window.console.log) {
    window.console.log(o);
}

use strict 코드를 더 안전하게 만드는 방법입니다. 예상치 못한 방식으로 작동 할 수있는 위험한 기능을 사용할 수 없기 때문입니다.





javascript logging internet-explorer-8 console