【问题标题】:Google Maps API Autocomplete input textbox value lostGoogle Maps API 自动完成输入文本框值丢失
【发布时间】:2014-03-15 02:39:51
【问题描述】:

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

代码:

<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 模拟器上)。

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

有什么办法可以解决这个问题吗?

【问题讨论】:

  • FF 上的相同行为:文本框中的信息丢失。控制台中没有任何消息。

标签: javascript google-maps google-maps-api-3 autocomplete


【解决方案1】:

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

您可能会发现不同之处:

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

原因:

自动完成功能在内部侦听 focusblur。当您单击页面上的某个位置(不是地图)时,自动完成将丢失 focus 并且将触发自动完成的 blur-listener。

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

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

那么你可以做的是:

从输入中移除焦点(在地图的click-callback 中或在设置输入值之前):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2012-08-08
    • 2012-01-16
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多