2013-06-17 1 views
0

У меня есть этот код, те же функции javascript, которые я использую для создания карты google с userMarker и того же значка, который будет загружен при инициализации карты. количества иконок, и они положение и InfoWindow данные и неизвестные все данные будут получать от внешнего JSon файлаПроблемы с получением метода json-файла

это код:

var oggetto = $.getJSON("eventi.json", function (data) { 
    oggetto = data; 
}); 


function initialize() { 
    var dueTorri = new google.maps.LatLng(44.493392, 11.346129); 
    var myOptions = { 
     zoom: 14, 
     center: dueTorri, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
    } 
    var map = new google.maps.Map(document.getElementById("main"), myOptions); 

    var userMarker = new google.maps.Marker({ 
     map: map, 
     draggable: true, 
     title: "Tu sei qui", 
     position: dueTorri, 
     icon: "marker/marker_eccoti.png" 
    }); 
    google.maps.event.addListener(userMarker, 'dragend', function (event) { 
     var newLatLong = userMarker.getPosition() 
     map.panTo(newLatLong); 
     var lati = newLatLong.lat(); 
     var longi = newLatLong.long(); 
    }); 

    setIcons(map, oggetto); 
} 


function setIcons(map, dati) { 
    for (var i = 0; i < dati.events.length; i++) { 
     var areaEventi = dati.events[i]; 
     var idEvento = areaEventi.event_id; 
     var tipo = areaEventi.type.type; 
     var sottotipo = areaEventi.type.subtype; 
     var descrizioni = new Array(); 
     for (var j = 0; j < areaEventi.description.length; j++) { 
      descrizioni[j] = areaEventi.description[j]; 
     } 
     var tempoIniziale = areaEventi.start_time; 
     var tempoUltima = areaEventi.freshness; 
     var stato = areaEventi.status; 
     var attendibilita = areaEventi.reliability; 
     var numeroNotifiche = areaEventi.number_of_notifications; 
     var lat_luogo = areaEventi.locations.lat; 
     var lng_luogo = areaEventi.locations.lng; 
     var myLatLng = new google.maps.LatLng(lat_luogo, lng_luogo); 
     if (tipo == "problemi_ambientali") { 
      var icon_image = { 
       url: 'marker/marker_ambiente.png' 
      }; 
     } 
     if (tipo == "reati") { 
      var icon_image = { 
       url: 'marker/marker_reato.png' 
      }; 
     } 
     if (tipo == "eventi_pubblici") { 
      var icon_image = { 
       url: 'marker/marker_evento.png' 
      }; 
     } 
     if (tipo == "emergenze_sanitarie") { 
      var icon_image = { 
       url: 'marker/marker_soccorsi.png' 
      }; 
     } 
     if (tipo == "problemi_stradali") { 
      var icon_image = { 
       url: 'marker/marker_strada.png' 
      }; 
     } 


     var icone = new google.maps.Marker({ 
      position: myLatLng, 
      map: map, 
      icon: icon_image, 
      title: tipo, 
      zIndex: i 

     }); 
     var contentString = '<div>' + 
      '<h3 id="tipologia">' + tipo + '</h3>' + 
      '<h4 id="subtipo">' + sottotipo + '</h4>' + 
      '<table>' + 
      ' <tr>' + 
      ' <td id="commento1">' + descrizioni[0] + '</td>' + 
      '</tr>' + 
      ' <tr>' + 
      '<td id="commento2">' + descrizioni[1] + '</td>' + 
      '</tr>' + 
      '<tr>' + 
      '<td id="commento3">' + descrizioni[2] + '</td>' + 
      '</tr>' + 
      '<tr>' + 
      '<td id="commento4">' + descrizioni[3] + '</td>' + 
      '</tr>' + 
      '<tr>' + 
      '<td id="commento5">' + descrizioni[4] + '</td>' + 
      '</tr>' + 
      '</table>' + 
      '<form method="post" action="">' + 
      '<p><input type="radio" name="status" value="Open" />Open<input type="radio" name="status" value="Closed" />Closed</p>' + 
      '<p>Descrizione:<input type="text" name="descrizione" /></p>' + 
      '<p><input type="submit" name="submit" value="Aggiorna" /></p>' + 
      '</form>' + 
      '</div>'; 
     var infowindow = new google.maps.InfoWindow(); 

     bindInfoW(icone, contentString, infowindow); 

     function bindInfoW(icone, contentString, infowindow) { 
      google.maps.event.addListener(icone, 'click', function() { 
       infowindow.setContent(contentString); 
       infowindow.open(map, icone); 

      }); 

     } 
    } 
} 
google.maps.event.addDomListener(window, 'load', initialize); 

