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;
}
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