【问题标题】:Google maps v3, JSON, Objects and Opera谷歌地图 v3、JSON、对象和 Opera
【发布时间】:2011-08-05 19:06:00
【问题描述】:

我正在使用http://maps.google.com/maps/api/js?sensor=false 来检索地址的纬度和经度。

在从 google 检索数据时,我将 lats 和 lngs 存储到数组 myLat 和 myLng 中。

最终用户将地址连同建筑物的名称一起输入到文本区域,这些建筑物的名称也存储在他们自己的数组 schoolAddressArray 和 schoolNameArray 中。

我将结果放在一个名为 results 的 div 中 --

document.getElementById("results")

然后我将构造的字符串并使用 eval 将其转换为“类似 JSON”的对象。

PHP start

global $browser;

if(strpos($_SERVER["HTTP_USER_AGENT"], "Opera") !== FALSE)
{ 
    $browser = "opera";
}
if(strpos($_SERVER["HTTP_USER_AGENT"], "MSIE") !== FALSE)
{ 
    $browser = "msie";
}
if(strpos($_SERVER["HTTP_USER_AGENT"], "Firefox") !== FALSE)
{ 
    $browser = "ff";
}
if(strpos($_SERVER["HTTP_USER_AGENT"], "Safari") !== FALSE)
{ 
    $browser = "safari";
}
echo'
<script type="text/javascript">
<!--
var $whichBrowser = "'; echo $browser; echo'";
-->
</script>
';

PHP end

这是 JavaScript 开始的地方

var strlen = tempVar.length;
var myNewTempVar = tempVar.slice(0,strlen-2)+']';
document.getElementById("results").innerHTML = myNewTempVar;
if($whichBrowser == "msie")
{
    //alert(document.getElementById("results").childNodes[0].nodeValue);
    markers = window.eval(document.getElementById("results").childNodes[0].nodeValue);
}
else if($whichBrowser == "opera")
{
    //markers = window.eval([getProperty(tempVar.slice(1,strlen-2))]);
    //alert(markers);
    //markers = [{ lat: 34.0878234, lng: -118.1543285, name: "1 school"}, { lat: 34.071239, lng: -118.1506133, name: "2 school"}, { lat: 34.1015362, lng: -118.1328816, name: "3 school"}, { lat: 34.098139499, lng: -118.1168382, name: "4 school"}, { lat: 34.0751855, lng: -118.1381771, name: "5 school"}, { lat: 34.0856624, lng: -118.1345840, name: "6 school"}, { lat: 34.0951319, lng: -118.1421722, name: "7 school"}, { lat: 34.0760016, lng: -118.1281349, name: "8 school"}, { lat: 34.0621694, lng: -118.1291052, name: "9 school"}, { lat: 34.0583261, lng: -118.1563075, name: "10 school"}, { lat: 34.046435, lng: -118.1524630, name: "11 school"}, { lat: 34.054128899, lng: -118.1280777, name: "12 school"}];
    for(var myX=0;myX<myLat.length;myX++)
    {
        markers.push(["{ lat: "+myLat[myX]+",  lng: "+myLng[myX]+",  name: "+schoolNameArray[myX]+"}"]);
    }
    alert(markers);
}
else
{
    markers = eval('('+myNewTempVar+')');
}

JavaScript 结束

如你所见,我使用的是 PHP 的

