59 votes

Le site Web avec JS ne fonctionne pas dans IE9 tant que les outils de développement ne sont pas activés.

Je suis le développement d'un site web complexe fortement tire profit de jQuery et un certain nombre de scripts. En charge du site, aucun de mes script fonctionne (mais je peux confirmer que d'autres scripts fonctionnent très bien). Je ne serais pas l'affichage d'un tel boiteux question ici sur SOI, sauf pour une chose:

L'instant j'ai frappé la touche F12 pour activer les outils de développeur donc je peut corriger mon problème, tout instantanément fonctionne parfaitement!

Pire, si j'ai fermé le navigateur, le démarrer, tourner sur les Outils de Dev de la première et de visiter le site, tout fonctionne comme prévu.

Je ne peux même pas déboguer le damné problème parce que les Outils de Dev de bugs! Ce qui pourrait Outils de Dev de faire qui fait que les choses fonctionnent? Faut-il changer l'UA (je fais un peu de jQuery.la détection du navigateur)? Faut-il faire quelque chose de doctype?

MODIFIER

Tous mes journalisation de la console est enveloppé dans le wrapper suivant la fonction d'utilité:

   function log(msg){
    if (console){
        console.log(msg);
    }
   }

Des idées ou suggestions, je pourrais essayer serait la bienvenue. Je vais poster ici si je trouve une solution.

34voto

Liam Newmarch Points 1286

J'apprécie je suis assez en retard à la fête ici, mais j'ai une solution pour IE9 qui est un peu différent.

(function() {
    var temp_log = [];
    function log() {
        if (console && console.log) {
            for (var i = 0; i < temp_log.length; i++) {
                console.log.call(window, temp_log[i]);
            }
            console.log.call(window, arguments);
        } else {
            temp_log.push(arguments);
        }
    }
})();

Fondamentalement, au lieu de console.log vous utilisez log. Si console.log existe puis il travaille comme normal, sinon il stocke les entrées de journal dans un tableau et les sorties sur le prochain log où l' console est disponible.

Ce serait bien si elle a poussé les données dès que l' console est disponible, mais c'est moins cher que d'installer un custom setInterval auditeur.

Mise à jour de la fonction (1 octobre 2012)

J'ai mis à jour ce script pour mon propre usage, et j'ai pensé le partager. Il a un peu de digne améliorations:

  • utiliser console.log() comme d'habitude, c'est à dire pas plus besoin d'utiliser la non-standard log()
  • prend en charge plusieurs arguments, par exemple, console.log('foo', 'bar')
  • vous pouvez également utiliser console.error, console.warn et console.info (bien que les sorties comme console.log)
  • script vérifie natif console tous les 1000ms et sorties de la mémoire tampon lorsque vous trouvé

Je pense que grâce à ces améliorations, c'est devenu une assez solide cale pour IE9. Découvrez le dépôt GitHub ici.

if (!window.console) (function() {

    var __console, Console;

    Console = function() {
        var check = setInterval(function() {
            var f;
            if (window.console && console.log && !console.__buffer) {
                clearInterval(check);
                f = (Function.prototype.bind) ? Function.prototype.bind.call(console.log, console) : console.log;
                for (var i = 0; i < __console.__buffer.length; i++) f.apply(console, __console.__buffer[i]);
            }
        }, 1000); 

        function log() {
            this.__buffer.push(arguments);
        }

        this.log = log;
        this.error = log;
        this.warn = log;
        this.info = log;
        this.__buffer = [];
    };

    __console = window.console = new Console();
})();

13voto

JT- Points 141

Vous avez des appels de console, dans IE, ils échoueront si les outils de développement ne sont pas ouverts. Une solution simple consiste à envelopper tous les appels de la console dans une fonction telle que:

 function log(msg) {
  if(console)
    console.log(msg);
}
 

2voto

benqus Points 704

Je l'ai piraté de la manière suivante

 <script type="text/javascript">
    (function () {
        if (typeof console == "undefined") {
            console = {
                log : function () {}
            }
        }
    })();
</script>
 

Et ceci est le premier élément de script dans le fichier.

2voto

Jasmine Hegman Points 152

La plupart des autres solutions devraient bien fonctionner, mais voici une courte ligne si vous ne vous souciez pas de capturer les messages du journal si la console n'est pas disponible.

 // Stub hack to prevent errors in IE
console = window.console || { log: function() {} };
 

Cela vous permet d’utiliser toujours la fonction native console.log directement au lieu de l’envelopper avec quoi que ce soit ou d’avoir un conditionnel à chaque fois.

1voto

zzzzBov Points 62084

Je trouve beaucoup plus pratique d’utiliser simplement console && console.log('foo', 'bar', 'baz') plutôt que d’utiliser une fonction wrapper.

Le code que vous avez fourni:

 function logError(msg){
  if (console) {
    console.log(msg);
  } else {
    throw new Error(msg);
  }
}
 

Produira une erreur pour IE lorsque les outils de développement sont fermés, car console ne sont pas définis.

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