9

更改值后如何更改 Google 地图自动填充字段的值?

我的最终愿望是仅在此字段中显示地址,并在单独的字段中显示城市、州等。

http://jsbin.com/wiye/2/所见(脚本在下面重复),我更改了该值,但后来又变回了。

在 google.maps.event.addListener() 中只显示街道地址会问同样的问题,但它似乎不再起作用。 更改谷歌地图自动完成文本框中的值也会问同样的问题,但没有足够的答案。

谢谢

<!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>
4

3 回答 3

4

我发现以编程方式更改自动完成输入值的最简单方法是重新初始化输入字段。

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);
}
于 2020-01-28T05:59:35.063 回答
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_nameshort_name您将使用它来填充您的输入。每个对象还包含一个数组types,指示字符串表示的内容(0 索引是对象的唯一标识)。在您的情况下:街道号码 ( street_number)、街道名称 ( route)、城市 ( locality)、县 ( administrative_area_level_2)、州 ( administrative_area_level_1)、国家 ( country) 和邮政编码 ( postal_code)。

在此示例中,对象包含用于匹配数组addrComponents中的项目的易于阅读的选项。place为了达到您想要的填充多个字段的结果,您只需要选择字段并使用$inputName.val(desiredString).

作为附加参考,Google Maps JavaScript API 文档包含一个您想要做什么的示例。

希望有帮助。祝你好运!

于 2016-02-19T17:21:42.807 回答
-2

您可以通过添加事件侦听器blurkeydown事件来覆盖自动值来解决此问题。看看我在下面做了什么:

<!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。

于 2014-05-23T18:23:23.290 回答