strpos($_SERVER["HTTP_USER_AGENT"]

找出最终用户正在使用什么浏览器,然后回显一些javascript来设置变量$whichBrowser。自 2000 年代初以来,这一直对我有用——顺便说一句,我不知道该怎么称呼它。 90年代就是90年代。这些是10岁吗? 0?

无论如何,IE、FF 和 Safari 的代码都可以正常工作,但我已经尝试了所有我能想到的 Opera,它只是不会将标记视为对象。

我已经从结果 div 中复制了构造的字符串并对其进行了硬编码,以查看它是否在 opera 中完全有效,它完全没有错误。

我也试过了:

for(index in myLat)
{
 markers[index].lat = myLat[index];
 markers[index].lng = myLng[index];
 markers[index].name = schoolNameArray[index];
}

我收到了从无法将标记[索引] 转换为对象到未捕获异常的错误:RangeError: Maximum recursion depth exceeded

这是我正在使用的测试数据:

2821 W. Commonwealth Ave., Alhambra, CA
2001 S. Elm St., Alhambra, CA
110 W. McLean St., Alhambra, CA
100 S. Granada Ave., Alhambra, CA
1603 S. Marguerita Ave., Alhambra, CA
409 S. Atlantic Blvd., Alhambra, CA
301 N. Marengo Ave., Alhambra, CA
509 W. Norwood Pl., Alhambra, CA
120 S. Ynez Ave., Monterey Park, CA
400 Casuda Canyon Dr., Monterey Park, CA
1701 Brightwood St., Monterey Park, CA
650 Grandridge Ave., Monterey Park, CA

这是我的测试服务器的链接—— http://kronusproductions.com/mycarpaysme_ajax/test_street_view13.php

如您所见,在 IE、Safari 和 FF 中没有报告错误,但 Opera 是另一回事。

Safari 中针对 google 返回的 svg 的一些警告和 FF 中的一些 css 警告,但 0 错误。当 google 不返回地址时 IE 会报错,但在 Opera 中修复此问题后,我会输入某种 try and catch 代码供 google 使用。

我也尝试将字符串发送到函数并返回评估,但到目前为止没有任何效果。

在此先感谢,我希望我已按照所有规则在此论坛上发帖。

【问题讨论】:

  • 不要在 javascript 数组上使用 for(index in myLat)。此外,使用eval 几乎总是一个好兆头,表明您做错了什么。

标签: javascript json google-maps object opera


【解决方案1】:

任何现代浏览器都会有自己的 JSON 解析器:

JSON.parse('{"hello": ".jpg"}')

使用它而不是eval

var points = {filled: false};
if(typeof(JSON) != undefined){
   points = JSON.parse(jsonString);
   points.filled = true;
}else{
   alert('Come back after you upgrade your janky old browser');
}
if(points.filled){//get the data you want here

也不需要浏览器检测。好吧,除非你真的想获得那些 IE6 用户。

【讨论】:

  • 首先,感谢您的回复:当我尝试时:for(var myX=0;myX
  • 你为什么要做一个字符串来做一个对象?
  • 我收到 -- 未捕获的异常:SyntaxError: JSON.parse: Unescaped control char in string: "1
  • 我正在将一个字符串制作成一个对象,以便谷歌地图可以使用该对象来生成动态标记。所有其他浏览器都工作得很好。我只有 Opera 有问题,因此,我试图给 Opera 一个对象以发送给谷歌。
  • 感谢您的帮助 -- kronusproductions.com/mycarpaysme_ajax/test_street_view15.php -- 当 google 没有特定位置的全景图时,我还可以添加 try and catch 以便 IE 查找空 obj。原来我的 eval 为其他浏览器工作的原因是因为它忽略了从 textareas 读取的新行空间。那是未转义的控制字符。现在所有浏览器都使用相同的代码 JSON.parse 并且不再使用 eval。再次感谢
【解决方案2】:

这个

for(index in myLat){
 markers[index].lat = myLat[index];
 markers[index].lng = myLng[index];
 markers[index].name = schoolNameArray[index];
}

应该是

for(var i=0;i<myLat.length;i++){
     markers.push({
        lat: myLat[i],
        lng: myLng[i],
        name: schoolNameArray[i]
    });
}

【讨论】:

  • 非常感谢。那个好漂亮。我的地图目前正在使用我拥有的代码,而 Opera 的问题是它使用了 textarea 中的换行符,其中包含学校的用户名。我在 schoolNameArray 上放置了一个修剪函数,该函数删除了换行符。然而,话虽如此,我相信这段代码比我的要好得多,我将创建 test_street_view16.php 来测试它。非常感谢。链接是——kronusproductions.com/mycarpaysme_ajax/test_street_view16.php
  • 好的,刚刚测试过了,在 Safari 中,我收到 TypeError 错误:表达式'markers[0]' [undefined] 的结果不是对象。
  • 对不起,我是个白痴。我将对象标记设置为 tempObj,因此我用空对象覆盖标记。它完美地工作。有没有人有链接可以帮助我找到替代地址,谷歌是否应该找不到与该地址关联的图像(全景图)?你知道,就像最近的带有全景图的地址。反向地理编码会给我带来另一个地址,但不一定会产生另一个全景图。
  • 为这个问题选择一个答案,然后开始一个新问题。
  • 我为这个答案点击了“是”,但我看不出它有什么不同。如何选择答案?
猜你喜欢
  • 1970-01-01
  • 2012-06-20
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 2015-04-20
  • 2012-08-03
相关资源
最近更新 更多