Wiki source code of Séquencement des événements onclick et ondblclick
Last modified by Julien EYMERY on 2015/07/15 15:07
Show last authors
| author | version | line-number | content |
|---|---|---|---|
| 1 | Lorsqu'une balise HTML exploite les événements onclick et ondblclick on constate lors d'un double-clic qu'un événement onclick est déclenché. | ||
| 2 | |||
| 3 | Ce comportement est le comportement natif du système d'exploitation Windows. De plus, l'ordonnancement des événements dépend du navigateur utilisé : | ||
| 4 | |||
| 5 | - Sous IE, on a les événements suivants : onclick puis ondblclick (un seul onclick déclenché avant le double-clic), | ||
| 6 | - Sous Firefox, on a les événements suivants : onclick, onclick puis ondblclick (deux onclick déclenchés avant le double-clic). | ||
| 7 | |||
| 8 | Sous Windows, l'intervalle de temps entre 2 clics permettant de savoir s'il y a double-clic est de 500 ms. Cette valeur est configurable par l'utilisateur (via le Panneau de configuration) et stockée dans la base de registres. | ||
| 9 | |||
| 10 | Comment empêcher le déclenchement du (des) onclick avant le ondblclick ? | ||
| 11 | |||
| 12 | Une première solution : | ||
| 13 | |||
| 14 | |||
| 15 | |||
| 16 | {{code language="js" language="js"}} | ||
| 17 | <script> | ||
| 18 | <!-- | ||
| 19 | // File d'attente des evts onclick | ||
| 20 | var fileEvtClic = new Array(); | ||
| 21 | function execClic () | ||
| 22 | { | ||
| 23 | // Extraire l'evt clic de la file d'attente et | ||
| 24 | // executer le code JS associé | ||
| 25 | var obj = fileEvtClic.shift(); | ||
| 26 | window.eval(obj.tr.getAttribute('onfacticeclic')); | ||
| 27 | } | ||
| 28 | function fctClic (objTr) | ||
| 29 | { | ||
| 30 | var obj = {}; | ||
| 31 | // Ajouter l'evt dans la file d'attente et deferrer son traitement de 300 ms | ||
| 32 | obj.tr = objTr; | ||
| 33 | obj.idTimeOut = setTimeout("execClic()", 300); | ||
| 34 | fileEvtClic.push(obj); | ||
| 35 | } | ||
| 36 | function cancelClic(objTR) | ||
| 37 | { | ||
| 38 | // Un evt double-clic est declenché : | ||
| 39 | // supprimer des evts de clic sur la meme ligne (meme balise TR) | ||
| 40 | // de la file d'attente | ||
| 41 | var i = 0, obj; | ||
| 42 | while (i < fileEvtClic.length) | ||
| 43 | { | ||
| 44 | obj = fileEvtClic[i]; | ||
| 45 | if (obj.tr == objTR) | ||
| 46 | { | ||
| 47 | clearTimeout(obj.idTimeOut); | ||
| 48 | fileEvtClic.splice(i, 1); | ||
| 49 | } | ||
| 50 | else | ||
| 51 | i++; | ||
| 52 | } | ||
| 53 | } | ||
| 54 | --> | ||
| 55 | </script> | ||
| 56 | {{/code}} | ||
| 57 | |||
| 58 | |||
| 59 | |||
| 60 | Sur une balise TR d'une TABLE LISTE par exemple : | ||
| 61 | |||
| 62 | <tr onclick~="fctClic(this)" onfacticeclic~="::ADELIA_EVT(TR_TABLE,:AJAX,:ASYNC,:COMP~=1)" ondblclick~="cancelClic(this);::ADELIA_EVT(TR_TABLE,:AJAX,:ASYNC,:COMP~=1)"> | ||
| 63 | |||
| 64 | Inconvénient de la solution : Elle suppose de connaître l'intervalle de temps entre 2 clics : Cette valeur est une valeur du système d'exploitation et peut varier en fonction de celui-ci (Windows, Mac OS, Linux, etc.). De plus, cette valeur est configurable par l'utilisateur. | ||
| 65 | |||
| 66 | |||
| 67 | Autre solution : Ne pas s' appuyer sur l'événement ondblclick et le simuler : Sur le onclick, déclencher un timer d'une valeur determinée (500 ms par exemple). | ||
| 68 | Pour Firefox : si un autre onclick est déclenché pendant ce laps de temps alors déclencher le pseudo double-clic. | ||
| 69 | Pour IE : si un onmousedown et onmouseup sont déclenchés pendant ce laps de temps alors déclencher le pseudo double-clic. | ||
| 70 | |||
| 71 | Avantage de la solution : Fonctionne sur tous les systèmes d'exploitation. | ||
| 72 | Inconvénient : Dépend du nombre de onclick déclenchés avant le double-clic (donc dépendant du navigateur). | ||
| 73 | |||
| 74 | ((( | ||
| 75 | == (% style="line-height: 1.5;" %)Articles connexes(%%) == | ||
| 76 | ))) | ||
| 77 | |||
| 78 | Les articles connexes apparaissent ici en fonction des étiquettes que vous avez sélectionnées. Cliquez pour modifier la macro et ajouter ou modifier des étiquettes. | ||
| 79 | |||
| 80 | {{liveData sort="doc.date:desc" source="liveTable" properties="doc.title,doc.date,doc.author" description="Recently updated" limit="5" filters="tag=web événement" sourceParameters="translationPrefix=platform.index."}}{{/liveData}} | ||
| 81 |