Wie kann ich in jQuery zwischen einem programmatischen und einem Benutzerklick unterscheiden?

Angenommen, ich habe einen Click-Handler definiert:

$("#foo").click(function(e){ }); 

Wie kann ich innerhalb des functionshandlers feststellen, ob das Ereignis programmgesteuert oder vom Benutzer ausgetriggers wurde?

   

Sie können sich das Ereignisobjekt e ansehen. Wenn das Ereignis durch einen echten Klick ausgetriggers wurde, haben Sie innerhalb von e Dinge wie clientX , clientY , pageX , pageY usw., und diese werden Zahlen sein; Diese Zahlen beziehen sich auf die Mausposition, wenn der Klick ausgetriggers wird. Sie sind jedoch wahrscheinlich vorhanden, auch wenn der Klick über die Tastatur ausgetriggers wurde. Wenn das Ereignis durch $x.click() ausgetriggers wurde, haben Sie nicht die üblichen Positionswerte in e . Sie könnten auch die originalEvent $x.click() , die nicht dort sein sollte, wenn das Ereignis von $x.click() .

Vielleicht in etwa so:

 $("#foo").click(function(e){ if(e.hasOwnProperty('originalEvent')) // Probably a real click. else // Probably a fake click. }); 

Und hier ist eine kleine Sandbox zum Spielen: http://jsfiddle.net/UtzND/

Sie können einen zusätzlichen Parameter wie im jQuery-Trigger-Handbuch angegeben verwenden :

 $("#foo").click(function(e, from){ if (from == null) from = 'User'; // rest of your code }); $('#foo').trigger('click', ['Trigger']); 

Es wurde bereits eine andere Frage beantwortet.

Wie erkennt man, ob ein Klick () ein Mausklick ist oder durch einen Code ausgetriggers wird?

Verwenden Sie which Eigenschaft des Ereignisobjekts. Es sollte für codegetriggerte Ereignisse undefined

 $("#someElem").click(function(e) { if (e.which) { // Actually clicked } else { // Triggered by code } }); 

JsFiddle Beispiel – http://jsfiddle.net/interdream/frw8j/

Ich hoffe es hilft!

DOM Level 3 spezifiziert event.isTrusted. Dies wird derzeit nur in IE9 + und Firefox unterstützt (basierend auf meinen Tests. Ich habe auch gelesen (obwohl nicht gründlich erforscht), dass es in einigen Browsern überschrieben werden kann und ist wahrscheinlich noch nicht 100% bereit, tatsächlich vertrauenswürdig zu sein (leider).

Dies ist eine modifizierte Version von @ mu’s Geige, die auf IE und Firefox funktioniert.

Vanila js Lösung:

 document.querySelector('button').addEventListener('click', function (e){ if(e.isTrusted){ // real click. }else{ // programmatic click } }); 

Ich werde mich nicht an der intellektuellen Diskussion beteiligen, der Code, der mir .click() hat, .click() und .trigger('click') filtern-

 $(document).on('click touchstart', '#my_target', function(e) { if (e.pageX && e.pageY) { // To check if it is not triggered by .click() or .trigger('click') //Then code goes here } });