Détection de fonctionnalités

Durant les premières années de développement, la librairie javascript rnb-js se basait essentiellement sur la détection des navigateurs pour implémenter une action ou un comportement. Depuis plusieurs mois, j'applique plutôt une technique fortement recommandée : la détection de fonctionnalités.

Pouvoir détecter dans quel environnement un code javascript va s'exécuter est indispensable pour une seule et unique raison : les navigateurs ne supportent pas forcément les recommendations web (principalement DOM dans le cas du javascript) au même moment et/ou de la même manière. Pour être honnête, cette problématique a surtout été critique à une époque où le navigateur web le plus utilisé (Internet Explorer) était - comment le dire sans devenir trop grossier - une vraie bouse se foutant totalement des « standards », et que la poigné de concurrents à utilisation confidentielle (Mozilla, Opera) les implémentaient à peu près de la même manière. Le code javascript était dés lors truffé de choses du genre :

if (/* is Internet Explorer ? */) {
    // do something for Internet Explorer
} else {
    // do something for the rest of the world
}
Détection de navigateur web.

Depuis, la révolution Firefox a eu lieu, Google Chrome est apparu, Microsoft a réactivé son équipe de développement pour nous offrir un navigateur enfin correct (IE 8/9) : le respect des standards est (re)devenu la ligne directrice de l'évolution des navigateurs web.

Il n'en reste pas moins qu'il est toujours nécessaire de savoir dans quel contexte s'exécute vos scripts : si le respect généralisé des standards facilite l'écriture du code, il y a toujours des différences d'implémentations entre logiciels, voire même entre différentes versions d'un même programme. Il est donc plus judicieux de savoir si une fonctionnalité est implémentée plutôt que de connaître le nom du navigateur :

if (/* has some feature ? */) {
    // do something with that feature
} else {
    // do something to imitate that feature
}
Détection de fonctionnalité.

Cela fait plusieurs années que cette technique est fortement encouragée et, pour être honnête, j'aurai pu l'utiliser dés le début. Il était cependant plus facile (et plus rapide) de créer une dichotomie « IE / reste du monde », suffisante pour répondre à 99% des cas d'utilisation d'un code. Aujourd'hui, avec un paysage beaucoup plus équilibré mais diversifié, avec la course aux « armements techniques » menées par les producteurs de navigateurs web, cette solution n'est plus du tout optimale ; la détection de fonstionnalité est devenue la seule voie permettant de maintenir un code un tant soit peu robuste.

Pourquoi cet enfonçage de porte ouverte aujourd'hui ? Parce que je lutte depuis plusieurs semaines au boulot sur le debogage d'applications sous IE 9, presque uniquement parce que la librairie javascript utilisée, plutôt récente, en est restée à la détection de navigateurs au lieu de passer à la détection de fonctionnalités.

CLARY, Bob. Browser Detection and Cross Browser Support. MDN,