如果更改了值后,如何更改Google地图自动填充字段的值?
我的最终愿望就是在这个领域中显示地址,在不同的领域中显示城市,州等。
正如http://jsbin.com/wiye/2/(下面重复的脚本)所示,我更改了值,但后来又更改了。
show just the street address in google.maps.event.addListener()提出了同样的问题,但它似乎不再起作用了。 Change the value in textbox of a google map autocomplete也问同样的问题,但没有足够的答案。
谢谢
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Places search box</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places"></script>
<script>
$(function(){
var input_auto = document.getElementById('input_auto');
autocomplete = new google.maps.places.Autocomplete(input_auto,{types: ['geocode'],radius: 10});
google.maps.event.addListener(autocomplete, 'place_changed', function() {
setTimeout(function(){$('#input_auto').val('yyy');},50);
alert('pause1');
console.log(autocomplete,input_auto);
input_auto.value='xxx';
//autocomplete.set('xxx');
//autocomplete.setValues('xxx');
alert('pause2');
});
});
</script>
</head>
<body>
<input id="input_auto" type="text">
</body>
</html>
答案 0 :(得分:1)
您正在使用许多不需要的活动。当用户从自动填充选项中选择地址时,自动填充功能会触发place_changed
事件。当该事件触发时,自动完成将填充它所附加的字段。
这是针对您的问题的更合理结构的答案,使您能够“在此字段中显示地址,以及在不同字段中显示城市,州等”:
(function() {
var $inputAuto = $('#input_auto');
var addrComponents = {
streetNumber: {
display: 'short_name',
type: 'street_number'
},
streetName: {
display: 'long_name',
type: 'route'
},
cityName: {
display: 'long_name',
type: 'locality'
},
stateName: {
display: 'short_name',
type: 'administrative_area_level_1'
},
zipCode: {
display: 'short_name',
type: 'postal_code'
}
};
var autocomplete;
var autocompleteOptions = {
radius: 10,
types: ['geocode']
};
function initAutocomplete() {
autocomplete = new google.maps.places.Autocomplete($inputAuto[0], autocompleteOptions);
autocomplete.addListener('place_changed', setAddress);
};
function setAddress() {
var place = autocomplete.getPlace().address_components;
var streetAddr = [addrComponents.streetNumber, addrComponents.streetName];
var streetAddrDisplay = [];
// Add additional field values
place.forEach(function(placeComponent) {
streetAddr.forEach(function(streetAddrComponent) {
if (placeComponent.types[0] === streetAddrComponent.type) {
streetAddrDisplay.push(placeComponent[streetAddrComponent.display]);
}
// else if <additional field values>
});
});
var addrString = streetAddrDisplay.join(' ');
$inputAuto.val(addrString);
};
initAutocomplete();
}());
autocomplete.getPlace()
会返回一个包含束内容的对象,您可以将其用于其他Maps API调用。但是,您只需要第一个对象address_components
。这是一组匹配的地址组件对象。这些对象中的每一个都有一个long_name
和short_name
,您可以使用它来填充输入。每个对象还包括一个types
数组,指示字符串表示的内容(0索引是对象的唯一标识)。在您的情况下:街道号码(street_number
),街道名称(route
),城市(locality
),县(administrative_area_level_2
),州(administrative_area_level_1
) ,国家/地区(country
)和zip(postal_code
)。
在此示例中,addrComponents
对象包含用于匹配place
数组中项目的易于阅读的选项。为了达到填充多个字段所需的结果,您只需选择字段并使用$inputName.val(desiredString)
设置其内容。
作为附加参考,example包含您想要做的Google Maps JavaScript API docs。
希望有所帮助。祝你好运!
答案 1 :(得分:0)
我发现以编程方式更改“自动完成”输入的值的最简单方法是重新初始化输入字段。
var input = document.getElementById(input_auto);
autocomplete = new google.maps.places.Autocomplete(input, option);
google.maps.event.addListener(autocomplete, 'place_changed', function() {
// perform any functions based on place input
...
// change the value of your autocomplete to whatever you want
input.value = 'yyy';
// reinitialize with new input value
autocomplete = new google.maps.places.Autocomplete(input, option);
}
答案 2 :(得分:-1)
您可以通过向blur
和keydown
事件添加事件侦听器来覆盖自动值来解决此问题。看看我在下面做了什么:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Places search box</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
<script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places"></script>
<script>
$(function(){
var input_auto = document.getElementById('input_auto');
autocomplete = new google.maps.places.Autocomplete(input_auto,{types: ['geocode'],radius: 10});
google.maps.event.addListener(autocomplete, 'place_changed', function() {
input_auto.addEventListener('blur', function() {
input_auto.value = 'yyy';
});
input_auto.addEventListener('keydown', function() {
input_auto.value = 'yyy';
});
setTimeout(function(){$('#input_auto').val('yyy');},1);
});
});
</script>
</head>
<body>
<input id="input_auto" type="text">
</body>
</html>
如果您遇到任何问题,可以选择添加setTimeouts。