Google maps v3, JSON, Объекты и Опера - PullRequest
1 голос
/ 05 августа 2011

Я использую http://maps.google.com/maps/api/js?sensor=false для получения широты и долготы для адреса.

При извлечении данных из Google я сохраняю латы и lng в массивах myLat и myLng.

Конечный пользователь вводит адреса в текстовое поле вместе с именами зданий, которые также хранятся в их собственных библиотеках schoolAddressArray и schoolNameArray.

Я помещаю результаты в элемент div, называемый results -

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-е годы?0s?

В любом случае, код для IE, FF и Safari работает нормально, но я попробовал все, что мог придумать с Opera, и он просто не увидит маркеры как объект.

Я скопировал построенную строку из div результатов и жестко закодировал ее, чтобы увидеть, работает ли она вообще в опере, что она делает без ошибок.

Я также пробовал:

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

Я получил ошибки в диапазоне от невозможности конвертировать маркеры [index] в объект в исключение Uncaught: 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 для svgs, возвращаемых google, и некоторые предупреждения css в FF, но 0 ошибок.IE жалуется, когда Google не возвращает адрес, но после исправления этой проблемы в Opera я введу какой-нибудь код попытки и отлова для Google.

Я также попытался отправить строку в функцию и вернутьоценка, но пока ничего не получалось.

Заранее спасибо, и я надеюсь, что я следовал всем правилам при публикации на этом форуме.

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Любой современный браузер будет иметь свой собственный анализатор 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.

0 голосов
/ 06 августа 2011

это

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