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

Google Maps API JavaScript报错:this.pa.remove is not a function

问题分析与解决方案

错误原因

你遇到的这个Uncaught TypeError: this.pa.remove is not a function错误,本质是OverlayView的生命周期时机问题。

Google Maps的OverlayView对象在调用setMap(map)后,并不会立即完成所有初始化工作——它需要经历onAdd(挂载到地图DOM)、draw等生命周期步骤,内部的DOM引用(比如报错里的pa,这是Google Maps内部封装的元素变量名)才会被创建。而你的代码里,刚调用overlay.setMap(map)就立刻执行overlay.setMap(null),这时候OverlayView还没完成挂载,内部的pa元素还不存在,自然调用remove方法就会抛出错误。

关于是否可以去掉overlay.setMap(null);

完全可以去掉这行代码,而且在你的这个场景下,去掉它是更合理的选择:

  • 你的overlay是函数内部的局部变量,当函数执行完毕后,这个变量会失去引用,JavaScript的垃圾回收机制会自动清理它占用的资源,包括Google Maps内部对这个OverlayView的关联引用。
  • 从功能上看,你只是用OverlayView来获取投影转换的结果,完成转换后这个OverlayView就没有存在的必要了,不需要手动去销毁它,局部变量的特性已经足够让它被回收。

优化建议(可选)

如果你还是想确保OverlayView被正确清理(虽然必要性不高),可以通过监听OverlayView的ready事件,等它初始化完成后再销毁:

function fromLatLngToDivPixel(map, latLng) {
  return new Promise((resolve) => {
    var overlay = new google.maps.OverlayView();
    overlay.draw = function () {};
    overlay.setMap(map);
    
    // 等待OverlayView初始化完成
    google.maps.event.addListenerOnce(overlay, 'ready', function() {
      var point = overlay.getProjection().fromLatLngToDivPixel(latLng);
      overlay.setMap(null); // 现在调用就不会报错了
      resolve(point);
    });
  });
}

不过这个版本需要用Promise来处理异步结果,如果你不需要异步场景,直接去掉setMap(null)的原始版本就足够稳定。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:38:03