2011-08-05 58 views
1

我使用http://maps.google.com/maps/api/js?sensor=false來檢索地址的經度和緯度。Google地圖v3,JSON,對象和Opera

從google中檢索數據時,我將lats和lng存儲到數組myLat和myLng中。

最終用戶將地址輸入到textarea以及也存儲到自己的arrarys schoolAddressArray和schoolNameArray中的建築物名稱中。

我放在一個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年代。這是十幾歲嗎? 0s?無論如何,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:最大遞歸深度超過

下面是測試數據我使用:

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返回的svgs和FF中的一些css警告,但是有0個錯誤。如果地址沒有被google返回,IE會抱怨,但是我會在Opera中解決這個問題之後,爲谷歌輸入一些try和catch代碼。

我已經嘗試將字符串發送到一個函數並返回評估,但沒有任何工作到目前爲止。

在此先感謝,我希望我已遵循發佈到此論壇的所有規則。

+0

不要使用'對JavaScript陣列上(在myLat指數)'。另外,使用'eval'幾乎總是一個很好的跡象,表明你做的事情非常錯誤。 – dtanders

回答

0

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] 
    }); 
} 
+0

非常感謝你。那個好漂亮。我目前正在使用我已經使用的代碼的地圖,Opera的問題在於它使用了textarea中的新行字符,並在其中保存用戶名稱作爲學校名稱。我在schoolNameArray上放置了一個修剪功能,它刪除了新的行字符。然而,據說,我相信這個代碼比我的好得多,我會創建test_street_view16.php來測試它。非常感謝。鏈接是 - http://kronusproductions.com/mycarpaysme_ajax/test_street_view16.php – kronus

+0

好的,只是測試了它,並在Safari中,我收到TypeError的錯誤:表達式的結果'markers [0]'[undefined]不是一個對象。 – kronus

+0

對不起,我是個白癡。我將對象標記設置爲tempObj,因此我用空對象覆蓋了標記。它完美的作品。有沒有人有鏈接來幫助我找到替代地址,谷歌沒有找到與地址相關的圖像(全景圖)?你知道,就像全景的最接近的地址。反向地理編碼會給我帶來另一個地址,但不一定會產生另一個全景圖。 – kronus

1

任何現代的瀏覽器將擁有自己的JSON解析器:

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

使用的是和NOT 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用戶。

+0

首先,對於答覆感謝: 當我嘗試: \t \t爲(VAR MYX = 0; MYX kronus

+0

你爲什麼要創建一個字符串來創建一個對象? – dtanders

+0

我收到 - 未捕獲的異常:SyntaxError:JSON.parse:字符串中未轉義的控制字符:「1 – kronus