You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态加载Google Maps切换语言时自动补全报错问题

Google Maps动态语言切换异常修复方案

问题描述

  • 异常场景:页面加载后未使用自动补全搜索框,直接切换语言并重新加载Google Maps脚本,之后尝试查询地址时触发报错:
Uncaught TypeError: e.Rz is not a function
at Object.c [as _46nw80] (common.js:115:253)
at AuthenticationService.Authenticate?1shttps%3A%2F%2Fwww.url.com&4skey&callback=_xdc_._46nw80&key=key&token=127529:1:28
  • 正常场景:若先使用自动补全功能再切换语言,则无报错。当前加载脚本代码如下:
function loadScript(lang) {
        document.querySelectorAll('script[src^="https://maps.googleapis.com"]').forEach(script => {
            script.remove();
        });
        
        if (google) {
            google.maps.event.clearListeners(autocomplete, 'place_changed');
            delete google.maps;
        }

        var script = document.createElement('script');
        script.type = 'text/javascript';
        script.src = 'https://maps.googleapis.com/maps/api/js?key=xxx&libraries=places&callback=initAutocomplete';
        script.src += '&language=' + lang;
        script.id = "google-maps-script";
        document.body.appendChild(script);
    }

脚本初始在window.onload()触发,用户切换下拉菜单语言时重新加载。

问题原因

直接删除google.maps对象+移除脚本的方式,无法彻底清理Google Maps的全局状态和未初始化的自动补全实例残留。当未使用过自动补全时,autocomplete实例未被正确初始化,此时调用google.maps.event.clearListeners会导致全局引用混乱,后续加载新脚本时出现函数未定义的错误。

修复方案

修改loadScript函数,确保彻底清理旧实例与全局状态,再加载新语言版本的脚本:

// 全局维护自动补全实例
let autocomplete = null;

function initAutocomplete() {
    // 原有自动补全初始化逻辑示例
    const input = document.getElementById('autocomplete-input');
    autocomplete = new google.maps.places.Autocomplete(input);
    autocomplete.addListener('place_changed', onPlaceChanged);
}

function onPlaceChanged() {
    // 原有地址选择处理逻辑
}

function loadScript(lang) {
    // 1. 彻底销毁自动补全实例及所有关联事件
    if (autocomplete) {
        google.maps.event.clearInstanceListeners(autocomplete);
        google.maps.event.clearListeners(autocomplete, 'place_changed');
        autocomplete = null;
    }

    // 2. 移除所有Google Maps相关脚本
    document.querySelectorAll('script[src^="https://maps.googleapis.com"]').forEach(script => {
        script.remove();
    });

    // 3. 重置Google全局变量,避免残留引用干扰
    if (window.google) {
        window.google.maps = undefined;
        window.google = undefined;
    }

    // 4. 加载新语言版本的脚本
    const script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = `https://maps.googleapis.com/maps/api/js?key=xxx&libraries=places&callback=initAutocomplete&language=${lang}`;
    script.id = "google-maps-script";
    document.body.appendChild(script);
}

关键修改点

  • 全局维护autocomplete实例,确保每次切换语言前能精准销毁
  • 使用clearInstanceListeners清理实例的所有监听,而非仅单一事件
  • 重置window.google相关变量为undefined,避免内存残留引用干扰新脚本加载
  • 优化URL拼接方式,减少冗余操作

内容的提问来源于stack exchange,提问作者Jan Gils

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:05:36