未捕获的SyntaxError:意外的令牌)

时间:2012-03-29 14:57:21

标签: javascript google-maps google-maps-api-2

*注意 - 此代码来自第三方扩展程序。我没有参与它的创作,几年前使用时它是当时唯一可用的扩展。因此,虽然我感谢您的意见,但我希望所有意见都可以仅仅针对某项决议提出建议。谢谢!

我们有许多网站为CMS运行Google地图组件,允许客户在其Google地图中添加标记和轮廓(多边形)。

这已经工作多年了。需要注意的是,它使用的是Google Maps JS API 2,它已经停止使用而不是API 3.但是,谷歌已经注意到API 2仍将在2013年运行良好,因此这不是问题。然而,它们必定已经改变了一些东西,因为从前几天开始,在我们所有的网站上,虽然地图显示标记而多边形没有。它们位于不同的服务器上。

在没有错误之前,但现在在Chrome中说:

“Uncaught SyntaxError:Unexpected token”“对于JS文件中的第1669行。您可以在以下Gist中看到该文件:

https://gist.github.com/2238148

正如你所看到的那样,没有遗漏“)”并且代码在近100个网站上已经多年没有修改,所以假设谷歌的某些内容必须改变。但是,有什么我们可以调整这个代码来帮助抵消变化吗? - 更新于3月25日,所有这一切都打破了Google对其Google Maps API 2的更新。

搜索网络,此处是一个使用相同组件且具有相同错误的示例网站:http://goo.gl/GMgOs

此问题似乎已接近:

// extract current digraph from overlay function
    var digraph = GMap.addOverlay.toString().replace(/\s/g,'').replace(/.push\([^{]+\);a.initialize\([^{]+\);a.redraw\([^{]+\).+$/,'').replace(/^.+\./,'');
    // add multiple overlays at once (api hack to improve loading speed)
    GMap2.prototype.addOverlays = function(a) {
        var b = eval('this.' + digraph);
        var i = a.length;
        while (i--) {
            b.push(a[i]);
            a[i].initialize(this);
            a[i].redraw(true);
        }
    }

如果需要更改该代码,有人可以将修改后的版本发布在要点或贴图上吗?

另一个更新 - 上面的前面的代码我注释掉了,因为它是不需要的,这是一个加快速度的黑客行为。仍然会收到错误,但在评论中注明。我确实在这里注意到:https://developers.google.com/maps/documentation/javascript/v2/reference#GMap2.Methods.Overlays它调用代码“addOverlay”而不是“addOverlays”,所以想知道是否可能在最新的API Google更新中取消了。删除所有三个位置的s只会发出一个新的错误,该错误会多次重复[对象]。

4 个答案:

答案 0 :(得分:2)

代码是令人厌恶的,实际上我在使用和帮助第2版用户的五年中没有看到更糟糕的附加组件。它覆盖了GMap(版本2 API的一部分,以提供与版本1的兼容性) )没有重新声明。你得到的错误是对破解代码的直接结果:这在某些时候肯定会失败,而且永远不应该实现。

您可以做的最好的事情是删除var digraph行,然后重新定义其后的新方法GMap2.prototype.addOverlays。这将允许代码使用API​​的addOverlay()函数,并应该消除问题。

GMap2.prototype.addOverlays = function(a) {
        var i = a.length;
        while (i--) {
             this.addOverlay(a[i]);
        }

addOverlays()似乎采用了一系列叠加层。现有方法尝试将它们直接添加到已移动的叠加层的内部数组中。建议的方法只是使用GMap2自己的addOverlay()方法来添加对象数组的每个成员。因此,我们使用一个公开的方法,不要试图劫持API的缩小代码 - 如果我们再次这样做,它几乎肯定会再次破坏。


GMarker.prototype.openInfoWindowFXGMarker.prototype.updateInfoWindow是GMarker的补充,不太可能导致问题(特别是如果它们目前有效),尽管它们使用的是GMarker的属性 - 这并不是真正的推荐。

答案 1 :(得分:2)

您发布的代码依赖于GMap2.prototype.addOverlay的内部实施详细信息,可随时更改。

最好只依靠GMap2的外部接口。您可以实现addOverlays方法:

GMap2.prototype.addOverlays = function(overlays) {
  for (var i = 0, I = overlays.length; i < I; ++i) {
    this.addOverlay(overlays[i]);
  }
};

您可以使用此替换帖子中的代码段并查看它是否有效吗?

答案 2 :(得分:1)

那段代码很难看。你做GMap.addOverlay.toString(),用正则表达式替换一些东西然后用eval执行它。

为什么需要替换函数代码中的某些内容? GMap.addOverlay的代码是什么?如果您可以回答这些问题,那么您应该能够了解为什么正则表达式不再起作用并返回无效代码。

答案 3 :(得分:1)

显然,GMap.addOverlay函数定义已更改,并且您对其源代码的RegExp黑客攻击不再有效。

alert(GMap.addOverlay.toString())

alert(digraph)

要查看新功能是什么以及你的正则表达式对它做了什么。

为什么你需要就地修改他们的代码呢?你为什么不只是复制你想要的功能定义,进行更改,然后使用该版本? (也不需要eval。)