我使用谷歌地图自动完成功能。由于这并不总是返回邮政编码,并且不可能限制为多个国家,因此我调用了反向地址编码功能来检查邮政编码和国家/地区,并检查结果是否仅在所需的国家/地区内:
var geocoder;
function in_array(needle, haystack) {
for(var i in haystack) {
if(haystack[i] == needle) return true;
}
return false;
}
function getPostal(loc, callback) {
var countrys = new Array('DE', 'AT', 'CH');
if (!geocoder) {
geocoder = new google.maps.Geocoder();
}
var geocoderRequest = {
'latLng': loc
}
geocoder.geocode(geocoderRequest, function(results, status) {
var country = "";
var zip = "";
if (status == google.maps.GeocoderStatus.OK) {
for(var i=0; i < results[0].address_components.length; i++) {
var component = results[0].address_components[i];
if(component.types[0] == "country") {
country = component.short_name;
}
if(component.types[0] == "postal_code") {
zip = component.short_name;
}
}
callback(1);
}
if (zip == "") callback(-1);
if (country == "") callback(-2);
if (!in_array(country, countrys)) callback(-3);
});
}
$(function() {
var checkPostal;
var input = document.getElementById('search');
var options = {
types: ["geocode"]
};
var autocomplete = new google.maps.places.Autocomplete(input, options);
google.maps.event.addListener(autocomplete, 'place_changed', function() {
var place = autocomplete.getPlace();
latlng = place.geometry.location;
//reverse
getPostal(place.geometry.location, function(checkPostal) { ;
if (checkPostal == 1) {
alert("OK");
} else {
if (checkPostal == -1) {
alert('no ZIP');
} else if (checkPostal == -2) {
alert('no country');
} else if (checkPostal == -3) {
alert('wrong country');
}
}
});
});
});
如果选择f.e.柏林我只有一个“确定”。
但是选择f.e.纽约我首先得到一个“确定”,然后是一个“错误的国家”。
如果选择f.e.爱尔兰,韦斯特波特,我什至得到“确定”,“没有拉链”和“错误的国家”。
当我只想获得一个“确定”后想采取进一步的措施时,我该怎么做?
或以另一种方式质疑:如何获得一个单一的返回值?
谢谢
法比安
最佳答案
当任何条件匹配时,您必须保留geocode
-callback并在最后执行callback(1)
...,以便仅在没有条件匹配时才执行:
geocoder.geocode(geocoderRequest, function(results, status) {
var country = "";
var zip = "";
if (status == google.maps.GeocoderStatus.OK) {
for(var i=0; i < results[0].address_components.length; i++) {
var component = results[0].address_components[i];
if(component.types[0] == "country") {
country = component.short_name;
}
if(component.types[0] == "postal_code") {
zip = component.short_name;
}
}
if (zip == "") {callback(-1);return;}
if (country == "") {callback(-2);return;}
if (!in_array(country, countrys)) {callback(-3); return;}
callback(1);
}else{
//do something when status is not OK
}
});