Google Places Autocomplete Das Ereignis place_changed wird nach dem Senden des Formulars ausgelöst, wenn Sie die Eingabetaste drücken

8

Ich habe google.maps.places.Autocomplete aus der Google Maps JavaScript API V3 in ein einfaches Suchformular eingefügt. Ich versuche eine zuverlässige Möglichkeit zu finden, zu erkennen, ob der Benutzer ein Element aus der Autocomplete-Liste (entweder mit der Maus oder der Tastatur) ausgewählt hat oder Freiform-Text einreicht.

Code: Ссылка

Ich teste mit den folgenden grundlegenden Szenarien, von denen jedes zu einer Formularübergabe führen sollte. locMatch sollte true sein, wenn der Benutzer ein Autocomplete-Objekt ausgewählt hat.

  1. Geben Sie einen freien Text ein und drücken Sie die Eingabetaste:
    • place_changed gefeuert
    • onSubmit gefeuert. locMatch: false
  2. Geben Sie Text ein, verwenden Sie den Abwärtspfeil, um einen Ort auszuwählen, und drücken Sie die Eingabetaste:
    • onSubmit gefeuert. locMatch: false
    • place_changed gefeuert (zu spät!)
  3. Geben Sie Text ein, verwenden Sie die Maus, um einen Ort auszuwählen, klicken Sie auf "Senden":
    • place_changed gefeuert (nach dem Klicken auf den Ort)
    • onSubmit gefeuert. locMatch: true (nach dem Klicken auf die Schaltfläche)
  4. Geben Sie Text ein, verwenden Sie die Maus, um einen Ort auszuwählen, ändern Sie den Text in eine freie Zeichenfolge, drücken Sie die Eingabetaste:
    • place_changed gefeuert (nach dem Klicken auf den Ort)
    • place_changed gefeuert (nachdem ein neuer Text eingegeben und die Eingabetaste gedrückt wurde)
    • onSubmit gefeuert. locMatch: false
  5. Geben Sie Text ein, verwenden Sie die Maus, um einen Ort auszuwählen, ändern Sie den Text in eine freie Zeichenfolge, klicken Sie auf "Senden":
    • place_changed gefeuert (nach dem Klicken auf den Ort)
    • onSubmit gefeuert. locMatch: true (nach Eingabe eines neuen Textes und Klick auf die Schaltfläche)
  6. Geben Sie Text ein, verwenden Sie die Maus, um einen Ort auszuwählen, geben Sie einen neuen Text ein, verwenden Sie den Abwärtspfeil, um einen Ort auszuwählen, und drücken Sie die Eingabetaste
    • place_changed gefeuert (nach dem Klicken auf den Ort)
    • onSubmit gefeuert. locMatch: true (nach Eingabe eines neuen Textes und Klick auf die Schaltfläche)
    • place_changed gefeuert

Nur die Fälle 1, 3 und 4 funktionieren wie erwartet.

In # 2 wird onSubmit vor place_changed ausgelöst, sodass es keine Chance hat, locMatch zu setzen, bevor das Formular gesendet wurde. Es hilft nicht, place_changed manuell auszulösen, denn obwohl das Eingabefeld den richtigen Text hat, bleibt autocomplete.getPlace () undefiniert, bis das Senden des Formulars ausgelöst wird. Ich konnte es zwingen, mit einem schrecklichen setTimeout-Hack wie folgt zu arbeiten:

%Vor%

Ich würde wirklich gerne einen vernünftigeren Weg finden, das zu beheben. Ich kann mir vorstellen, dass der Timeout-Wert von den technischen Daten eines Benutzers abhängt und ich keine unnötige Verzögerung möchte.

In # 5 ruft es nach dem Drücken der Eingabetaste nicht place_changed auf. Erneut habe ich versucht, ein Ereignis place_changed im Submit-Handler auszulösen, aber dies hat keine Auswirkungen, weil getPlace () den zuvor ausgewählten Wert zurückgibt, obwohl der Benutzer es im Eingabefeld eingegeben hat. Eine Möglichkeit, dies zu lösen, ist das Zurücksetzen von locMatches bei Änderung, aber dies unterbricht unten Nr. 6.

%Vor%

In # 6 ist locMatch immer noch wahr vom vorherigen Klick, also gibt es das erwartete Ergebnis, aber es ist technisch nicht korrekt, da place_changed immer noch nach der Formularübergabe ausgelöst wird. Der obige Fix für # 5 bricht diesen Fall, aber die obige setTimeout-Methode behebt ihn erneut.

Ich habe mir den ganzen Tag über die Haare gezogen, jeder Rat würde sehr geschätzt werden. Danke!

    
hackel 22.11.2014, 00:55
quelle

1 Antwort

1

Genau das gleiche Problem hier. Die Autocomplete-Bibliothek bietet kein anderes Ereignis als place_changed. Es gibt auch keine Statuseigenschaft, z.B. request_pending.

Es gibt einen "Hack" von mmalone hier: Google Autocomplete - zur Auswahl Arbeitete großartig für mich.

    
Breiz 12.12.2014 18:10
quelle