Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 未捕获的语法错误:意外标记)_Javascript_Google Maps_Google Maps Api 2 - Fatal编程技术网

Javascript 未捕获的语法错误:意外标记)

Javascript 未捕获的语法错误:意外标记),javascript,google-maps,google-maps-api-2,Javascript,Google Maps,Google Maps Api 2,*注意-此代码来自第三方扩展。我没有参与它的创建,几年前使用它时,它是当时唯一可用的扩展。所以,虽然我很欣赏你的意见,但我希望所有的评论都能仅仅是对决议的建议。谢谢 我们有许多网站为CMS运行谷歌地图组件,允许客户向谷歌地图添加标记和轮廓(多边形) 这已经运行多年了。需要注意的是,它使用的是谷歌地图JSAPI2,而不是API3。然而,谷歌注意到API 2在2013年仍能正常工作,所以这不是问题所在。然而,他们一定改变了一些东西,因为前几天,在我们所有的网站上,虽然地图上出现了标记和多边形,但没有

*注意-此代码来自第三方扩展。我没有参与它的创建,几年前使用它时,它是当时唯一可用的扩展。所以,虽然我很欣赏你的意见,但我希望所有的评论都能仅仅是对决议的建议。谢谢

我们有许多网站为CMS运行谷歌地图组件,允许客户向谷歌地图添加标记和轮廓(多边形)

这已经运行多年了。需要注意的是,它使用的是谷歌地图JSAPI2,而不是API3。然而,谷歌注意到API 2在2013年仍能正常工作,所以这不是问题所在。然而,他们一定改变了一些东西,因为前几天,在我们所有的网站上,虽然地图上出现了标记和多边形,但没有。它们在不同的服务器上

以前没有错误,但现在Chrome上显示:

JS文件中第1669行的“未捕获SyntaxError:意外标记”。您可以在以下要点中看到该文件:

正如你所看到的,这段代码已经在近100个网站上运行了多年,没有被修改过,所以假设谷歌那边的某些东西一定发生了变化。但我们是否可以调整此代码以帮助应对这些变化-更新于3月25日,当时谷歌对谷歌地图API 2进行了更新

在web上搜索,下面是一个示例站点,它使用了相同的组件,但出现了相同的错误:

这个问题似乎很接近:

// 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); } } //从叠加函数中提取当前有向图 var digraph=GMap.addOverlay.toString().replace(/\s/g').replace(/.push\([^{]+\);a.initialize\([^{]+\);a.redraw\([^{]+\).+$/,'').replace(/^.+\,''); //一次添加多个覆盖(api hack提高加载速度) GMap2.prototype.addOverlays=函数(a){ var b=eval('this.'+有向图); var i=a.长度; 而(我--){ b、 推(a[i]); a[i]。初始化(此); a[i]。重新绘制(真); } } 如果代码需要修改,是否有人可以将修改后的版本发布在摘要或粘贴上


另一个更新-我注释掉了上面pre中的代码,因为它可能不需要被黑客用来加速。尽管注释中指出了一个错误,但仍然得到了一个错误。我在这里注意到:它将代码称为“addOverlays”,而不是“addOverlays”所以想知道s是否在最近的API Google更新中被删除了。在所有三个位置删除s只会引发一个新的错误,该错误会重复[object]多次。

这段代码很难看。您可以
GMap.addOverlay.toString()
,用正则表达式替换某些内容,然后用eval执行它


为什么您需要替换函数代码中的某些内容?GMap.addOverlay的代码是什么?如果您能回答这些问题,您应该能够了解为什么您的regexp不再工作并返回无效代码。

很明显,
GMap.addOverlay
函数定义已经更改,您的regexp黑客攻击正在进行中它的源代码不再有效

alert(GMap.addOverlay.toString())

查看新函数是什么以及正则表达式对它做了什么


究竟为什么您需要就地修改他们的代码?为什么不复制您想要的函数定义,进行更改,然后使用该版本?(也不需要
评估

这段代码令人憎恶,事实上,我在使用和帮助版本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自己的
addOverlays()
方法添加对象数组的每个成员。因此,我们使用一个公开的方法,而不是试图劫持API的缩小代码-如果我们再次这样做,它几乎肯定会再次崩溃



GMarker.prototype.openInfoWindowFX
GMarker.prototype.updateinfo window
是对GMarker的补充,不太可能导致问题(特别是如果它们当前工作的话),尽管他们甚至使用了GMarker的属性,但这并不推荐。

您发布的代码依赖于
GMap2.prototype.addOverlay的内部实现细节,可以随时更改

对于
GMap2
,最好只依赖外部接口。您可以实现如下
addOverlays
方法:

GMap2.prototype.addOverlays = function(overlays) {
  for (var i = 0, I = overlays.length; i < I; ++i) {
    this.addOverlay(overlays[i]);
  }
};
GMap2.prototype.addOverlays=函数(覆盖){
对于(变量i=0,i=overlays.length;i

你能用这个替换你文章中的代码片段,看看它是否有效吗?

我建议用JSLint替换它,因为当JSLint验证处于活动状态时,Aptana会显示许多错误。这样你肯定会发现你的问题。@helly0d:SyntaxError似乎发生在eval中。我想JSLint找不到,它只会说“不要使用eval”:-)@Bergi首先,它实际上说“eval是邪恶的”,第二点,即使如此,你也应该JSLint它,因为它有很多错误,最后但并非最不重要的是,尝试查看发送给eval的代码并调试它,如果它有错误,或者为未完成的JS代码制作一个修复工具,或者说服Google JSLint他们的代码:p.所以
GMap2.prototype.addOverlays = function(overlays) {
  for (var i = 0, I = overlays.length; i < I; ++i) {
    this.addOverlay(overlays[i]);
  }
};