商家信息自动填充(javascript)在很多方面都很奇怪。我要指出的是,它似乎始终在某些浏览器上有效,但在其他浏览器上却间歇性地起作用。为了到达这里,我不得不做一些与其他建议相反的事情(尽管“正确”方式的作用更小),所以我有很多事情要列举。
(在任何浏览器上)特定的问题是回调initAutocomplete()确实发生了,但是有时输入字段只是没有显示建议。但是,没有记录错误。失败时,我发现有两点需要注意:没有创建pac-container,也没有发送对AutocompletionService.GetPredictions的请求。
错误似乎从未在FireFox或Edge上发生。大部分时间都是在Chrome上发生的。它永远无法在iOS Chrome浏览器上使用,但在Safari浏览器上却无法使用...到目前为止,这不是一种有用的模式。
页面上对Maps API的调用不止一次,导致“您在此页面上多次包含Google Maps JavaScript API。这可能会导致意外错误。”错误。但是,似乎没有实际的问题,因为调用是针对不同的库(几何和位置)的。而且,位置脚本的回调函数至少总是绝对起作用。
除此之外,没有任何类型的错误报告。值得注意的是,我当前正在附加一个实际上基于会话的会话令牌(对于用户,对于多个请求而言。)这与stackoverflow.com/a/50452233/5140781之类的信息直接相反(我已经搜索了很多 (在发布之前),该提示说会话令牌是不需要的,它将被自动处理。这是相反的,因为不包含它会使服务中断的次数更频繁。没有它,它会在Firefox和Edge上中断很多时间,而Firefox和Edge目前还可以,并且Chrome在每个用户会话中只能运行一次,一次刷新或以任何后续形式运行,它肯定将不再起作用。 我还尝试在每次页面加载时附加一个随机会话令牌,但这也无济于事。尽管由于在所有情况下该错误都是相当随机的,但可能是该错误与会话令牌无关,而我所看到的一切仅仅是人为模式寻找和运气不佳。就我所知,这可能只是不同API调用的竞争条件。如果我执行的是“空缓存和硬重装”,而不仅仅是F5,则可以在Chrome上更有效地工作;将其添加到通常在会话中第一次正常运行的情况下,也许您有从缓存中加载脚本的可能性比真正加载脚本的可能性更大?我没有想法,或者至少我认为是合理的想法。
initAutocomplete的代码几乎与the example中给出的代码完全一样,只是添加了会话令牌(同样,如果没有,令牌也会失败 more )。
任何帮助将不胜感激。
答案 0 :(得分:1)
实际上,它是Google API的双重包含。尽管事实是其中一个include库是几何图形,并且这是放置位置,并且Place脚本上的回调甚至在失败状态下也发生了。
仅删除相关页面上的几何图形即可将自动完成功能100%固定(并且我们可以删除sessiontoken),但是页面上的其他功能也需要几何图形。通过将其添加到位置库所包含的内容中,可以解决该问题。只需使用逗号将多个库作为目标即可;我没有看到文档中提到的内容,但是很容易猜到:
<script src="https://maps.googleapis.com/maps/api/js?key=********&libraries=places,geometry&callback=initAutocomplete" async defer></script>
现在,如果您需要比所在位置更高且更快的几何图形(或其他任何库),那是我没有的新问题。但是对于发现此问题的任何人,我最简单的建议是将整个自动完成程序块移到那里,并以相同的方式组合包含。然后有两个可能的问题:另一个脚本已经有回调,并且表单可能还不存在。
如果只有第一点是您的问题,则可以简单地组合回调。只需执行其他回调代码,然后执行自动完成。对于第二个问题,有两个选择:首先,如果您可以让表单出现来触发事件,然后让回调函数将其设置为侦听器,然后使其恢复为通常的状态(请注意,表单可能首先加载!)。其次,一个setInterval,它检查元素是否存在并在找到元素时进行工作(并停止检查)-这很脏,但仅适用于普通js;如果您拥有任何框架,可能会有更好的选择。如果您同时遇到这两个问题,只需在回调的开始处设置监听器/间隔即可。