2016-03-22 5 views
0

genannt Ich habe eine KeyUpHandler zu einem Button Objekt wie folgt hinzugefügt:GWT keyUpHandler wird mehrmals statt einer

button.addKeyUpHandler(new KeyUpHandler() { 

     @Override 
     public void onKeyUp(final KeyUpEvent event1) { 
      if (event.isDownArrow()) { 
        counter++; 
      } 
     } 
    }); 

Allerdings, wenn ich für Schritt mit SuperDev Modus Schritt debuggen, gibt es zwei Anrufe an die onKeyUp wobei der erste Aufruf immer counter initial ist (0 in diesem Fall) und der zweite Aufruf hat den letzten -hielten-Wert von counter. Die Methode, bei der ich die Logik onKeyUp hinzugefügt habe, ist auch als synchronized gekennzeichnet. Ich habe auch versucht, removeHandler() Methode von HandlerRegistration direkt nach onKeyUp aufgerufen wird. Das Ergebnis war, dass die erwähnten zwei Anrufe nach dem ersten Tastendruckereignis auftraten, aber als ich ein weiteres Tastendruckereignis ausführte, passierte nur ein weiterer Anruf und es gab keinen weiteren Tastendruckereignisbereich. Ich gehe davon aus, dass dies mit dem Superdev-Modus etwas zu tun hat oder nach der Kompilierung ein interner Overhead entsteht. Was ist der richtige Weg, Event-Handler bei GWT hinzuzufügen? Müssen wir uns immer um jeden Handler kümmern, indem wir removeHandler() Methode der HandlerRegistration aufrufen?

+0

Fügen Sie den Handler mehrmals hinzu? – Baz

+0

Ja, aber verschiedene Handler - MouseUpHandler und KeyUpHandler. Ich füge den KeyUpHandler jedoch über ein Runnable hinzu, während MouseUpHandler hinzugefügt wird, wenn ein Button-Objekt erstellt wird. Ich habe auch festgestellt, dass ClickHandler für Tastatur- und Mausereignisse aufgerufen wird. – baris

+1

Der von Ihnen erstellte Handler ruft in einer beliebigen Schleife auf? –

Antwort

0

Re: Ihre Kommentare über mehrere Anrufe für Klick/mouseup/keyup

Der Browser „hilft“ für die Click-Handler durch Brennen, wenn ein Ereignis wirksam würde klicken, entweder mousedown-, dann mouseup aber keine Anstalten, oder verschiedene Touch- oder Keyboard-Events. Erwägen Sie den Aufruf von preventDefault() für ein Ereignis, das Sie bereits behandelt haben, und Sie möchten nicht, dass der Browser sich weiter ansieht - wenn Sie dies zum Beispiel bei mouseup und keyup aufrufen, sollten diese bestimmten Aktionen nie zu Klickereignissen führen.

+0

ja, das habe ich jetzt versucht, aber nicht geändert. Siehe meine aktualisierte Frage. – baris

Verwandte Themen