145 votes

Comment différencier l'événement de simple clic et l'événement de double clic ?

J'ai un seul bouton dans li avec id "my_id" . J'ai attaché deux événements jQuery avec cet élément

1.

$("#my_id").click(function() { 
    alert('single click');
});

2.

$("#my_id").dblclick(function() {
    alert('double click');
});

Mais à chaque fois, ça me donne le single click

0 votes

Le simple clic devra toujours se déclencher, il est impossible de savoir si un double clic va se produire à moins qu'il ne se produise effectivement dans le temps de double clic spécifié.

8 votes

C'est possible, vérifiez ma réponse. Vous devez attendre quelques ms après le premier clic et vérifier s'il y a un nouveau clic jusqu'au moment spécifié. De cette façon, vous êtes en mesure de savoir s'il s'agit d'un simple ou d'un double clic.

0 votes

Un inconvénient dans la façon dont les choses sont câblées dans la vie, si vous vous souciez de distinguer et d'utiliser les deux événements, alors vous pouvez avoir besoin de retarder l'action du simple clic jusqu'à ce que vous sachiez s'il y a un double en cours. Si vous avez des raisons de ne pas déclencher les deux.

85voto

rxgx Points 2468

Le comportement de la dblclick L'événement est expliqué à Quirksmode .

L'ordre des événements pour un dblclick est :

  1. mousedown
  2. mouseup
  3. cliquez sur
  4. mousedown
  5. mouseup
  6. cliquez sur
  7. dblclick

La seule exception à cette règle est (bien sûr) Internet Explorer avec son ordre personnalisé de :

  1. mousedown
  2. mouseup
  3. cliquez sur
  4. mouseup
  5. dblclick

Comme vous pouvez le constater, l'écoute simultanée de ces deux événements sur le même élément entraînera des appels supplémentaires à la fonction click manipulateur.

0 votes

Pas sûr dblclick est même fiable... si je clique une fois... attends une seconde ou deux, puis clique à nouveau, j'obtiens un dblclick au deuxième clic !

0 votes

Ces longs clics sont utiles, par exemple, pour renommer des fichiers. Ce serait bien s'il y avait un paramètre comme 'longClick' pour les distinguer.

1 votes

Lorsque event.detail est disponible, c'est le meilleur moyen de détecter un double-clic à partir du gestionnaire de clics. Voir cette réponse .

77voto

Adrien Schuler Points 1336

Vous devez utiliser un délai d'attente pour vérifier s'il y a un autre clic après le premier.

Voici l'astuce :

// Author:  Jacek Becela
// Source:  http://gist.github.com/399624
// License: MIT

jQuery.fn.single_double_click = function(single_click_callback, double_click_callback, timeout) {
  return this.each(function(){
    var clicks = 0, self = this;
    jQuery(this).click(function(event){
      clicks++;
      if (clicks == 1) {
        setTimeout(function(){
          if(clicks == 1) {
            single_click_callback.call(self, event);
          } else {
            double_click_callback.call(self, event);
          }
          clicks = 0;
        }, timeout || 300);
      }
    });
  });
}

Utilisation :

$("button").single_double_click(function () {
  alert("Try double-clicking me!")
}, function () {
  alert("Double click detected, I'm hiding")
  $(this).hide()
})

<button>Click Me!</button>

EDIT :

Comme indiqué ci-dessous, il est préférable d'utiliser la méthode native dblclick événement : http://www.quirksmode.org/dom/events/click.html

Ou celle fournie par jQuery : http://api.jquery.com/dblclick/

19 votes

Cela semble bien fonctionner en général, mais le temps de latence autorisé entre les clics (par lequel deux clics sont interprétés comme un double-clic) ne diffère-t-il pas selon la configuration du système ? Il est probablement plus sûr de s'appuyer sur la fonction dblclick événement

1 votes

Oui, je pense que tu as raison, dblclick est définitivement la voie à suivre aujourd'hui. jQuery gère également cet événement : api.jquery.com/dblclick

15 votes

@AdrienSchuler - D'après le document que vous mettez en lien : Il est déconseillé de lier des gestionnaires aux événements click et dblclick pour le même élément. La question porte sur le fait d'avoir les deux .

27voto

Renzo Ciot Points 426

Une fonction simple. Aucun jquery ou autre framework n'est nécessaire. Passez vos fonctions en paramètres

<div onclick="doubleclick(this, function(){alert('single')}, function(){alert('double')})">click me</div>
    <script>
        function doubleclick(el, onsingle, ondouble) {
            if (el.getAttribute("data-dblclick") == null) {
                el.setAttribute("data-dblclick", 1);
                setTimeout(function () {
                    if (el.getAttribute("data-dblclick") == 1) {
                        onsingle();
                    }
                    el.removeAttribute("data-dblclick");
                }, 300);
            } else {
                el.removeAttribute("data-dblclick");
                ondouble();
            }
        }
    </script>

2 votes

Je pense que cela devrait être la meilleure réponse.cependant, j'ai dû réduire le timeout à 200 pour que cela fonctionne sous Windows IE8, mais cette valeur peut dépendre du système d'exploitation et de l'utilisateur. Et j'ai également enregistré la référence du timer pour pouvoir annuler l'exécution du clic si un double clic est enregistré.

0 votes

Merci pour ce morceau de code, il fonctionne parfaitement sur chrome et firefox (bien que chrome n'ait pas besoin de ce hack pour fonctionner avec dbl et single).

0 votes

En utilisant el.dataset.dblclick serait une façon plus agréable de le faire maintenant.

12voto

Álvaro G. Vicario Points 57607

Je crains que le comportement ne dépende du navigateur :

Il est déconseillé de lier des gestionnaires aux événements événements click et dblclick pour le même élément. le même élément. La séquence des événements déclenchés varie d'un navigateur d'un navigateur à l'autre, certains recevant deux deux événements de clic avant le dblclick et d'autres un seul. Double-clic (temps maximal entre deux clics qui est détecté comme un double double clic) peut varier selon le système d'exploitation et le navigateur, et est souvent configurable par l'utilisateur.

http://api.jquery.com/dblclick/

En exécutant votre code dans Firefox, l'alert() dans la section click() vous empêche de cliquer une seconde fois. Si vous supprimez cette alerte, vous obtenez les deux événements.

1 votes

Lorsque event.detail est disponible, c'est le meilleur moyen de détecter un double-clic à partir du gestionnaire de clics. Voir cette réponse .

11voto

bradley.ayers Points 13360

Pour faire un double clic (cliquer deux fois), il faut d'abord cliquer une fois. Le site click() se déclenche lors du premier clic, et comme l'alerte s'affiche, vous n'avez pas la possibilité de cliquer une seconde fois pour déclencher la fonction dblclick() manipulateur.

Changez vos gestionnaires pour faire autre chose qu'un alert() et vous verrez le comportement. (changez peut-être la couleur de fond de l'élément) :

$("#my_id").click(function() { 
    $(this).css('backgroundColor', 'red')
});

$("#my_id").dblclick(function() {
    $(this).css('backgroundColor', 'green')
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X