谷歌地图 Uncaught TypeError: b.has 不是一个函数。

7
我们在内部系统中使用以下代码包含Google Maps API V3:

请提供一个 [mcve],以演示您的问题(最好是一个 StackOverflow 代码片段)。 - geocodezip
2
也许尝试使用不同的(旧/更稳定的)版本 - geocodezip
4个回答

10

谢谢。我很高兴有人遇到了同样的问题。 - JRT2018
@JRT2018 我也是!你可能像我一样有一个自己的window.map属性,这是一个保留字.. 重命名它应该可以解决问题。 - Krisdigital
非常感谢,你帮我省去了很多烦恼。我在 Google 地图 API 上有一个包装器叫做 Map,重命名它解决了我的问题。为了后人和 SEO,我的错误信息是“j.keys 不是一个函数”。 - John Severinson

4
我们这里也遇到了同样的问题。我们之前链接的是最新版本: https://maps.googleapis.com/maps/api/js?key=...

如果我们强制使用版本3.34,它就可以正常工作: https://maps.googleapis.com/maps/api/js?v=3.34&key=

版本3.35无法正常工作。Google已经替换了一个用于搜索键的地图函数(哈希映射表而不是图形地图)。 hasOwnProperty(b, c) --> b.has(c)
问题在于“b”没有“has”函数。
目前我没有更多的信息,我们正在继续调查。
祝大家好运。
敬礼 Vincent
编辑: 现在我明白了发生了什么。在我们的地图中的某个位置,我们重新定义了原型“Map”。这个原型不包含方法“has”,可能还有方法“set”(在我们的情况下就是这样)。 您必须在JS文件中搜索类似“Map.prototype.”的内容,这将指示您需要在哪里更正您的JS代码。 如果您无法删除此原型,那么您将需要重新定义缺失的方法。 例如,我们有以下原型:
function Map(){
    this.obj = {};
    this.count = 0;
}

我们必须使用以下方法完成这个原型:
Map.prototype.has=function(key){
    return this.obj[key] !== undefined;
}

Map.prototype.set = function(key, value){
    var oldValue = this.obj[key];
    if(oldValue == undefined){
        this.count++;
    }
    this.obj[key] = value;
    return oldValue;
}

通过这个修正,GoogleMaps JS的3.35版本可以正常工作。

希望对您有所帮助。

祝好, Vincent


Map现在是一个全局的EcmaScript对象:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map。在您的函数中最好使用这个名称。 - xomena

1

出现了一个不同的错误,但与之前相同:

map.js:56 Uncaught TypeError: this.j.keys 不是一个函数

将版本强制设置为3.34时没有问题,但3.35无法加载地图或标记。

经过数小时的尝试解决问题后,将一个js类重命名,使其不再被称为Map,问题得到解决。


这不是回答问题的方式,如果你遇到了问题,请考虑自己提出一个新问题。 - xashru
@xashru,这是同样的问题,但出现了不同的错误信息。我在尝试解决问题时没有找到任何相关信息,所以我认为这可能会帮助到其他遇到相同错误的人 - 这应该是一个评论吗?还是一个新问题,我自己回答/链接到这个问题? - zeeblet
啊,我没有足够的声望在那里添加评论。 - zeeblet
请您能否提供一些更多细节,关于您是如何解决这个问题的?比如你重命名了哪个 JavaScript 文件? - ANCHALOSE Y
1
@ANCHALOSEY 这是一个 js 文件 map.js,仅在我正在构建的应用程序中使用,该类名为 Map 导致冲突。 我将 class Map extends Controller 改为 class Mapper extends Controller, 问题得到解决。 - zeeblet
显示剩余2条评论

0
类似的情况。在流量庞大的应用程序中使用静态成熟代码已经8年了。直到今天早上,才发现我们一直在使用GMap API声明的保留ID之一来表示我们内部对象实例(“地图”)。不知道为什么它决定在今天爆炸。我们链接了较旧版本(3.29)的API。显然在Google这边有些变化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接