Solution élegante pour le probleme du OnClick OnChange sur une checkbox

Lorsque vous souhaitez faire évoluer le contenu de votre page Web lorsque qu’un utilisateur clic sur une case à cocher, On est rapidement confronté au problème du OnChange qui agit différemment en fonction des navigateurs.

Mais lequel des navigateurs a raison d’après les standards ?

D’après mes recherche, il semblerait que les standards ne soit pas assez précis sur un point : La définition exacte de la perte du focus.

Si vous consultez les standards sur l’évènement onchange http://www.w3.org/TR/REC-html40/interact/scripts.html#h-18.2.3, vous verrez qu’il y est clairement explicité que le onchange doit être appelé lorsque le contrôle perd le focus et que la valeur a changé depuis qu’il a reçu le focus.

Il est explicité ici quand est ce qu’un contrôle reçoit le focus : http://www.w3.org/TR/html401/interact/forms.html#h-17.11, mais il ne permet de déterminer précisément à quel moment un contrôle perd le focus.

La solution la plus simple pour remédier à ce problème est de ne pas utiliser le onchange sur une checkbox, mais le onclick.

Toutefois, cette solution ne fonctionne pas dans tous les cas. En particulier lorsque la méthode appelée en javascript est complexe et appelle des fonctions d’annulation d’évènements. Dans ce dernier cas, l’action est réalisée, mais la case à cocher ne se décoche par sur Internet Explorer.

Alors une idée m’est venue, puisque le problème  sous-jacent est un problème de moment ou le contrôle perd le focus, pourquoi ne pas nous même décider du moment ou le focus est perdu ?

exemple :

<input type="checkbox" onclick="$(this).blur();" onchange="alert('modifié');"/>

(utilise le framework jQuery pour l’appel du blur).

Cette exemple fonctionne de la même façon sur tous les Navigateurs et si vous devez appeler des fonctions d’annulations d’évènements dans le onchange, on pourra toujours cocher et décocher la case sous Internet Explorer.

Exemple concret du problème sous Internet Explorer : http://webbugtrack.blogspot.com/2007/11/bug-193-onchange-does-not-fire-properly.html

IIS Application WarmUP

Lorsque dans votre application ASP.NET vous souhaitez effectuer des actions a heures précises, vous ne pouviez jusqu’à présent le faire de façon fiable qu’en utilisant un Service Windows ou en utilisant le gestionnaire de taches planifiées.

La complexité de la solution “service windows” est la communication entre ce service et l’application ASP.NET. La solution que j’ai trouvé la plus fiable jusque la est l’utilisation du Remoting.

Mais, la solution la plus simple, était de mettre dans l’application ASP.NET un thread qui fournissait cette fonctionnalité. Je n’ai pas utilisé jusque là cette solution car lorsque l’application était recyclée et qu’aucun utilisateur ne se connectait au site internet l’action planifiée n’était pas déclenchée.

Récemment, je suis tombé sur l’Application WarmUP (Béta 1) de Microsoft. Ce produit a comme fonctionnalité principale de précharger l’application permettant ainsi une meilleure réactivité pour le premier utilisateur.

Il se pourrait bien que cette application me permette aussi de m’affranchir de la lourdeur de déployer un service Windows ou une tache planifiée !

Update 25/10/2010 : Après une série de tests, c’est concluant !

Ajax et l’historique du navigateur

Un problème récurent lorsque l’on développe une application << Web 2.0 >> est l’utilisation du bouton back par l’utilisateur.
Dans la plupart des cas, les appels AJAX ne sont pas historisés amenant a une page qui ne correspond plus à la dernière action de l’utilisateur.
Ramener l’utilisateur à la visu après son dernier appel Ajax ne résoudrait pas tous les problèmes, mais amènerait déjà une amélioration.

Au moins deux approches pour corriger ce problème existent.
– Utiliser un framework gérant un historique au niveau du serveur et ramener une information cohérente. Cette approche bien que la plus fiable entraine une complexité au niveau du développement, des temps de chargements allongés, une surcharge en trafic réseau qui ne saurait en faire une alternative raisonnable dans la plupart des développements “Agile”.
– Utiliser un framework simulant un changement de page apres une activité AJAX permettant de “forcer” le navigateur a ajouter un evenement affectant l’historique. Le coup d’intégration de cette solution est variable en fonction de la méthode utilisée mais reste inférieure a une solution serveur.

La deuxième approche est dans la plupart des cas retenue, elle peut elle même se décliner en plusieurs sous approche :
– Intégration simple : intégration au niveau des liens et bouton d’un handler gardant l’état précédent.
– Intégration spécifique : Au retour des appels Ajax appeler une méthode permettant d’historiser le changement.

Même si l’intégration spécifique est un peu plus couteuse, personnellement je préfère utiliser cette dernière.

Liens :
http://code.google.com/p/reallysimplehistory/

http://www.balupton.com/projects/jquery-history
http://www.balupton.com/#/projects/jquery-ajaxy

Mais techniquement quel est le principe de cette seconde approche ?
C’est on ne peu plus simple, elle utilise une des fonctions existant depuis la nuit des temps en HTML, les liens inter-ancre :
<a href=”#madeuxiemeancre”>goto</a> <a name=”madeuxiemeancre”></a>
le navigateur historise un evenement lors de cette navigation. Il ne reste plus qu’a ramener en javascript le contenu correspondant au #madeuxiemeancre

AJAX – Introducing AJAX Navigations

Pourquoi Outlook cache t’il les images par défaut ?

Par défaut lorsque vous ouvrez un mail, Outlook n’affiche pas les images venant du Web et vous demande si vous souhaitez les afficher. Dans mon entourage un certain nombre de personne me font la réflexion que c’est perdre du temps de devoir cliquer sur afficher.

Mais alors pourquoi ?

La réponse est simple : pour vous protéger !

Mais de quoi ?
Voila deux raisons :
– Des virus exploitant un bug dans le programme affichant les images à l’écran.
– De la confirmation de lecture du mail sans votre consentement.

Malheureusement le SPAM étant ce qu’il est à l’heure actuelle, il vaut mieux pour éviter de recevoir trop de courrier non sollicité de confirmer que votre adresse mail existe vraiment. Et c’est ce que permettent les images insérées dans les mails.

Explications :

Lorsque votre outil de courrier préféré reçoit un mail avec une image pointant sur internet, il va se connecter au serveur distant pour aller chercher l’image. A ce moment la le serveur distant va noter que vous vous êtes connecté et noter précieusement que votre adresse mail est valide. Cela lui permettra de se faire un petit peu d’argent sur votre dos, car un mail commercial qui a été lu est payé plus cher qu’un mail dont on ne sait pas s’il a été lu ou pas. De même votre adresse email sera revendue plus cher si on a confirmation qu’il y a un être humain derrière. Et vous financerez indirectement les SPAM qui polluent nos boite aux lettres.

Il en va de même pour la confirmation de lecture de messages. Il est déconseillé pour les même raisons que cité précédemment de l’activer en automatique. Si vous avez le courage activé la à la demande. La situation la plus simple est de la désactiver totalement.