console.journal.ne pas travailler en IE9

on dirait que j'ai réinventé la roue, mais ça ne marche pas dans Internet Explorer 9, mais dans IE6.

function debug()
  if(!window.console) { 
    window.console = { log: function() { /* do something */ } };
  }
  console.log.apply(console, arguments);
}

Related: Apply() question pour javascript

F12 Debugger me dit que cet "objet" (console.log) ne supporte pas la méthode "apply". Il n'est pas encore reconnue comme une fonction? Toute autre pointeurs ou des idées?

46
demandé sur Community 2011-04-04 17:13:24
la source

7 ответов

la deuxième partie d'une réponse j'ai donné récemment répond à cette question aussi. Je ne considère pas qu'il s'agit d'une copie de celui-ci donc, pour plus de commodité, je vais le coller ici:

l'objet console ne fait partie d'aucune norme et est une extension du modèle D'objet Document. Comme les autres objets DOM, il est considéré comme un objet hôte et n'est pas nécessaire d'hériter de L'objet, ni ses méthodes de la fonction, comme ECMAScript natif les fonctions et les objets faire de. C'est la raison pour appliquer et d'appel ne sont pas définis sur ces méthodes. Dans IE 9, la plupart des objets DOM ont été améliorés pour hériter des types ECMAScript natifs. Comme les outils de développement sont considérés comme une extension à IE (bien que, une extension intégrée), ils n'ont clairement pas reçu les mêmes améliorations que le reste du DOM.

pour ce que ça vaut, vous pouvez toujours utiliser une fonction.méthodes prototypes sur console méthodes avec un petit bind () magie:

var log = Function.prototype.bind.call(console.log, console);
log.apply(console, ["this", "is", "a", "test"]);
//-> "thisisatest"

pour que vous puissiez réparer toutes les console méthodes pour IE 9 de la même manière:

if (Function.prototype.bind && window.console && typeof console.log == "object"){
    [
      "log","info","warn","error","assert","dir","clear","profile","profileEnd"
    ].forEach(function (method) {
        console[method] = this.bind(console[method], console);
    }, Function.prototype.call);
}

remplace les fonctions" host "par des fonctions natives qui appellent les fonctions" host". Vous pouvez le faire fonctionner dans Internet Explorer 8 en incluant les implémentations de compatibilité pour Function.prototype.bind et Array.prototype.forEach dans votre code, ou en réécrivant ci-dessus, pour incorporer les techniques utilisées par ces méthodes.

Voir aussi

91
répondu Andy E 2017-05-23 15:18:01
la source

il y a aussi la façon de faire de Paul Irish. Il est plus simple que certaines des réponses ci-dessus, mais rend log toujours sortie d'un tableau (même si un seul argument a été passé en):

// usage: log('inside coolFunc',this,arguments);
// http://paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function(){
  log.history = log.history || [];   // store logs to an array for reference
  log.history.push(arguments);
  if(this.console){
    console.log( Array.prototype.slice.call(arguments) );
  }
};
5
répondu BishopZ 2012-09-10 23:52:31
la source

plusieurs des fonctions de L'objet hôte D'IE ne sont pas vraiment des fonctions JavaScript et n'ont donc pas apply ou call . ( alert , par exemple.)

donc vous devrez le faire à la dure:

function debug()
  var index;

  if(!window.console) { 
    window.console = { log: function() { /* do something */ } };
  }
  for (index = 0; index < arguments.length; ++index) {
      console.log(arguments[index]);
  }
}
2
répondu T.J. Crowder 2011-04-04 17:15:59
la source

je suis tombé sur le même problème IE et fait une routine pour elle. Il n'est pas aussi chic que toutes les implémentations, mais il fonctionne dans TOUS les navigateurs modernes.

Je l'ai testé avec Firefox (Firebug), i.e. 7,8,9 Chrome et Opera. Il fait usage de l'EVAL mal, mais vous ne voudrez déboguer dans le développement. Ensuite, vous remplacerez le code par debug = function () {};

Alors voilà.

Cordialement, Hans

(function(ns) {
  var msgs = [];

  // IE compatiblity
  function argtoarr (args,from) {
    var a = [];
    for (var i = from || 0; i<args.length; i++) a.push(args[i]);
    return a;    
  }

  function log(arg) {
    var params = "", format = "", type , output,
        types = {
            "number" : "%d",
            "object" : "{%o}",
            "array" : "[%o]"
        };
    for (var i=0; i<arg.length; i++) {
        params += (params ? "," : "")+"arg["+i+"]";
        type = types[toType(arg[i])] || "%s";
        if (type === "%d" && parseFloat(arg[i]) == parseInt(arg[i], 10)) type = "%f";
        format += (format ? "," : "")+type;
    }
    // opera does not support string format, so leave it out
    output = "console.log("+(window.opera ? "" : "'%f',".replace("%f",format))+"%p);".replace("%p",params);
    eval(output);
  }

  ns.debug = function () {
    msgs.push(argtoarr(arguments));
    if (console !== undefined) while (msgs.length>0) log(msgs.shift());
  }

})(window);

Oops oublié ma fonction toType, il est ici.

function toType(obj) {
    if (obj === undefined) return "undefined";
    if (obj === null) return "null";
    var m = obj.constructor;
    if (!m) return "window";
    m = m.toString().match(/(?:function|\[object)\s*([a-z|A-Z|0-9|_|@]*)/);
    return m[1].toLowerCase();
}
1
répondu Hans Petersen 2013-02-03 02:27:04
la source

Ok, ça marche quand tu l'écris de cette façon:

function debug()
  if(!window.console) { 
    window.console = {};
    console.log = function() { /* do something */ };
  }
  console.log.apply(console, arguments);
}

comportement étrange... mais si tu l'écris comme ça, console.le journal est reconnu comme une fonction.

0
répondu line-o 2011-04-04 17:34:58
la source

la raison pour laquelle je suis venu à cette question était que j'ai essayé de "épicer" la console.fonction de journalisation pour un module spécifique, donc j'aurais des informations de débogage plus localisées et plus perspicaces en jouant un peu avec les arguments, C'est à dire 9 cassé.

@Andy E réponse est excellente et m'a aidé avec beaucoup de perspicacité sur appliquer. Je ne prends juste pas la même approche pour prendre en charge IE9, donc ma solution est d'exécuter la console que sur les "navigateurs modernes" (étant que moderne signifie Tous les navigateurs que se comporter de la façon dont j'attends =)

var C = function() {
  var args = Array.prototype.slice.call(arguments);
  var console = window.console;
  args[0]  = "Module X: "+args[0];
  if( typeof console == 'object' && console.log && console.log.apply ){
    console.log.apply(console, args);
  }
};
0
répondu Fabiano Soriani 2013-01-21 23:42:21
la source

, Essayez:

function log(type) {
  if (typeof console !== 'undefined' && typeof console.log !== 'undefined' &&
    console[type] && Function.prototype.bind) {
    var log = Function.prototype.bind.call(console[type], console);
    log.apply(console, Array.prototype.slice.call(arguments, 1));
  }
}
log('info', 'test', 'pass');
log('error', 'test', 'fail');

Travaille pour log , debug , info , warn , error , group ou groupEnd .

0
répondu Shobhit Sharma 2017-10-03 17:33:12
la source