Google 地方自动完成只是有时不工作

Google Places Autocomplete not working only sometimes

地点自动完成 (javascript) 在很多方面都很奇怪。我的意思是它在某些浏览器上似乎一直有效,但在其他浏览器上却断断续续地工作。为了到达这里,我不得不做一些与其他建议相反的事情,(尽管 'correct' 方法的效果更差)所以我有很多东西要列出。

具体问题(在任何浏览器上)是回调 initAutocomplete() 确实完全发生,但有时输入字段只是没有显示建议。但是,没有记录任何错误。当它失败时,我发现了两点值得注意的事情:没有创建 pac-container,也没有为 AutocompletionService.GetPredictions.

发送请求

这些错误似乎从未在 FireFox 或 Edge 上出现过。它大部分时间都发生在 Chrome。它在 iOS Chrome 上永远不起作用,但在 Safari 上很少起作用……到目前为止,这不是一个有用的模式。

页面上多次调用地图 APIs,导致 "You have included the Google Maps JavaScript API multiple times on this page. This may cause unexpected errors." 错误。但是,这似乎没有实际问题,因为调用是针对不同的库(几何和位置)。而且放置脚本的回调函数绝对总是起作用,至少。

除此之外,没有任何类型的错误报告。值得注意的是,我目前正在附加一个实际上基于会话的 sessiontoken(对于用户,因此对于多个请求。)这与 等信息直接相反(我搜索了 a lot before posting) 表示不需要 sessiontoken 并将自动处理。这是相反的,因为不包括它会使服务中断 更频繁 。没有它,它会破坏 Firefox 和 Edge 上的大量时间,而这些时间目前还不错,并且 Chrome 每个用户会话只能工作一次,在一次刷新后或在任何后续表单上它肯定不会再工作了。 我还尝试在每次页面加载时附加一个随机会话令牌,但这也无济于事。尽管在所有情况下错误都是相当随机的,但错误可能与会话令牌无关,而且我所看到的一切都只是人类模式寻求和 [坏] 运气。据我所知,也许这只是不同 API 调用的竞争条件。如果我执行 'empty cache and hard reload' 而不是 F5,我会在 Chrome 上更多地工作;将其添加到它通常在会话中第一次工作,也许您认为从缓存加载脚本比真正加载脚本更容易引起问题?我没有想法,或者至少没有我认为合理的想法。

initAutocomplete 的代码几乎与 the example 中给出的完全相同,除了添加 sessiontoken(同样,没有它会失败 more)。

如有任何帮助,我们将不胜感激。

事实上,它是 google API 的双重包含。尽管事实上一个包含库是几何图形,这是地方,而且即使在失败状态下,Place 脚本上的回调也在发生。.

简单地删除相关页面上的几何包含修复了自动完成功能 100%(我们可以删除会话令牌),但页面上的其他功能需要几何。通过将它添加到为 place 库制作的 include 中解决了这个问题。只需使用逗号来定位多个库;我没有看到文档中提到的,但这是一个简单的猜测:

<script src="https://maps.googleapis.com/maps/api/js?key=********&libraries=places,geometry&callback=initAutocomplete" async defer></script>

现在,如果您需要比您所在位置更高更快的几何图形(或任何其他库),那是我没有遇到的新问题。但是对于发现这一点的任何人,我最简单的建议是将整个自动完成块移到那里并以相同的方式组合包含。然后有 2 个可能的问题:另一个脚本已经有一个回调,并且表单可能还不存在。

如果只有第一点是你的问题,回调可以简单地组合起来;只需执行其他回调代码,然后执行自动完成。对于第二个,有两个选项:首先,如果您可以让您的表单出现触发一个事件,然后让回调为其设置一个侦听器,然后使其恢复正常(不过请注意可能首先加载的表单!)。其次,一个 setInterval 检查存在的元素并在找到元素时进行工作(并停止检查)——这是脏的,但只适用于 vanilla js;如果您拥有任何框架,可能会有更好的选择。如果你有这两个问题,只需在回调开始时使用 listener/interval。