8

girin Google Maps Javascript API V3'ten google.maps.places.Outocomplete öğesini temel bir arama formuna ekledim. Kullanıcının otomatik tamamlama listesinden bir öğe seçip seçmediğini (fare ya da klavye ile) ya da serbest biçimli bir metin gönderip göndermediğini güvenilir bir şekilde bulmaya çalışıyorum.Google Rehber Otomatik tamamlama place_changed olayına bastığınızda form gönderdikten sonra

Kodu: http://jsfiddle.net/2rhL3cyk/1/

Bir form gönderme yol açmalıdır her biri aşağıdaki temel senaryolar, karşı test ediyorum. Kullanıcı bir otomatik tamamlama öğesi seçtiyse doğru olmalıdır.

  • place_changed onSubmit ateş
  • ateş:

    1. serbest formlu metni girin, butonu tıklayın. locMatch: false
  • girin metni girin bir yer seçmek için oku aşağı kullanın ve isabet:
    • onSubmit ateş etti. locMatch: false
    • (çok geç!) ateş place_changed
  • göndermek, bir yeri seçmek için fare kullanmak, metni girin tıklatın:
    • ateş place_changed
    • onSubmit ateş (yere tıkladıktan sonra). locMatch:
      • ateş place_changed (yere tıkladıktan sonra)
      • ateş place_changed: true
    • bir yeri seçmek için metin, kullanım fare girin serbest formlu dizeye değişiklik metni (düğme tıkladıktan sonra), butonu tıklayın (yeni metin girdikten ve girildikten sonra)
    • onSubmit işlendi. locMatch: false
  • bir yer, serbest formlu dizeye değişiklik metni seçmek için fare kullanmak, metni girin, göndermek tıklatın:
    • ateş place_changed
    • onSubmit ateş (yere tıkladıktan sonra). locMatch: true
  • metni girin (yeni metin ve tıklayarak düğmesine girdikten sonra), kullanım fare
    • girmek, yeni metin girmek, bir yer seçin bir yer seçmek için oku aşağı kullanın ve vurmak için ateş place_changed (Yerine tıkladıktan sonra
    • onSubmit tetiklendi. locMatch: true (düğmesi yeni metin girme ve tıkladıktan sonra)
    • place_changed Sadece vakalar 1, 3 ve 4 çalışma beklendiği gibi
  • ateşledi.

    # 2'de, onSubmit, place_changed öğesinden önce işlenmekte, bu nedenle form gönderildikten sonra locMatch'i ayarlama şansı yoktur.El ile place_changed tetiklemeye yardımcı olmaz, çünkü giriş alanı doğru metne sahip olsa bile, autocomplete.getPlace() form gönderilinceye kadar tanımsız kalır. Öyle gibi korkunç bir setTimeout hack ile çalışmaya zorlamak başardı:

    $('#loc_search').submit(function (e) { 
        setTimeout(function() { 
        console.log('submit for real! locMatch:', locMatch); 
        $(this).submit(); 
        }, 150); 
    }); 
    

    Gerçekten bu düzeltmek için daha mantıklı bir yol bulmak istiyoruz. Zaman aşımı değerinin bir kullanıcının makine özelliklerine bağlı olabileceğini ve gereksiz bir gecikme istemediğimi hayal ediyorum.

    # 5'de, enter tuşuna bastıktan sonra hiç yer işareti değişmez. Yine, teslim işleyicisinde bir place_changed olayını manuel olarak tetiklemeyi denedim, ancak bunun bir etkisi yoktur çünkü getPlace(), kullanıcı giriş alanında yazmış olsa bile önceden seçilmiş değeri döndürür. Bunu çözmenin bir yolu, locMatchleri ​​değiştirmeye sıfırlamaktır, ancak bu aşağıdaki # 6'yı kırar. # 6'da

    $('#location').change(function() { 
        locMatch = false; 
    }); 
    

    , locMatch hala önceki tıklamadan doğrudur, bu yüzden beklenen sonucu verir, ama place_changed hala form gönderme işleminden sonra ateş ediliyor çünkü teknik olarak doğru değildir. Yukarıdaki durumda # 5 için düzeltme bu durumu keser, ancak yukarıdaki setTimeout yöntemi bunu tekrar düzeltir.

    Bütün gün boyunca saçlarımı çekiyorum, herhangi bir tavsiye çok takdir edilecektir. Teşekkür ederim!

    +0

    Otomatik tamamlama hizmeti zaman uyumsuzdur. Sonuçların sunucudan geri gelmesi zaman alır. – geocodezip

    +0

    Ancak sorun bu değil. Sonuçlar, yukarıdaki tüm durumlarda zaten geri geldi. – hackel

    cevap

    1

    Burada aynı sorunun olması. Otomatik Tamamlama kitaplığı, place_changed öğesinden başka bir etkinlik sağlamaz. Ayrıca, herhangi bir durum özelliği de yoktur. request_pending.

    Burada mmalone'dan bir "kesmek" var: Google Autocomplete - enter to select Benim için harika çalıştı.

    İlgili konular