0

Die Frage klingt vielleicht ein wenig albern, aber ich kann wirklich keine konkrete Lösung dafür finden.Steuern der Ereignisauslösefolge in Javascript

Wir überarbeiten eine vorhandene Legacy-Anwendung, die eine große Anzahl von Formularen und viele mit den einzelnen Formularen verknüpfte Elemente enthält. In den meisten Fällen ist das Ereignis "onblur" einem Element zugeordnet, und das Ereignis "onclick" ist einem anderen suchelementbezogenen Element zugeordnet.

Die Legacy-Anwendung wurde nur im IE unterstützt, der den modalen Dialog verwendet, um eine Validierungsnachricht anzuzeigen, mit der der Codefluss eingefroren wird, bis die Benutzeraktion ausgeführt wird. Aber in der überarbeiteten Anwendung, die Chrome-Unterstützung hat, sind die modalen Fenster nicht anwendbar und der Code-Flow-Freeze wird mit Versprechungen imitiert. Das Problem jetzt mit dem neuen Ansatz ist, wenn der Benutzer einige ungültige Daten in einem Element eingibt und versucht, auf das andere Nachschlageelement zu klicken, das Ereignis 'onblur' auf dem ersten Element und das Ereignis 'onclick' auf dem zweiten Element wird ausgelöst Dies führt gleichzeitig zu mehreren Fenstern (eines für die Validierung und eines für die Suche). Gibt es eine Möglichkeit, das Ereignis "onclick" zu vermeiden, das nach dem Ereignis "onblur" ausgelöst wird? Ist es möglich, gleichzeitige Ereignisauslösung zu vermeiden?

HINWEIS: Es gibt möglicherweise einige Optimierungen wie das Hinzufügen von Timeout und Verschieben der Validierungslogik im 'onclick' -Ereignis des zweiten Elements, um dieses Problem zu lösen. Aber leider kann ich dies nicht als eine Legacy-Anwendung tun und die Menge der Änderungen, die in der gesamten Anwendung durchgeführt werden müssen, ist enorm.

Beispielcode zu erklären, das Problem:

<html> <head><title>Test</title></head> <body> <input type="text" onblur='setTimeout(function(){window.open("http://www.google.com", "BlurWindow","");},5000)' /> <input type="button" onclick='setTimeout(function(){window.open("http://www.bing.com", "ClickWindow","");},5000)' value="popup" /> </body> </html>

Wenn i Schlüssel in einem Text in Textfeld und klicken Sie auf Popup-Schaltfläche, die beide 'Onclick' und 'onblur' Ereignis ausgelöst wird, . Ich brauche einen Weg, um gleichzeitiges Ereignisfeuern zu behandeln. Ist es möglich? Vielen Dank im Voraus

+0

* "die 'onblur' Veranstaltung auf dem ersten Element und dem 'o nclick 'Ereignis auf zweitem Element wird gleichzeitig abgefeuert "* Nein, sind sie nicht. Einer wird gefeuert, und der andere wird danach gefeuert. (Leider könnte es "Klick" * und dann "Verwischen" sein.) Der Haupt-JavaScript-UI-Thread ist genau das: Ein Thread. Es kann nicht zwei Dinge gleichzeitig tun. –

+0

* "Es kann einige Verbesserungen geben, wie das Hinzufügen eines Timeouts und das Verschieben der Validierungslogik im 'onclick'-Event des zweiten Elements, um dieses Problem zu lösen. Aber leider kann ich das nicht tun ..." * Dann ist es unwahrscheinlich um das Problem zu lösen. –

+0

@ T.J.Crowder Danke für die Tipps Crowder.Aber irgendwie habe ich diese Arbeit in IE bekommen, indem ich eine globale Variable eingeführt habe, die verhindert, dass das zweite Fenster mit dem globalen Flag geöffnet wird. Dies ist jedoch nicht in Chrome möglich, da beide Fenster die gleichen globalen Flagwerte aufnehmen und zwei Fenster öffnen – Gandhi

Antwort

0

Wir konnten die Abfolge der Ereignisfeuerung nicht steuern. Daher haben wir einen Workaround durchgeführt, um das Problem zu lösen. Wir erfassen das aktuelle fokussierte Element in einer Variablen und klicken auf ein beliebiges anderes Schaltflächenelement. Wir blockieren das onclick -Ereignis der Schaltfläche, wenn die fokussierte Elementvariable nicht null ist.

Pseudocode wie folgt:

fokussierte Element zu erfassen:

$(":input[type=text]").on('focusin', function() { window.top.prevFocusField = $(this); });

Onclick Aktion zu blockieren:

if (window.top.prevFocusField != null) { return; }