Je développe un site Web complexe faisant largement appel à jQuery et à un certain nombre de scripts. Au chargement du site, aucun de mes scripts ne fonctionne (bien que je puisse confirmer que les autres scripts fonctionnent correctement). Je ne posterais pas une question aussi boiteuse ici sur SE, sauf pour une chose:
Dès que j'ai appuyé sur F12 pour activer les outils de développement et pouvoir ainsi déboguer mon problème, tout fonctionne instantanément!
Pire, si je ferme le navigateur, le lance, active d'abord Outils de développement et visite le site, tout fonctionne comme prévu.
Donc, je ne peux même pas résoudre le problème parce que Dev Tools le corrige! Qu'est-ce que Dev Tools pourrait faire pour que les choses fonctionnent? Cela change-t-il l'UA (je détecte jQuery.browser)? Fait-il quelque chose à doctype?
MODIFIER
Toute la journalisation de ma console est encapsulée dans la fonction utilitaire d'encapsuleur suivante:
function log(msg){
if (console){
console.log(msg);
}
}
Toute pensée ou suggestion que je pourrais essayer serait la bienvenue. Je posterai ici si je trouve une solution.
Je sais que je suis assez tard pour la fête, mais j’ai une solution un peu différente pour IE9.
(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 alors il fonctionne normalement, sinon il stocke les entrées de journal dans un tableau et les affiche à la prochaine log
où le console
est disponible.
Ce serait bien si cela poussait les données dès que le console
est disponible, mais cela coûte moins cher que de configurer un écouteur setInterval personnalisé.
J'ai mis à jour ce script pour mon usage personnel et je pense le partager. Il présente quelques améliorations intéressantes:
console.log()
comme d'habitude, c'est-à-dire qu'il n'est plus nécessaire d'utiliser log()
non standardconsole.log('foo', 'bar')
console.error
, console.warn
et console.info
(bien que les affiche sous la forme console.log
)console
natif toutes les 1000 ms et génère le tampon, le cas échéantJe pense qu'avec ces améliorations, ceci est devenu une cale assez solide pour IE9. Consultez 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();
})();
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);
}
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.
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.
Le wrapper console.log que j’ai utilisé n’était pas suffisant pour détecter la console dans IE9. Voici le wrapper qui fonctionne d’une question connexe sur SE :
function logError(msg){
try {
console.log(msg);
} catch (error) {
throw new Error(msg);
}
}
function log(msg){
try {
console.log(msg);
} catch (error) { }
}
Un test approprié pour la disponibilité de l'objet console serait: if (typeof console === "undefined" || typeof console.log === "undefined")
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
sera indéfini.
J'ai rencontré ce problème plusieurs fois. En gros, avec les variables, nous vérifions leur validité.
var somevar;
if (somevar)
//do code
cela fonctionne parce que certains vont se résoudre en indéfini. Mais si vous vérifiez une propriété de fenêtre par exemple. window.console.
if (console) <---- this throws an exception
Vous ne pouvez pas faire la même vérification. Le navigateur le traite différemment. Fondamentalement seulement faire cela
if (window.console) <---- will NOT throw an exception if undefined
//some code
cela fonctionnera comme dans le premier exemple. Donc, vous devez changer votre code pour
function log(msg){
if (window.console){
console.log(msg);
}
}
Si vous avez plusieurs fichiers de script parallèles, les fichiers sont peut-être chargés/exécutés dans un ordre différent avec les outils de développement activés/désactivés.