我有以下javascript代码,它会在作为地址一部分的不同输入文本框上执行Google地图自动填充。
function startAutoComplete() {
var address = document.getElementById("addressId");
var city = document.getElementById("cityId");
var state = document.getElementById("stateId");
var zip = document.getElementById("zipId");
//option for autocomplete
var option = {types: ['geocode'], componentRestrictions: {country: 'us'}};
//autocomplete for address textbox
autocomplete = new google.maps.places.Autocomplete(address, option);
google.maps.event.addListener(autocomplete, 'place_changed', function() {
var place = autocomplete.getPlace();
//parses the result object and populates the other textboxes accordingly
for(i=0; i<place.address_components.length; i++)
{
if(place.address_components[i].types[0] == 'locality')
city.value = place.address_components[i].long_name;
if(place.address_components[i].types[0] == 'administrative_area_level_1')
state.value = place.address_components[i].short_name;
if(place.address_components[i].types[0] == 'postal_code')
zip.value = place.address_components[i].long_name;
}
/* Here is the PROBLEM */
address.value = place.name;
});
然而,当我尝试使用缩短版本的完整地址更新正在自动完成的文本框时(所以这里只是街道编号和街道名称)。完整地址文本框中的值不会更改。我已经尝试使用jquery并在文本框上使用setAttribute()设置value属性。我做错了什么?
答案 0 :(得分:1)
Autocomplete对象有一些不明显的事件侦听器。实际情况是,当您运行代码时,它确实会更改值,然后Autocomplete对象会快速更改它!要对此进行测试,请在alert();
行之后添加address.value = place.name;
。如果添加setTimeout()
设置值为1毫秒的延迟,您可以哄骗它以保持您的价值。但是当您离开该字段时,自动填充的blur
事件会触发,您的地址将被重写。您可以用一行来解决这个问题:
address.addEventListener('blur', function() { address.value = place.name; });
这也照顾了第一种情况,因此您甚至不需要添加setTimeout()
。用此事件侦听器替换用于设置值的行,它将替换自动完成的回调函数,该函数在每次触发时设置文本。
答案 1 :(得分:1)
我发现以编程方式更改自动完成输入的值的最简单方法是重新初始化输入字段。
autocomplete = new google.maps.places.Autocomplete(address, option);
google.maps.event.addListener(autocomplete, 'place_changed', function() {
// populate your other text fields
...
// change the value of your autocomplete
address.value = place.name;
// reinitialize with new input value
autocomplete = new google.maps.places.Autocomplete(address, option);
}
答案 2 :(得分:0)
我找到了一个非常临时的解决方案。如果您故意创建错误,它将解除原始文本框中的Google地图自动填充功能,并使用更新后的值显示原始文本框。不是真正的解决方案,但它是一个开始
//Created this variable that stores the pac-container
var element = document.getElementsByClassName("pac-container");
//inside the addListener() function I added this to create a DOM error
element[0].childNodes[0].childNodes[0].removeChild();
javascript会抛出一个错误,但它至少允许我使用'.value'在文本框中输入我想要的内容
再次不是解决方案,而是一个开始。我希望我们找到更好的解决方案。
答案 3 :(得分:0)
如何克隆元素然后替换它,然后再次调用initialze。
这样的事情。这对我来说过去很有用。
$("#Id").replaceWith($("#Id").clone());
initialize();
这里initailize是当dom加载google.maps.event.addDomListener(window,'load',initialize)时调用的方法;在你的情况下它可能是不同的