gpt4 book ai didi

javascript - Google Maps API 自动完成输入文本框值丢失

转载 作者:行者123 更新时间:2023-11-29 10:15:53 24 4
gpt4 key购买 nike

我在网页上添加了一个谷歌地图,它还有一个带有谷歌地图自动完成功能的文本框。用户可以通过单击 map 或在自动完成文本框中键入位置地址来在 map 上添加标记。如果用户单击 map ,则会在 map 上添加一个标记,并且该位置的地址会显示在自动完成文本框中。

代码:

<script src="~/Scripts/jquery-1.10.2.js"></script>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&region=LK&libraries=places"></script>
<div id="map"></div>
<input id="inputLocation" name="inputLocation" type="text">

<script type="text/javascript">

$(function () {

var mapOptions = {
zoom: 10,
center: new google.maps.LatLng(6.9182471651737405, 80.70556640625),
streetViewControl: false
};

var autocompeteOptions = {
componentRestrictions: { country: "lk" }
};

var map;
var locationMarker;

var geocoder = new google.maps.Geocoder();

function initialize() {

map = new google.maps.Map(document.getElementById('map'), mapOptions);

//Add marker when user clicked on Map
google.maps.event.addListener(map, 'click', function (event) {

var location = event.latLng;

if (locationMarker) {
locationMarker.setMap(null);
}

geocoder.geocode({ 'latLng': location }, function (results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {

//locationMarker
locationMarker = new google.maps.Marker({
position: location,
map: map
});

document.getElementById('inputLocation').value = results[1].formatted_address;

} else {
alert('No results found');
}
} else {
alert('Geocoder failed due to: ' + status);
}
});

}); //click

var autocompleteInput = new google.maps.places.Autocomplete(document.getElementById('inputLocation'), autocompeteOptions);

//Autocomplete place Changed
google.maps.event.addListener(autocompleteInput, 'place_changed', function () {

autocompleteInput.bindTo('bounds', map);

locationMarker = new google.maps.Marker({
map: map
});

var selectedPlace = autocompleteInput.getPlace();
if (!selectedPlace.geometry) {
return;
}

if (selectedPlace.geometry.viewport) {
map.fitBounds(selectedPlace.geometry.viewport);
} else {
map.setCenter(selectedPlace.geometry.location);
map.setZoom(17);
}

locationMarker.setPosition(selectedPlace.geometry.location);

var locationAddress = '';
if (selectedPlace.address_components) {
address = [
(selectedPlace.address_components[0] && selectedPlace.address_components[0].short_name || ''),
(selectedPlace.address_components[1] && selectedPlace.address_components[1].short_name || ''),
(selectedPlace.address_components[2] && selectedPlace.address_components[2].short_name || '')
].join(' ');
}

}); //From place_changed

}

google.maps.event.addDomListener(window, 'load', initialize);

});
</script>

这在计算机网络浏览器上运行良好,但当我在移动设备(Galaxy S III、iPhone 5 等)上测试它时,它无法按预期运行(在实际设备和 Chrome 模拟器上)。

如果我先单击输入文本框,然后单击 map ,它会在 map 上添加标记并在输入文本框中显示地址,但是如果我单击页面上的某处,地址文本框值将丢失。 (只有当文本框在点击 map 之前获得焦点时才会发生这种情况)

我能做些什么来解决这个问题吗?

最佳答案

正如 Anto Jurković 所说,这也发生在 FF 中。

您可能会观察到不同之处:

当它按预期工作时,输入没有焦点。当它失败时,输入不会在您点击 map 时失去焦点。

原因:

自动完成在内部监听 focusblur。当您单击页面上的某处(不是 map )时,自动完成将失去 焦点 并且将触发自动完成的 blur 监听器。

blur-listener 会将输入的值设置为当前位置的name-property。当前位置将根据自动完成请求的结果(在本例中为空)存储在内部。

自动完成不会注意到输入值的变化(由您以编程方式应用),它只会监听输入的事件。

那么您可以做的是:

从输入中移除焦点(在 map 的 click 回调中或在设置输入值之前):

 document.getElementById('inputLocation').blur();

关于javascript - Google Maps API 自动完成输入文本框值丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21801330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com