【问题标题】:How to generate google autocomplete address api dynamically如何动态生成谷歌自动完成地址api
【发布时间】:2014-04-27 02:25:57
【问题描述】:

我需要生成 n 个地址抓取器并获取 json 格式的输出,我可以通过 ajax 单击按钮来完成。但我不知道如何使用 google api 动态生成自动完成并单独获取内容。

我需要展示与此小提琴中所附的完全相同类型的设计。

http://jsfiddle.net/6BcUD/

initialize();

var placeSearch, autocomplete;
var componentForm = {
  street_number: 'short_name',
  route: 'long_name',
  locality: 'long_name',
  administrative_area_level_1: 'short_name',
  country: 'long_name',
  postal_code: 'short_name'
};

function initialize() {
  autocomplete = new google.maps.places.Autocomplete(
      /** @type {HTMLInputElement} */(document.getElementById('autocomplete')),
      { types: ['geocode'] });
  google.maps.event.addListener(autocomplete, 'place_changed', function() {
    fillInAddress();
  });
}

function fillInAddress() {
  var place = autocomplete.getPlace();

  for (var component in componentForm) {
    document.getElementById(component).value = '';
    document.getElementById(component).disabled = false;
  }

  for (var i = 0; i < place.address_components.length; i++) {
    var addressType = place.address_components[i].types[0];
    if (componentForm[addressType]) {
      var val = place.address_components[i][componentForm[addressType]];
      document.getElementById(addressType).value = val;
    }
  }
}
function geolocate() {
  if (navigator.geolocation) {
    navigator.geolocation.getCurrentPosition(function(position) {
      var geolocation = new google.maps.LatLng(
          position.coords.latitude, position.coords.longitude);
      autocomplete.setBounds(new google.maps.LatLngBounds(geolocation,
          geolocation));
    });
  }
}

目前我已经添加了 3 个表单,但我需要通过“添加表单”按钮添加它,我想我可以使用 jquery append 来完成。但是如何让它在谷歌自动完成中工作呢?

谢谢

【问题讨论】:

    标签: javascript jquery html google-maps autocomplete


    【解决方案1】:

    如果您想重新使用它来管理多个表单,您的 javascript 代码必须更加“通用”并且不基于 DOM 元素 ID。

    包含自动完成实例的全局变量不是一个好主意。

    我编辑了你的 jsFiddle 来建议你一个基于 jQuery 的解决方案(你放了 jQuery 标签,所以我假设我可以依赖):

    • 我定义了一个 div #addressForms,点击 #addForm 按钮后表单将被附加
    • 我已将您的表单 makup 包装在一个隐藏的 div #template 中。每次点击#addForm,模板内容都会被复制,自动完成初始化并附加到#addressForms
    • 由于 DOM 元素 id 必须是唯一的,我删除了您的表单元素 id 并将它们用作 css 类
    • 我还删除了您的全局变量 componentForm 并在每个字段元素上添加了数据 (data-type)

    看看 jsFiddle 是否满足您的需求。

    编辑:

    我根据您的 cmets 创建了这个 jsFiddle。它还没有完成,但它可以提供帮助。

    【讨论】:

    • 我编辑了 jsFiddle 在#addForm 点击函数中添加了一个for 循环。我还将 css 类替换为 data-component 属性以构建数据以在 ajax 调用中发送。查看#sendData click 函数来执行您的ajax 调用。您需要修改它以指定您的 url 并可能修改数据格式(数据写在表单后面以说明生成的内容)。并且不要忘记接受 SO 中的答案!
    • 好的,事实上,当您单击“订购交货”时,您需要使用“订单#1”打开模式,其中包含所有字段和自动完成初始化的表单。然后单击“添加表单”将添加一个“订单#2”并初始化第二个表单,对吗?如果是这样,您需要调整脚本。确认我这就是你想做的,今晚或明天我会帮你的。然后你将不得不自己继续,我不能做你所有的工作:D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-25
    • 2016-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2015-03-08
    相关资源
    最近更新 更多