47 votes

console.journal.appliquez pas de travail dans IE9

Regarde comme je l'ai ré-inventé la roue, mais de toute façon cela ne fonctionne pas dans Internet Explorer 9, mais le fait dans IE6.

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

Connexes: Appliquer() question pour javascript

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

93voto

Andy E Points 132925

La deuxième partie de la réponse que j'ai fait récemment des réponses à cette question. Je ne considère pas cela un duplicata de celui-là, donc, pour des raisons de commodité, je vais la coller ici:

L'objet console ne fait partie d'aucun standard et est une extension du Modèle d'Objet de Document. Comme d'autres objets DOM, il est considéré comme un objet hôte et n'est pas à hériter de l'Objet, ni ses méthodes à partir de la Fonction, comme les indiens d'ECMAScript 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 de la maternelle ECMAScript types. Comme les outils de développement sont considérés comme une extension pour IE (quoique, intégré dans l'extension), ils ne reçoivent pas les mêmes améliorations que le reste de la DOM.

Pour ce que ça vaut, vous pouvez toujours utiliser une certaine Fonction.prototype des méthodes sur la console de méthodes avec un peu de bind() de la magie:

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

De sorte que vous pouvez réparer tous 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);
}

Cela remplace le "host" fonctions avec les fonctions natives qui appellent le "host" des fonctions. Vous pouvez le faire fonctionner dans Internet Explorer 8, y compris la compatibilité des implémentations pour Function.prototype.bind et Array.prototype.forEach dans votre code, ou la réécriture de l'extrait ci-dessus afin d'incorporer les techniques utilisées par ces méthodes.

Voir aussi

5voto

BishopZ Points 2112

Il y a aussi Paul Irlandais du moyen de le faire. Il est plus simple que certaines des réponses ci-dessus, mais rend le journal toujours la sortie d'un tableau (même si un seul argument a été adoptée 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) );
  }
};

2voto

T.J. Crowder Points 285826

Plusieurs de IE hôte fonctions de l'objet ne sont pas vraiment des fonctions JavaScript et donc ne pas avoir apply ou call. (alert, par exemple).

De sorte que vous aurez à 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]);
  }
}

1voto

Hans Petersen Points 11

Je suis tombé sur le même IE mal 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), c'est à dire 7,8,9 Chrome et Opera. Il fait usage de la mal EVAL, mais vous ne voulez déboguer dans le développement. Ensuite, vous remplacez le code par debug = function () {};

Si elle est ici.

En Ce Qui Concerne, 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);

Oups j'ai oublié mon toType de la fonction, c'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();
}

0voto

line-o Points 510

Ok, ça marche quand vous l'écrire 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 vous l'écrire de cette façon 'de la console.le journal est reconnu comme une fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X