*注意 - 此代码来自第三方扩展程序。我没有参与它的创作,几年前使用时它是当时唯一可用的扩展。因此,虽然我感谢您的意见,但我希望所有意见都可以仅仅针对某项决议提出建议。谢谢!
我们有许多网站为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只会发出一个新的错误,该错误会多次重复[对象]。
答案 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.openInfoWindowFX
和GMarker.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
。)