Je sais : détecter l’activation ou non de JS côté serveur est une science tellement inexacte qu’il n’est pas raisonnable de s’y fier trop. Mais voilà, j’ai beau chercher, j’en ai absolument besoin. Alors j’ai cherché une méthode la plus fiable possible.
La problématique est la suivante : sur le site que j’ai en charge, nous utilisons un webservice pour récupérer les points de livraison les plus proches du client. Une requête asynchrone met à jour dynamiquement une liste de 10 points de retrait, parmi lesquels le client est invité à en choisir un. Tout irait bien si de (trop) nombreux clients n’avaient pas désactivé l’exécution des scripts sur leur navigateur… et comme la plupart ne comprennent pas de quoi il s’agit, cette désactivation n’est généralement pas intentionnelle et dûe à un logiciel antivirus ou autre logiciel poubelle de ce genre.
Ce que je souhaite, c’est afficher une liste de points de livraison d’après la base fournie par le prestataire, mais uniquement dans le cas où le client n’a pas JS activé. Parce qu’un webservice c’est quand même plus moderne et plus confortable. Je n’ai donc pas envie d’alourdir mon serveur MySQL simplement parce que 1% des clients ne sait pas que Javascript ne tourne pas chez lui.
La solution :
- un cookie écrit en JS (ici avec jQuery):
1<script>$.cookie('hasJS', <?php echo $_SESSION['last_activity']?>, {path: '/'});</script> - immédiatement après avoir démarré la session, on sauvegarde la variable de session dans une autre et on l’écrase avec une nouvelle valeur :
123$_SESSION['hasJS'] = isset($_SESSION['last_activity']) ? $_SESSION['last_activity'] : -1;// Update last activity$_SESSION['last_activity'] = time(); - dans mon contrôleur parent (celui dont héritent quasiment tous les autres, au moins sur le front) :
123456public function __construct() {parent::__construct();// Plein d'autres choses$this->hasJs = ((int) Cookie::get('hasJS', -1) === (int) $this->session->get('hasJS'));$this->template->set_global('hasJS', $this->hasJS);}
Oui, cela présente des défauts. Notamment, et pas des moindres, celui d’avoir un retard d’une page. Lors du premier affichage, le cookie n’existe pas encore (il vient d’être déposé, mais n’est pas encore lisible). Il convient donc de faire attention à l’utilisation de cette donnée ainsi récupérée.
En ce qui me concerne, il s’agit d’une étape intermédiaire dans la commande : le client a donc forcément déjà affiché une page (ne serait-ce que pour mettre au panier). Par ailleurs, dans le cas où l’utilisateur a effectivement JS activé et qu’il n’est pas détecté correctement (si le client, vicieux et perfide, a supprimé certains cookies mais pas tous), le seul désagrément que j’aurai sera une interrogation de ma base de données pour afficher des infos qui ne seront pas visible (puisque le webservice sera utilisé en lieu et place du formulaire “statique”).