OVH Cloud OVH Cloud

onDblClick et sélection mot

3 réponses
Avatar
Pierre Goiffon
Bonjour,

Je viens d'ajouter un événement onDblClick sur un Tr d'un tableau. Ca
marche bien, mais j'ai un petit soucis esthétique : lorsque l'on double
clique sur un mot dans une phrase, le mot est sélectionné... et donc
apparait en surbrillance, avant que l'action onDblClick ne se lance !

Y-a-t-il un moyen d'éviter cette mise en surbrillance, tout en
permettant des sélection manuelles ?

3 réponses

Avatar
Saad Saad
Bonjour,

Je viens d'ajouter un événement onDblClick sur un Tr d'un tableau. Ca
marche bien, mais j'ai un petit soucis esthétique : lorsque l'on double
clique sur un mot dans une phrase, le mot est sélectionné... et donc
apparait en surbrillance, avant que l'action onDblClick ne se lance !

Y-a-t-il un moyen d'éviter cette mise en surbrillance, tout en
permettant des sélection manuelles ?



<body onselectstart="return false;">

ne fonctionne que sur IE

Avatar
Laurent Vilday
Je viens d'ajouter un événement onDblClick sur un Tr d'un tableau. Ca
marche bien, mais j'ai un petit soucis esthétique : lorsque l'on double
clique sur un mot dans une phrase, le mot est sélectionné... et donc
apparait en surbrillance, avant que l'action onDblClick ne se lance !


C'est sur le premier mousedown que l'event de sélection commence pour
FX1.5 et opera9, sur selectstart pour IE6.

Cependant chaque navigateur dispatch les events selon sa sauce, et
encore, j'ai pas Safari ou Konqueror sous la main pour tester.

Ainsi, l'ordre des events lors d'une sélection au simple et double click
sont les suivants (avec *e* la variable representant l'event dans la
function) :

* FX 1.5
- simple click
mousedown (e.detail == 1)
mouseup (e.detail == 1)
- par double click
mousedown (e.detail == 1)
mouseup (e.detail == 1)
mousedown (e.detail == 2)
mouseup (e.detail == 2)
dblclick (e.detail == 2)

* Opera 9
- simple click
mousedown (e.detail == 1)
mouseup (e.detail == 1)
- par double click
mousedown (e.detail == 1)
mouseup (e.detail == 1)
dblclick (e.detail == 2)

* IE 6 (pas d'infos pour aucun des events)
- simple click
mousedown
selectstart
mouseup
- par double click
mousedown
mouseup
selectstart
mouseup
dblclick

Y-a-t-il un moyen d'éviter cette mise en surbrillance, tout en
permettant des sélection manuelles ?


Eheh, le beurre et l'argent, le tout avec un mars, merci :p

C'est facilement réalisable avec FX1.5, un peu moins avec IE6, par
contre j'arrive pas à conserver la sélection sur simple click avec
Opéra9, mais je m'y attendais vu l'ordre des events.

* FX1.5 :

Comme je disais au début, l'event de sélection commence sur le
mousedown. Lorsqu'il s'agit d'un simple click, la propriété détail
(event.detail) == 1, quand il s'agit d'un double click, cette même
propriété est à 2. Donc

element.onmousedown = function(e)
{
if ( e.detail == 2)
{
// double click c'est PAS ok pour la sélection
return false;
}
return true;
// plus simplement :
// return e && e.detail === 1;
};

* Opéra 9

Déjà, il y a un problème supplémentaire : Opéra 9 ouvre un menu
contextuel sur le double-click. Cependant, j'était content quand j'ai
découvert que la propriété detail de l'event existait aussi pour lui.
Malheureusement, comme vu dans l'ordre des events, cette propriété est à
2 uniquement lors du dblclick, hors c'est déjà trop tard pour annuler la
sélection qui a commencé sur le mousedown.
Je ne vois pas de solution pour avoir un dblclick sans sélection tout en
conservant la sélection au simple click. Tout ce que j'ai pu trouver,
c'est d'annuler purement et simplement toute sélection :(

element.onmousedown = function(e)
{
return false; // :(
};

* IE 6

Pour lui, la selection se gère sur le onselectstart mais pareil que pour
Opera 9, j'ai rien trouvé permettant de détecter si c'est une sélection
sur simple click ( drag ) ou sur double click dans l'objet window.event.
Par contre, puisque l'ordre des events est différents selon qu'il
s'agisse d'un simple ou double click, on peut tricher avec une variable
indiquant l'état.

sur le mousedown, on place la variable *is_started* à true
sur le mouseup, on place la variable *is_started* à false
ainsi, sur le selectstart, si *is_started* est true, c'est qu'on est
dans le cas d'un simple click, donc l'event doit correctement continuer.
Et dans le cas contraire, et bien il faut annuler. (cf ordre des events
au début du post)

element.onmousedown = function()
{
this.is_started = true;
};

element.onmouseup = function()
{
this.is_started = false;
};

element.onselectstart = function()
{
return this.is_started;
};

Donc le tout, en version bete et méchante, pas optimisée, qui utilise le
modèle traditionnel et ne soucie *pas* de vérifier si ca écrase
l'existant (donc à ne PAS utiliser tel quel mais s'en inspirer selon le
besoin, j'aurais prévenu), ça donne ceci :

function desactiveSelection(E)
{
var ie = false;
/*@cc_on ie = true; @*/
if ( window.opera )
{
E.onmousedown = function(e) { return false; };
}
else if ( ie )
{
E.onmousedown = function() { this.is_started = true; };
E.onmouseup = function() { this.is_started = false; };
E.onselectstart = function() { return this.is_started; };
}
else
{
E.onmousedown = function(e) { return e && e.detail === 1; }
}
}

http://mokhet.com/tests/tr_dblclick.html

--
laurent

Avatar
Pierre Goiffon
Laurent Vilday wrote:
Je viens d'ajouter un événement onDblClick sur un Tr d'un tableau. Ca
marche bien, mais j'ai un petit soucis esthétique : lorsque l'on
double clique sur un mot dans une phrase, le mot est sélectionné... et
donc apparait en surbrillance, avant que l'action onDblClick ne se
lance !


C'est sur le premier mousedown que l'event de sélection commence pour
FX1.5 et opera9, sur selectstart pour IE6.
(...)

Donc le tout, en version bete et méchante, pas optimisée, qui utilise le
modèle traditionnel et ne soucie *pas* de vérifier si ca écrase
l'existant (donc à ne PAS utiliser tel quel mais s'en inspirer selon le
besoin, j'aurais prévenu), ça donne ceci :
(...)


J'arrive largement après la guerre, mes excuses
En tout cas je vois cette réponse très complète, merci milles fois ! Je
vais voir à partir de ces conseils et informations