Le comportement des navigateurs étant aussi diversifié qu'improbable, il s'avère souvent fort tentant d'user de certains "hacks", autant en CSS qu'en Javascript. Bien que ces pratiques soient à utiliser avec prudence (elles constituent parfois une antorse aux standards du web et pourraient provoquer un comportement inattendu sous les futures versions du navigateur ainsi "patché"), elles permettent de corriger certains comportements étranges et autres problèmes de rendu.
En Javascript, pour mettre en place nos propres traitements alternatifs selon le browser, Mootools, plutôt que de proposer un moyen d'identifier le browser qui interprète la page, propose une détection plus intelligente basée sur le moteur interne du navigateur. Comme la plupart des navigateurs sont fondés sur les mêmes principaux moteurs, il est en effet plus judicieux d'effectuer la distinction sur ce critère. Pour ce faire, il suffit d'interroger quelques propriétés de l'objet Browser pour connaître le moteur de rendu qui interprète la page :
- Browser.Engine.name : (string) Nom du moteur
- Browser.Engine.version : (int) Version du moteur
- Browser.Engine.gecko : (bool) True si le navigateur utilise le moteur Gecko
- Browser.Engine.trident : (bool) True si le navigateur utilise le moteur Trident
- Browser.Engine.webkit : (bool) True si le navigateur utilise le moteur WebKit
- Browser.Engine.presto : (bool) True si le navigateur utilise le moteur Presto
Un rapide petit test executé sur une panoplie de navigateurs (merci BrowserShots) m'a permi d'établir le tableau récapitulatif suivant :
Browser.Engine | ||||||
---|---|---|---|---|---|---|
.name | .version | .gecko | .trident | .webkit | .presto | |
Firefox 1.5 | gecko | 18 | true | undefined | undefined | undefined |
Firefox 2.0 | gecko | 18 | true | undefined | undefined | undefined |
Firefox 3.0 | gecko | 19 | true | undefined | undefined | undefined |
Firefox 3.1 | gecko | 19 | true | undefined | undefined | undefined |
Seamonkey 1.1 | gecko | 18 | true | undefined | undefined | undefined |
Seamonkey 2.0 | gecko | 19 | true | undefined | undefined | undefined |
Camino 1.6 | gecko | 18 | true | undefined | undefined | undefined |
Galeon 2.0 | gecko | 18 | true | undefined | undefined | undefined |
Navigator 9.0 | gecko | 18 | true | undefined | undefined | undefined |
Epiphany 2.22 | gecko | 18 | true | undefined | undefined | undefined |
K-Meleon 1.5 | gecko | 18 | true | undefined | undefined | undefined |
Flock 1.2 | gecko | 18 | true | undefined | undefined | undefined |
Flock 2.0 | gecko | 19 | true | undefined | undefined | undefined |
IE 5.5 | trident | 4 | undefined | true | undefined | undefined |
IE 6.0 | trident | 4 | undefined | true | undefined | undefined |
IE 7.0 | trident | 5 | undefined | true | undefined | undefined |
IE 8.0 | trident | 5 | undefined | true | undefined | undefined |
Avant 11.7 | trident | 5 | undefined | true | undefined | undefined |
Konqueror 3.5 | webkit | 419 | undefined | undefined | true | undefined |
Safari 2.0 | webkit | 419 | undefined | undefined | true | undefined |
Safari 3.2 | webkit | 525 | undefined | undefined | true | undefined |
Safari 4.0 | webkit | 525 | undefined | undefined | true | undefined |
Chrome 0.3 | webkit | 525 | undefined | undefined | true | undefined |
Chrome 1.0 | webkit | 525 | undefined | undefined | true | undefined |
Opera 8.53 | presto | 925 | undefined | undefined | undefined | true |
Opera 9.52 | presto | 950 | undefined | undefined | undefined | true |
Opera 9.62 | presto | 960 | undefined | undefined | undefined | true |
Opera 10.0 | presto | 960 | undefined | undefined | undefined | true |
Un mécanisme similaire existe aussi pour détecter le système d'exploitation, mais cette fois sans permettre d'en distinguer les versions.
Browser.Platform | ||||||
---|---|---|---|---|---|---|
.name | .win | .linux | .mac | .ipod | .other | |
Windows | win | true | undefined | undefined | undefined | undefined |
Linux | linux | undefined | true | undefined | undefined | undefined |
Mac | mac | undefined | undefined | true | undefined | undefined |
iPod | ipod | undefined | undefined | undefined | true | undefined |
Autres (BSD, ...) | other | undefined | undefined | undefined | undefined | true |