Überprüfen Sie, ob ein Ereignis von einem Menschen ausgelöst wird

140

Ich habe einen Handler an ein Ereignis angehängt und möchte, dass er nur ausgeführt wird, wenn er von einem Menschen und nicht von einer trigger () -Methode ausgelöst wird. Wie erkenne ich den Unterschied?

Beispielsweise,

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

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

Antworten:

212

Sie können überprüfen e.originalEvent: Wenn es definiert ist, ist der Klick menschlich:

Schauen Sie sich die Geige an http://jsfiddle.net/Uf8Wv/

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

Mein Beispiel in der Geige:

<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();
});
Nicola Peluchetti
quelle
1
@Nicola Ist das irgendwo dokumentiert?
Šime Vidas
@Sime weiß ich nicht, aber ich denke, es ist Standard. Schauen Sie hier: api.jquery.com/category/events/event-object
Nicola Peluchetti
@Nicola Ich verstehe, es ist eine jQuery-Sache. jQuery speichert das ursprüngliche Ereignisobjekt in dieser Eigenschaft. Übrigens, was meinst du damit, dass du es nicht weißt? Sie haben gerade den Link zur Dokumentation bereitgestellt:)
Šime Vidas
1
Sieht so aus, als könnten Sie auch verwendenevent.isTrigger
avoliva
1
@ Anurag, ich hatte gerade das gleiche Problem. Es sieht so aus, als würde jQuery gefüllt, originalEventwenn das Ereignis ausgelöst wird DOM.click(), aber Sie können verwenden $($("#try")[0]).click();, was klobig ist, aber funktioniert.
Daniel Garrett
19

Einfacher als oben wäre:

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

$('.checkbox').trigger('change'); //doesn't alert
Kenneth Spencer
quelle
Dies ist die beste Antwort. Für eine Erklärung siehe: stackoverflow.com/questions/10704168/…
jaredjacobs
3
Dies ist zwar verlockend und in der Praxis wahrscheinlich gemütlich, beachten Sie jedoch, dass die jQuery-Entwickler ab diesem Zeitpunkt nicht mehr isTriggerzur öffentlichen API wechseln möchten .
Jon
7

Ich denke, dass der einzige Weg, dies zu tun, darin besteht, einen zusätzlichen Parameter für den triggerAufruf gemäß der Dokumentation zu übergeben .

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

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

Beispiel: http://jsfiddle.net/wG2KY/

Detaylor
quelle
1
Sie können die Eigenschaft originalEvent des Ereignisobjekts überprüfen: Wenn das Ereignis nicht von einem Klick kommt, ist es undefiniert
Nicola Peluchetti
1
Aus irgendeinem Grund funktionierte das event.originalEvent bei mir nicht (ich habe nur 1 beibehalten), als ich den 'click'-Handler von Zepto verwendete. Also habe ich die obige Lösung ausprobiert. Lief wie am Schnürchen.
Larrydx
7

Akzeptierte Antwort hat bei mir nicht funktioniert. Es ist 6 Jahre her und jQuery hat sich seitdem sehr verändert.

Gibt beispielsweise event.originalEventimmer truemit jQuery 1.9.x zurück. Ich meine, Objekt existiert immer, aber Inhalt ist anders.

Diejenigen, die neuere Versionen von jQuery verwenden, können diese ausprobieren. Funktioniert mit Chrome, Edge, IE, Opera, FF

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

Derzeit unterstützen die meisten Browser event.isTrusted :

if (e.isTrusted) {
  /* The event is trusted: event was generated by a user action */
} else {
  /* The event is not trusted */
}

Aus Dokumenten :

Die IsTrusted schreibgeschützte Eigenschaft der EventSchnittstelle ist ein , Boolean das ist wahr , wenn das Ereignis durch eine Benutzeraktion erzeugt wurde, und falsch , wenn das Ereignis durch ein Skript erstellt oder geändert wurde oder versandt über EventTarget.dispatchEvent () .

Felipsmartine
quelle
0

Sie können onmousedown verwenden, um einen Mausklick gegen einen Trigger () -Aufruf zu erkennen.

boateng
quelle
Ich arbeite möglicherweise nicht an dem folgenden Szenario: Manchmal ist es möglich, die Elemente der Seite mit der Tabulatortaste auszuwählen. Wenn ich beispielsweise auf diese Weise ein Kontrollkästchen aktiviert habe, kann ich es mit der Leertaste aktivieren / deaktivieren. Oder öffnen Sie einen Drodpdown mit der Abwärtspfeiltaste.
Diego Favero
0

Ich würde über eine Möglichkeit nachdenken, bei der Sie die Mausposition überprüfen, wie:

  • Klicken
  • Mausposition abrufen
  • Überlappt die Koordinaten der Schaltfläche
  • ...
Luke
quelle
Ich arbeite möglicherweise nicht an dem folgenden Szenario: Manchmal ist es möglich, die Elemente der Seite mit der Tabulatortaste auszuwählen. Wenn ich beispielsweise auf diese Weise ein Kontrollkästchen aktiviert habe, kann ich es mit der Leertaste aktivieren / deaktivieren. Oder öffnen Sie einen Drodpdown mit der Abwärtspfeiltaste.
Diego Favero
0

Wenn Sie die Kontrolle über Ihren gesamten Code haben, gibt es keine Alien-Anrufe $(input).focus()als setFocus().

Die Verwendung einer globalen Variablen ist für mich der richtige Weg.

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

Wenn ein Außerirdischer immer noch $(input).focus()von einem anderen Planeten anrufen möchte . Viel Glück oder überprüfen Sie andere Antworten

vanduc1102
quelle
Dies verhindert nur, dass Personen anrufen setFocus()- es verhindert nicht, dass Personen das Fokusereignis auslösen. Überhaupt nicht zu schreiben setFocus()würde auch die Leute daran hindern, es anzurufen, also sehe ich den Vorteil nicht. Tatsächlich könnten die Leute immer noch anrufen $('input').focus()und es passieren lassen.
Rob
Wow, wenn ich zum ersten Mal einen Kommentar habe, nachdem ich die Frage beantwortet habe, werde ich die Antwort aktualisieren
vanduc1102
Wenn Sie in einer geschlossenen Umgebung ohne andere Skripte von Drittanbietern arbeiten, funktioniert dies in einer perfekten Welt. Die meisten praktischen Anwendungen sind jedoch für Client-Sites gedacht, denen alle Arten von Plugins und Skripten hinzugefügt wurden, die diesen Fokus sehr gut nennen können. Eine Sache, die dabei helfen könnte, besteht darin, Ihren Code (und jeden Code, der diese Funktion aufrufen muss) in eine Bereichsfunktion wie diese zu verpacken: (function(){/*your code here*/})();Dies würde verhindern, dass die setFocus-Funktion aufgerufen und der Boolesche Wert von externen Skripten geändert wird.
Xandor