и это Exemple из JSON с 2 события:

{ 
    "request_time": 1368095111, 
    "result": "Messaggio di servizio", 
    "from_server": "", 
    "events": [ 
     { 
      "event_id": "902438", 
      "type": { 
       "type": "problemi_stradali", 
       "subtype": "incidente" 
      }, 
      "description": ["ommioddio", "come na catapulta", "", "", ""], 
      "start_time": 1368045665, 
      "freshness": 1368085800, 
      "status": "open", 
      "reliability": 0.8, 
      "number_of_notifications": 2, 
      "locations": { 
       "lat": 37.42291810, 
       "lng": -122.08542120 
      } 

      }, 
     { 
      "event_id": "459459", 
      "type": { 
       "type": "problemi_stradali", 
       "subtype": "incidente" 
      }, 
      "description": ["mi hanno tamponato", "dottore chiami un dottore", "che guaio", "descr4", "descr5"], 
      "start_time": 1368105698, 
      "freshness": 1368106058, 
      "status": "open", 
      "reliability": 1.0, 
      "number_of_notifications": 4, 
      "locations": { 
       "lat": 37.42291810, 
       "lng": -122.08542120 
      } 

     } 
    ] 
} 

я использую EasyPHP, чтобы загрузить файл HTML, но когда он загрузит, есть все, кроме икон .. Каждый знает, в чем проблема? благодаря

+0

Заметили, что я получаю эту ошибку из хром консоли неперехваченным TypeError: Не удается прочитать свойство «длина» неопределенной refered к строке 46 – Roberto

+0

ОК я поставил код getJson в SetIcon и теперь я получаю ту же ошибку, но больше не с длиной, но с событиями – Roberto

+0

Вы должны отредактировать эти комментарии в своем вопросе, если они добавят полезную информацию самому вопросу. Кроме того, поскольку ссылки могут устаревать, вы должны, вероятно, отредактировать * соответствующие * части кода, дающие вам проблемы и в ваш вопрос. Кроме того, в консоли Chrome dev (и почти всех других консолях) вы можете щелкнуть номер строки справа от ошибки, чтобы перейти к строке, вызвавшей ошибку. Вероятно, вы выполняете 'someVar.length', а' someVar' 'undefined'. – ajp15243

ответ

1

Этот кусок кода ваша проблема:

var oggetto = $.getJSON("eventi.json", function(data) { 
    oggetto = data; 
}); 

Вы не можете ожидать oggetto содержать данные после этого - он будет содержать только объект запроса, который может быть перезаписан когда-нибудь в будущем. См. How do I return the response from an asynchronous call?.

Вместо этого поместите вызов setIcons в обратный вызов - при загрузке data.

+0

Я создал функцию, содержащую getJson с функцией setIcon в обратном вызове и вызвал ее в функции initialize, теперь она не дает мне никакой ошибки, но даже не загружает значки. – Roberto

+0

Хм, я не вижу, что там не там без демонстрации , Попробуйте 'console.log()' ваши значения в соответствующих частях, чтобы увидеть, что происходит. – Bergi

+0

ok Я разместил в callback consol.log (данные), и это показало мне это http://pastebin.com/BtPh5TWx – Roberto

0
This should help you 
    Object.keys(dati.events).length 

i don't think any problem with you code, You need to check for object present i.e is exist or not 

var dati_events JSON.parse(dati.events); 
alert(dati_events.dati_events.length); 

ЮО может также относиться http://developer.appcelerator.com/question/131660/jsonparse-cannot-return-length-undefined

+0

Обратите внимание, что ['Object.keys'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys) [не поддерживается в IE8 и ниже] (http://msdn.microsoft.com/en-us/library/ie/ff688127 (v = vs.94) .aspx). – ajp15243

+0

Я отредактировал это свой ответ, чтобы посмотреть –

Смежные вопросы