2011-07-14 4 views
105

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

Par exemple,

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

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

Il m'a fallu un certain temps pour comprendre comment google cette question. – minexew

+0

@minexew La plus grande partie de l'utilisation de la programmation consiste à nommer les variables et à résoudre les problèmes de google!: P –

Répondre

163

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 dans le 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

@Nicola Est-ce documenté quelque part? –

+0

@Sime je ne sais pas, mais je pense que c'est standard. regardez ici: http: //api.jquery.com/category/events/event-object/ –

+0

@Nicola Je vois, c'est une chose jQuery. jQuery stocke l'objet d'événement d'origine dans cette propriété. Btw, qu'est-ce que tu veux dire que tu ne sais pas? Vous venez de fournir le lien vers la documentation ':)' –

5

Je pense que la seule façon de le faire serait de passer un paramètre supplémentaire sur l'appel trigger selon le documentation.

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

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

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

+1

vous pouvez consulter la propriété originalEvent de l'objet événement: si l'événement ne vient pas d'un clic, il est indéfini –

+0

[Passer des données avec déclencheur] (http://api.jquery.com/trigger/) est certainement la voie à suivre pour les événements délégués. [Au moins, l'événement click ne semble pas prendre de paramètres] (http://jsfiddle.net/notacouch/Uf8Wv/69/). Mais [si vous faites un événement personnalisé, alors le passage des paramètres ne devrait pas poser de problème] (http://jsfiddle.net/notacouch/Uf8Wv/68/). – notacouch

+1

Pour une raison quelconque, l'event.originalEvent ne fonctionnait pas pour moi (juste gardé 1) en utilisant le gestionnaire 'click' de Zepto. J'ai donc essayé la solution ci-dessus. Travaillé comme un charme. – Larrydx

1

Je pense au sujet d'une possibilité où vous vérifiez la position de la souris, comme:

  • Cliquez
  • Get position de la souris
  • recouvre les coords du bouton
  • ...
+0

Je ne peux pas travailler sur le scénario suivant: Il est parfois possible de sélectionner les éléments de la page en utilisant 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 un drodpdown en utilisant la touche fléchée vers le bas. –

13

plus direct que ci-dessus serait:

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

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

C'est la meilleure réponse. Pour des explications, voir: http://stackoverflow.com/questions/10704168/in-javascript-what-is-event-istrigger – jaredjacobs

+1

Bien que ce soit tentant et probablement confortable dans la pratique, notez que les développeurs de jQuery ne souhaitent pas obtenir leur diplôme ' isTrigger' à l'API publique [à ce jour] (https://github.com/jquery/api.jquery.com/issues/319). – Jon

1

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

+0

Je ne peux pas travailler sur le scénario suivant: Il est parfois possible de sélectionner les éléments de la page en utilisant la touche 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 un drodpdown en utilisant la touche fléchée vers le bas. –

1

La réponse acceptée n'a pas fonctionné pour moi. Ça fait 6 ans et jQuery a beaucoup changé depuis. Par exemple event.originalEvent renvoie toujours true avec jQuery 1.9.x. Je veux dire que l'objet existe toujours mais le contenu est différent.

Ceux qui utilisent les nouvelles versions de jQuery peuvent essayer celui-ci. Fonctionne sur Chrome, Edge, IE, Opera, FF

if ((event.originalEvent.isTrusted === true && event.originalEvent.isPrimary === undefined) || event.originalEvent.isPrimary === true) { 
    //Hey hooman it is you 
} 
-1

Incase vous avez le contrôle de tout votre code, aucun appel étranger $(input).focus() que setFocus().

Utiliser une variable globale est une méthode correcte pour moi.

var globalIsHuman = true; 

$('input').on('focus', function(){ 
    if(globalIsHuman){ 
     console.log('hello human, come and give me a hug'); 
    }else{ 
     console.log('alien, get away, i hate you..'); 
    } 
    globalIsHuman = true; 
}); 

// alien set focus 
function setFocus(){ 
    globalIsHuman = false; 
    $('input').focus(); 
} 
// human use mouse, finger, foot... whatever to touch the input 

Si certains étrangers veulent toujours appeler $(input).focus() d'une autre planète. Bonne chance ou vérifiez d'autres réponses

+0

Cela empêche seulement les gens d'appeler 'setFocus()' - cela n'empêche pas les gens de déclencher l'événement focus. Ne pas écrire 'setFocus()' empêcherait les gens de l'appeler, donc je ne vois pas l'avantage. En fait, les gens peuvent toujours appeler '$ ('input'). Focus()' et le faire passer. – Rob

+0

wow, la première fois que j'ai quelqu'un commentaire juste après avoir répondu à la question, je vais mettre à jour la réponse – vanduc1102

Questions connexes