3

J'ai une fonction JavaScript qui gère les événements du bouton de la souris. Il doit être capable de distinguer entre les boutons de la souris gauche et droite. Malheureusement, Internet Explorer utilise des valeurs différentes pour event.button que tous les autres navigateurs. Je sais comment les interpréter, mais j'ai besoin de savoir quel chemin suivre. Je l'ai fait avec un hack JavaScript qui repose sur la compilation conditionnelle. Il est comme ça:Comment détecter Internet Explorer en JavaScript avec Google Closure Compiler?

if (/*@[email protected]*/false) { IE fixup... } 

Je considère cela tout à fait une méthode sûre parce qu'elle est basée sur les capacités de l'analyseur JavaScript qui ne peut pas être falsifiée et sont peu susceptibles d'être imités par d'autres navigateurs. Maintenant, j'utilise le compilateur Google Closure pour emballer mes fichiers JavaScript. J'ai trouvé qu'il supprime les commentaires de compilation conditionnelle comme n'importe quel autre commentaire, aussi. J'ai donc essayé différents hacks. L'un d'eux, il ceci:

if ("\v" == "v") { IE fixup... } 

Malheureusement, le compilateur de fermeture très intelligent et découvre que la condition ne peut jamais être vrai et supprime ce code. En outre, je ne l'aime pas parce que Microsoft peut éventuellement corriger ce bug \ v et la détection échoue.

Je pourrais juste lire quelque chose comme navigator.appName ou comment il s'appelle, mais c'est trop facile à truquer. Et si quelqu'un modifie l'identification de son navigateur, il est peu probable que l'autre comportement soit implémenté.

Le compilateur de fermeture permet de conserver certains commentaires. J'ai essayé ceci:

if (/**@preserve/*@[email protected]*/false) { IE fixup... } 

Bien que cela produit le résultat souhaité après compression, il est pas un commentaire conditionnel fonctionnel sous sa forme source. Mais pour des raisons de débogage, j'ai besoin de mon fichier JavaScript pour travailler à la fois compressé et non compressé.

Y a-t-il un espoir pour que cela fonctionne sans modifier manuellement le fichier JS compressé?

Pour la référence, voici ma fonction complète sous sa forme originale:

function findEvent(e) 
{ 
    e = e || event; // IE 
    if (!e.target && e.srcElement) // IE 
     e.target = e.srcElement; 
    if (isSet(e.button)) 
    { 
     // Every browser uses different values for the mouse buttons. Correct them here. 
     // DOM says: 0 = left, 1 = middle, 2 = right (multiple buttons not supported) 
     // Opera 7 and older and Konqueror are not specifically handled here. 
     // See http://de.selfhtml.org/javascript/objekte/event.htm#button 
     if (/*@[email protected]*/false) // IE - http://dean.edwards.name/weblog/2007/03/sniff/ - comment removed by Google Closure Compiler 
     { 
      if (e.button & 1) 
       e.mouseButton = 0; 
      else if (e.button & 2) 
       e.mouseButton = 2; 
      else if (e.button & 4) 
       e.mouseButton = 1; 
     } 
     else 
      e.mouseButton = e.button; 
    } 
    return e; 
} 

Répondre

0

Bon, après un peu plus la recherche, pour l'instant je suis satisfait de cette solution:

function ieVersion() 
{ 
    var style = document.documentElement.style; 
    if (style.scrollbar3dLightColor != undefined) 
    { 
     if (style.opacity != undefined) 
      return 9; 
     else if (style.msBlockProgression != undefined) 
      return 8; 
     else if (style.msInterpolationMode != undefined) 
      return 7; 
     else if (style.textOverflow != undefined) 
      return 6; 
     else 
      return 5.5; 
    } 
    return 0; 
} 

Trouvé sur http://msdn.microsoft.com/en-us/library/ms537509%28v=vs.85%29.aspx#4

Voici une liste d'autres méthodes que je trouvais sur la façon:
http://dean.edwards.name/weblog/2007/03/sniff/ - Ne fonctionne pas avec le compilateur de fermeture
http://webreflection.blogspot.com/2009/01/32-bytes-to-know-if-your-browser-is-ie.html - C'est celui avec « \ v »
http://www.thespanner.co.uk/2009/01/29/detecting-browsers-javascript-hacks/ - Comme ci-dessus, pour d'autres navigateurs
How to detect Internet Explorer in JavaScript with Google Closure Compiler? - Réponse de John sur cette page

2

Vous disposez de deux lignes au début de votre script qui semblent détecter déjà si le navigateur est IE. Pourquoi ne pas l'utiliser comme base pour votre instruction if:

var IE = (!e.target && e.srcElement); 
if (IE) { 
    !e.target && e.srcElement 
} 
// ... 
if (IE) { 
    if (e.button & 1) 
     e.mouseButton = 0; 
    // ... 
+0

La présence d'une condition event.srcElement sûr de détecter IE? Je n'ai absolument aucun détail à ce sujet. Le code srcElement/target fonctionne pour cette seule ligne (détection de fonctionnalités, pas de navigateur) mais peut échouer n'importe où ailleurs. Malheureusement, les valeurs de event.button ne peuvent pas être interprétées par détection de fonction. – ygoe

2

Vous pourriez avoir un script distinct qui met en place une approche globale (comme le jQuery ».navigateur() » chose), et faites-être inclus par commentaire conditionnel:

<!--[if IE]> 
<script> 
    window.isIe = true; 
</script> 
<[endif]--> 

En fait vous pouvez faire ce même colombophile:

<!--[if = IE 6]> 
<script> 
    window.isIe = { version: 6 }; 
</script> 
<[endif]--> 

<!--[if = IE 7]> 
<script> 
    window.isIe = { version: 7 }; 
</script> 
<[endif]--> 

<!--[if = IE 8]> 
<script> 
    window.isIe = { version: 8 }; 
</script> 
<[endif]--> 

Ensuite, dans votre comprimé « vrai scénario » vous pouvez juste faire:

if (isIe) { /* IE stuff */ } 

et

if (isIe && isIe.version === 6) { /* IE6 stuff */ } 
0

Juste trébuché sur ce point, voici donc une réponse mise à jour pour 2013:

if (goog.userAgent.IE) { ... } 

Et si vous avez besoin d'être spécifique à la version:

if (goog.userAgent.IE && goog.userAgent.VERSION != '10.0') { ... } 

Docs

+0

Je n'utilise pas la bibliothèque * Closure * mais seulement le * compilateur *. J'ai donc besoin d'un support à la compilation, pas de l'exécution. En fait, ma bibliothèque Js est en quelque sorte une version très simple de ce que la bibliothèque de fermeture semble être du premier coup d'oeil. – ygoe

+0

Ah, d'accord. Eh bien, je vais laisser ça ici pour la postérité au cas où quelqu'un voudrait savoir comment le faire avec la bibliothèque. –

1
if (goog.userAgent.IE) { 
    // run away 
}; 

/** 
* Condition will be true for IE < 9.0 
* @see goog.string.compareVersions 
*/ 
if (goog.userAgent.IE && goog.userAgent.compare(9, goog.userAgent.VERSION) == 1) { 
    // run away even faster 
} 

/** 
* Condition will be true for IE >= 10.0 
*/ 
if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher(10)) { 
    // ... 
} 

source: http://www.closurecheatsheet.com/other#goog-useragent

+0

Clarifié ma question, car je reçois plusieurs réponses sans rapport avec ma vieille question. Je parle du Closure * Compiler *, pas de la bibliothèque du même nom (si quelque chose comme ça existe, je ne m'en suis jamais soucié ni utilisé). – ygoe

Questions connexes