5

Lors de la recherche de commentaires conditionnels JavaScript pour IE, je suis tombé sur @cc_on. Cela semble fonctionner. Cependant, le wikipedia entry des commentaires conditionnels fournit le code suivant pour IE plus robustes détections, spécifiquement IE6:/* @ cc_on et la détection IE6

/*@cc_on 
    @if (@_jscript_version > 5.7) 
    document.write("You are using IE8+"); 

    @elif (@_jscript_version == 5.7 && window.XMLHttpRequest) 
    document.write("You are using IE7"); 

    @elif (@_jscript_version == 5.6 || (@_jscript_version == 5.7 && !window.XMLHttpRequest)) 
    document.write("You are using IE6"); 

    @elif (@_jscript_version == 5.5) 
    document.write("You are using IE5.5"); 

    @else 
    document.write("You are using IE5 or older"); 

@end 

@*/ 

La question est, je reçois un javascript « attendu constant » erreur sur !window.XMLHttpRequest.

De toute évidence, Wikipédia a besoin d'aide, et je dois le faire fonctionner. Quelqu'un peut m'aider?

+0

« IE Plus robustes détections »? Je pense que les commentaires conditionnels fournissent la forme la plus robuste de détection d'IE possible. ** Ne pas ** s'appuyer sur la version JScript pour déterminer la version IE, car ils sont indépendants. Voir le point 4 de http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html#c1774947112904387635 De plus, vous ne devriez pas utiliser la détection du navigateur ; utiliser la détection de caractéristiques: http://www.nczonline.net/blog/2009/12/29/feature-detection-is-not-browser-detection/ –

+1

La détection de @_jscript_version ne doit être utilisée que si vous connaissez la différence exacte entre versions de moteur JavaScript et vous souhaitez cibler cette différence en quelque sorte - par exemple, émuler une fonctionnalité manquante. Par exemple, jscript 5.1 n'a pas défini les méthodes d'appel/d'application prototype de Function, ni Array.prototype.push. Il est donc prudent de détecter cette @_jscript_version et d'ajouter un support par programme pour ces fonctionnalités. Cependant, comme Marcel l'a dit, il n'est pas prudent de supposer que @_jscript_version de 5.1 correspond à IE5.01 car vous pourriez facilement mettre jscript à jour depuis Windows Update. –

+1

@Vitaly: Je ne veux pas trop pinailler, mais les exemples que vous avez donnés peuvent être testés avec la détection de caractéristiques, donc vous n'avez pas besoin de tester Javascript version> = 1.3 ou quelque chose comme ça. Utilisez simplement 'if (! Function.prototype.call) {Function.prototype.call = foo; } ', etc., comme Oz.js fait: http://code.google.com/p/oz-js/source/browse/trunk/oz.js#224 –

Répondre

4

Certainement pas un expert JS, mais quelques recherches pour isoler trouvé cet IE6 IE7 en utilisant jscript_version == 5.7:

/*@cc_on 
if (@_jscript_version==5.6 || 
    (@_jscript_version==5.7 && 
     navigator.userAgent.toLowerCase().indexOf("msie 6.") != -1)) { 
    //ie6 code 
} 
@*/ 

Peut-être que vous indiquerons dans la bonne direction.

Source: http://sharovatov.wordpress.com/2009/06/03/efficient-ie-version-targeting/

+0

Je voudrais clarifier cela un peu, mais vous avez à peu près raison. Le problème s'est avéré être d'essayer d'appeler JavaScript normal dans les opérateurs de commentaires conditionnels précompilés "@elif" etc. Lorsque vous précompilez simplement la version jscript, et exécutez tout le reste comme JavaScript traditionnel, les choses compilent et s'exécutent très bien. – Jack

+0

@Marcel Korpel - avez-vous lu mon blog dont JBickford fait référence? La vérification userAgent est utilisée * à l'intérieur * du bloc de compilation conditionnelle (appliqué uniquement aux IE) et il n'y a pas d'autre moyen de déterminer la différence entre IE7 qui a jscript 5.7 et IE6 sur Windows XP SP3 qui a aussi jscript 5.7. –

+0

@Vitaly: Je dois admettre que je n'ai pas lu votre article et j'étais un peu dur dans mon commentaire original, pour lequel je m'excuse (et j'ai supprimé le commentaire). Vous avez un point que vous pouvez détecter en toute sécurité la version IE dans un bloc de compilation conditionnel (et juste cela suffirait, en vérifiant également la version JScript est inutile), et la détection du navigateur * est * nécessaire pour vérifier les possibilités ': hover' (ils ne peuvent pas être détectés, pour autant que je sache), mais je pense que l'utilisation de commentaires conditionnels est une façon plus simple de le faire. Cela dit, dans la plupart des cas, vous pourriez et devriez simplement utiliser la détection de caractéristiques. –

3

J'ai trouvé une solution. Le code est comme suit.

<script type="text/javascript" charset="utf-8"> 
/*@cc_on 
if (@_jscript_version > 5.7) 
document.write("You are using IE8"); 
else if (@_jscript_version == 5.7 && window.XMLHttpRequest) 
document.write("You are using IE7"); 
else if (@_jscript_version == 5.6 || (@_jscript_version == 5.7 && !window.XMLHttpRequest)) 
document.write("You are using IE6"); 
else if (@_jscript_version == 5.5) 
document.write("You are using IE5.5"); 
else 
document.write("You are using IE5 or older"); 
@*/ 
</script> 
+1

Êtes-vous aveugle? C'est le même morceau de code qu'il a inclus dans sa question. –

+7

Bonjour Josh, j'ai changé @if ... @ elif ... @ else ... @ fin à if ... else si ... else. J'ai trouvé du code dans @if ... @ elif ... @ else ... @ ne s'exécutera pas correctement comme la partie ** window.XMLHttpRequest **. Mais cela fonctionne bien dans les instructions normales si. –

2

Je me sers de ce joli one-liner pour les années:

var IE; //@cc_on IE = parseFloat((/MSIE[\s]*([\d\.]+)/).exec(navigator.appVersion)[1]); 

Petit et précis (testé dans IE 6-10).

Note à ceux qui utilisent grunt. assurez-vous de définir preserveComments: 'some' si vous utilisez le plugin uglify pour vous assurer que les commentaires conditionnels ne sont pas supprimés.

+0

Où avez-vous trouvé ce joli one-liner? – yckart

+0

@yckart Je l'ai écrit. Vous pouvez voir ma dernière version à https://github.com/willfarrell/angular-io/blob/master/src/scripts/ie.js qui incluedes un chèque chromeframe (qui sera unneccessary Janvier 2014, en raison de la renommée de chrome pas être maintenu plus longtemps). –

0

peut-être un peu en retard à la fête mais je aussi suis tombé sur ce problème, a eu une explosion et à ma solution était la suivante, espère que cela aide https://github.com/davesmiths/isIE

var isIE = false; 
/*@cc_on isIE = @_jscript_version;@*/ 
if (isIE !== false) { 
    if (isIE == 5.8) 
     isIE = 8; 
    else if (isIE == 5.7 && window.XMLHttpRequest) 
     isIE = 7; 
    else if (isIE == 5.7 || isIE == 5.6) 
     isIE = 6; 
    else if (isIE <= 5.5) 
     isIE = 5; 
}