【问题标题】:Google API getPlace from autocomplete return undefined when firing manually手动触发时,来自自动完成的 Google API getPlace 返回未定义
【发布时间】:2016-10-04 15:31:38
【问题描述】:

我希望能够在手动触发此事件时从autocomplete.getPlace() 返回数据。

基本上,我有一个函数可以在Lat/Lng 中获取用户位置,然后我想获取用户getPlace(),因为有更多有用的数据,例如place_id、照片(最想要的)、参考等.

到目前为止,我几乎可以做任何事情,我什至可以手动触发事件,但它返回 undefined。这是我到目前为止的代码:

var latLng = response; //Comes from another function
geocoder.geocode({'location': latLng}, function(results, status) {
    if (status === 'OK') {
        if (results[1]) {
            var fullAddress = results[0].formatted_address;

            var input = document.createElement("input");
                input.setAttribute("value", fullAddress);

            var autocomplete = new google.maps.places.Autocomplete(input);

            google.maps.event.addListener(autocomplete, 'place_changed', function () {
                var thisPlace = autocomplete.getPlace();
                console.log(thisPlace);
            });

            google.maps.event.trigger(autocomplete, 'place_changed');
        }
    }
});

这里一切正常,但来自autocomplete.getPlace() 的返回是undefined

如果运行相同的函数,但来自本机自动完成元素,则返回正确。

我做错了什么?

【问题讨论】:

    标签: javascript autocomplete google-places-api


    【解决方案1】:

    看起来您想要与 Android Place Picker 等效的 JavaScript。 Places library 中没有这样的小部件。考虑filing a feature request

    您当前的方法似乎遵循以下路线:

    1. 将地理编码用户 latlng 反向到最近的地址。
    2. 获取该地址的地点。

    在步骤 1 中使用 geocoder.geocode() 是可以的,但您需要注意您输入的结果:如果第一个结果是公共汽车站,那么它的地址将无用。

    您最好使用Radar Search,以搜索最接近原始纬度/经度输入的位置。这也避免了可能来自反向地理编码将用户位置捕捉到不太近的地址的问题。然后您需要发出多个Details 请求以获取最近的 N 个地点的名称(和其他详细信息)。

    在第 2 步中使用自动完成功能不会很好。具有多个地点的地址的自动完成功能很少会列出所有地点。

    另外:不要手动触发place_changed,这不是它的工作原理。

    place_changed 事件仅在 PlaceResult 可用后由 Autocomplete 类触发。如果用户从自动填充预测中选择了一个地点,则需要调用 Places Details 服务,以检索您实际想要获取的详细信息。

    当 PlaceResult 可用于用户选择的 Place 时,将触发此事件。 如果用户输入了控件未建议的地点名称并按 Enter 键,或者地点详细信息请求失败,则会触发 place_changed 事件,该事件在名称属性中包含用户输入,没有其他属性已定义。

    如果您手动触发place_changed,则没有为您准备好的PlaceResult,这就是为什么autocomplete.getPlace() 只会返回undefined

    【讨论】:

    • 根据您的链接引用,我最终得到了我想要的结果,但使用了另一种方法。我没有手动触发自动完成事件,而是使用PlacesService 进行新搜索。在那之后,主要目标实现了,我能够得到我需要的信息。谢谢
    猜你喜欢
    • 1970-01-01
    • 2012-11-21
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2014-03-05
    • 2015-02-02
    相关资源
    最近更新 更多