我使用谷歌地图API V3与地点和自动完成API,我遇到了事件顺序问题。
我有输入文字,当我在此字段中输入地址时,我有自动完成功能,然后我可以用鼠标选择地址。它运作得很好。
但是,如果用户在未选择自动填充建议中的地址的情况下键入地址,则place_changed
未被触发,我无法获取Google地图对象以分割不同的地址part(postal_code,city,street_numer ...)。
所以我想到了一个解决方案。我决定使用blur
事件。在这种情况下,如果用户键入不明确的地址或者用户没有点击自动填充建议,我将使用地理编码器检索地址。然后我可以得到postal_code,street_number ......即使使用类型也是一个含糊不清的地址。
我希望仅在用户未点击自动填充建议时才使用blur
事件。但问题是在谷歌地图自动完成事件之前触发了模糊事件,然后我无法设置标志变量。
我必须这样做,因为当我在自动完成建议中选择一个地址时会触发模糊事件,有时我会得到建议的地址,有时我会得到地理编码器的结果。
以下是我的代码的一部分:
autocomplete = new google.maps.places.Autocomplete(input, options);
google.maps.event.addListener(autocomplete, 'place_changed', function() {
var place = autocomplete.getPlace();
initializeAddress(place);
});
function geocoder(ambiguousAddress){
var geocoder = new google.maps.Geocoder();
geocoder.geocode({"address": ambiguousAddress}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
$('#address').val(results[0].formatted_address);
initializeAddress(results[0]);
}
});
}
function initializeAddress(place){
for (var i = 0; i < place.address_components.length; i++) {
var addressType = place.address_components[i].types[0];
latitude = place.geometry.location.lat();
longitude = place.geometry.location.lng();
switch (addressType) {
case 'street_number':
street_number = place.address_components[i][componentForm[addressType]];
break;
case 'route':
route = place.address_components[i][componentForm[addressType]];
break;
case 'locality':
city = place.address_components[i][componentForm[addressType]];
break;
case 'postal_code':
postal_code = place.address_components[i][componentForm[addressType]];
break;
default:
break;
}
}
address = street_number + ' ' + route;
}
$('#address').on('blur', function(e) {
if( $.trim($(this).val()) != '' ){
geocoder($(this).val());
}
});
答案 0 :(得分:2)
陷入类似的问题。 As per the API v3 documentation,如果用户没有从下拉列表中选择任何内容,则getPlace会返回一个只有输入值为place.name的存根。如果地址组件未定义,则对地址组件进行地理编码解决了除之外的许多方案以进行标记。为此,我使用了这个答案的解决方案:Google Autocomplete Places API not triggering event on change via TAB。
恕我直言,这似乎比它应该更难。function onPlaceChange() {
console.log("on place change");
var place = autocomplete.getPlace();
if (typeof place.address_components !== "undefined") {
console.log("place filled in");
fillInAddress(place);
} else {
var geocoder = new google.maps.Geocoder();
var onSuccess = function (google_results, status) {
if (status == google.maps.GeocoderStatus.OK) {
fillInAddress(google_results[0]);
}
}
console.log("geocoding " + place.name);
geocoder.geocode({'address': place.name}, onSuccess);
}
}
function initAutocomplete() {
var location_field = document.getElementById('address');
google.maps.event.addDomListener(location_field, 'blur', function () {
google.maps.event.trigger(this, 'focus');
google.maps.event.trigger(this, 'keydown', {
keyCode: 13
});
})
autocomplete = new google.maps.places.Autocomplete(
/** @type {!HTMLInputElement} */(location_field),
{types: ['address']});
autocomplete.addListener('place_changed', onPlaceChange);
}
答案 1 :(得分:0)
您可以在此处找到解决方案:https://stackoverflow.com/a/42101702/2409212
基本上它是做什么来检查是否有pac-item
(每个结果行的类名)元素悬停。如果没有元素悬停,意味着应该执行自动选择,否则,它将让我们选择一个!
答案 2 :(得分:-1)
Autocomplete
类绑定到文本框。如果是这种情况,我相信它已经有一个模糊实现(这就是它被触发的原因)。
检查您是否可以在blur
listener上注册Autocomplete
。希望这可以解决问题。
快乐的编码!