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ş:
- serbest formlu metni girin, butonu tıklayın. locMatch: false
- onSubmit ateş etti. locMatch: false
- (çok geç!) ateş place_changed
- 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
- ateş place_changed
- onSubmit ateş (yere tıkladıktan sonra). locMatch: true
- 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!
Otomatik tamamlama hizmeti zaman uyumsuzdur. Sonuçların sunucudan geri gelmesi zaman alır. – geocodezip
Ancak sorun bu değil. Sonuçlar, yukarıdaki tüm durumlarda zaten geri geldi. – hackel