146 votes

Vérifier si l'événement est déclenché par un être humain

J'ai un gestionnaire attaché à un événement et je voudrais qu'il ne s'exécute que s'il est déclenché par un humain, et non par une méthode trigger(). Comment faire la différence ?

Par exemple,

$('.checkbox').change(function(e){
  if (e.isHuman())
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

219voto

Nicola Peluchetti Points 38948

Vous pouvez vérifier e.originalEvent Si elle est définie, le clic est humain :

Regardez le violon http://jsfiddle.net/Uf8Wv/

$('.checkbox').change(function(e){
  if (e.originalEvent !== undefined)
  {
    alert ('human');
  }
});

mon exemple au violon :

<input type='checkbox' id='try' >try
<button id='click'>Click</button>

$("#try").click(function(event) {
    if (event.originalEvent === undefined) {
        alert('not human')
    } else {
        alert(' human');
    }

});

$('#click').click(function(event) {
    $("#try").click();
});

1 votes

@Nicola Est-ce documenté quelque part ?

0 votes

@Sime Je ne sais pas, mais je pense que c'est la norme : api.jquery.com/category/events/event-object

0 votes

@Nicola Je vois, c'est un truc de jQuery. jQuery stocke l'objet original de l'événement à l'intérieur de cette propriété. Btw, que voulez-vous dire par vous ne savez pas ? Vous venez de fournir le lien vers la documentation :)

21voto

Kenneth Spencer Points 214

Plus direct que ce qui précède :

$('.checkbox').change(function(e){
  if (e.isTrigger)
  {
    alert ('not a human');
  }
});

$('.checkbox').trigger('change'); //doesn't alert

0 votes

C'est la meilleure réponse. Pour une explication, voir : stackoverflow.com/questions/10704168/

3 votes

Bien que cela soit tentant et probablement confortable dans la pratique, notez que les développeurs de jQuery ne souhaitent pas faire passer le système à un niveau supérieur. isTrigger à l'API publique à ce jour .

7voto

Smirkin Gherkin Points 4098

Je pense que la seule façon d'y parvenir serait de passer un paramètre supplémentaire à la fonction trigger conformément à la la documentation .

$('.checkbox').change(function(e, isTriggered){
  if (!isTriggered)
  {
    alert ('human');
  }
});

$('.checkbox').trigger('change', [true]); //doesn't alert

Exemple : http://jsfiddle.net/wG2KY/

1 votes

Vous pouvez vérifier la propriété originalEvent de l'objet événement : si l'événement ne provient pas d'un clic, il est indéfini

1 votes

Pour une raison quelconque, event.originalEvent ne fonctionnait pas pour moi (il restait 1) lorsque j'utilisais le gestionnaire 'click' de Zepto. J'ai donc essayé la solution ci-dessus. Cela a fonctionné comme un charme.

-1voto

Luke Points 3231

Je pense qu'il serait possible de vérifier la position de la souris, par exemple :

  • Cliquez sur
  • Obtenir la position de la souris
  • Chevauche les coordonnées du bouton
  • ...

0 votes

Il se peut que cela ne fonctionne pas dans le cas suivant : il est parfois possible de sélectionner des éléments d'une page à l'aide de la touche Tab. Par exemple, si j'ai sélectionné de cette manière une case à cocher, je peux cocher/décocher en utilisant la touche espace . Ou même ouvrir une liste déroulante en utilisant la touche flèche vers le bas .

-1voto

Leon Points 1

Vous pouvez utiliser onmousedown pour détecter le clic de la souris par rapport à l'appel de trigger().

0 votes

Il se peut que je ne fonctionne pas dans le cas suivant : il est parfois possible de sélectionner des éléments de la page à l'aide de la touche de tabulation. Par exemple, si j'ai sélectionné de cette manière une case à cocher, je peux cocher/décocher en utilisant la touche espace . Ou même ouvrir une liste déroulante en utilisant la touche flèche vers le bas .

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