更改Google地图自动填充字段的值

时间:2014-02-09 12:22:24

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

如果更改了值后,如何更改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>

3 个答案:

答案 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_nameshort_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)

您可以通过向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。