【问题标题】:Google maps data type throws Type Error: can't convert undefined to object谷歌地图数据类型抛出类型错误:无法将未定义转换为对象
【发布时间】:2012-07-22 22:51:32
【问题描述】:

在我们所有的 Umbraco 网站中,Google 地图数据类型不再有效。直到昨天这工作完美,但今天只有输入字段和位置字段,而不是谷歌地图......

Firebug 报告以下错误

错误:TypeError:无法将未定义转换为对象 源文件:http://mydomain.com/WebResource.axd?d=tKK1ZgJBCMotVXJtV8pR9xzMqTmklCMezxGDl1po1iuUqd9OAFswOEzHFzCaf_jVz-AUweHtY9QXIBqtRjeITKZJW8DsgNEfWr5d43rOLcGkPLOTDqcjla1Kf5Atxrk4V0fVru8i1i6pj_kgbZvebWAyHrkbCDipPWDziYWT-lCHW-WaHOcz5hS1DefZvkJSICxqjpdChghoCUZhju3cHg2&t=634759042640000000&cdv=1 线路:212

它在行中

context._maps[id] = new UmbracoGoogleMap.map(id, this);

在下面的函数中

guiMap: function () {
    var context = this;
    this._apiLoaded = true;
    jQuery('div.gmapContainer').each(function () {
        var id = jQuery('div.map', this).attr('id');
        context._maps[id] = new UmbracoGoogleMap.map(id, this);
        context._maps[id].render();
    });
},

还有很多其他人也报告了同样的问题,但还没有找到解决方案! http://our.umbraco.org/projects/backoffice-extensions/google-maps-datatype/bug-reports/33390-No-map-in-Backend

【问题讨论】:

  • 其中一个引用未定义,但代码尝试访问它。我的猜测是context,_maps。另一个猜测是 id 是未定义的(上面的行不返回 id)并且构造函数抛出异常,因为例如它试图获取给定 id 的 div 并访问其属性。无论如何,您只需要一些日志记录。
  • 对我来说,更大的问题是发生了什么让 JavaScript 在所有安装中中断?由于昨天(大量)报告了此问题,Google Maps API 是否有任何更改/更新可能会产生这种影响?
  • @leekelleher 令人困惑 - 我找不到任何关于重大更改的谷歌公告,但这似乎是最可能的原因

标签: javascript asp.net google-maps umbraco webresource.axd


【解决方案1】:

看起来问题与上下文有关。它被设置为窗口而不是 UmbracoGoogleMapMapDataType 作为“this”指向错误的地方。所以我尝试了:

var context = UmbracoGoogleMapMapDataType;
this._apiLoaded = true;
jQuery('div.gmapContainer').each(function () {
    var id = jQuery('div.map', this).attr('id');
    context._maps[id] = new UmbracoGoogleMap.map(id, this);
    context._maps[id].render();
});

现在这似乎是一个临时补丁。如果你愿意,你可以从https://www.dropbox.com/s/3aj91cuzxn3rcbu/Our.Umbraco.GoogleMaps.zip下载dll

【讨论】:

  • +1 干得好,我可以更改 \umbraco\editcontent.aspx 并插入底部的 javascript 并修复地图。但是我将如何在您的 Dropbox 下载中引用 dll 来执行相同的修复 - 我有点困惑?
  • 您只需解压缩 dll 并将其放入您的 bin 中。
  • 仅供参考,Google Maps DataType 的更新版本现在可用于download
【解决方案2】:

我们对错误发生的原因进行了一些挖掘,显然这是由于更新了Google Maps Javascript API。我们发现永久修复是通过在 ajax 请求中添加 v: "3.8" 来请求特定版本的 API:

UmbracoGoogleMap.loadMapsApi = function (cb) {
    jQuery.ajax({
        type: "get",
        dataType: "script",
        url: 'http://maps.google.com/maps/api/js',
        data: {
            v: "3.8",
            sensor: false,
            callback: cb
    },
    error: function () { alert('Could not load Google Maps API'); }
});

根据documentation,如果未指定版本,则谷歌返回最新的夜间版本。事实上,他们明确指出:

生产应用程序应始终指定次要版本(例如 3.7、3.8 等)。

我们可以看到,最新版本的 3.9 破坏了与 Google Maps 数据类型的兼容性,因此出现了错误。

更新:Google Maps DataType 的 2.0.5 版现已推出,其中包含上述修复。感谢李凯莱赫!

【讨论】:

  • 谢谢道格拉斯,这对我来说更有意义! #h5yr
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-12
  • 2018-03-22
  • 2023-04-03
相关资源
最近更新 更多