Получить последний узел XML-файла карт Google - PullRequest
1 голос
/ 23 августа 2010

Я играл с Google Maps API v3, потому что версия v устарела и больше не работает для моего сайта

Вместо отображения каждого указателя в xml-файле на карте я хочу отобразить текущий маркер, который будет иметь отношение к этой странице. У меня есть страница событий, поэтому я хочу показать информацию о событии и отобразить карту только для этого события, взятую из XML-файла.

У меня все это работает, за исключением того, что мне нужно указать идентификатор в URL-адресе, и это то, что мне нужно сделать, но что делать, если в URL-адресе не установлен идентификатор.

Скажем, мой URL будет www.mysite.com/events.php, на котором не будет отображаться карта, потому что нет идентификатора, но если я использую www.mysite.com/events.php?id=1, карта покажет

мне нужно определить, есть ли идентификатор в URL, а если нет, найти последний маркер файла xml и показать его, поскольку он будет самым текущим

Вот код Google вместе с моими дополнениями, которые проверяют наличие идентификатора в URL

   function load() {
          var map = new google.maps.Map(document.getElementById("map"), {
            center: new google.maps.LatLng(50.618438, -3.420304),
            zoom: 13,
            mapTypeId: 'roadmap'
          });
          var infoWindow = new google.maps.InfoWindow;

          // Change this depending on the name of your PHP file
          downloadUrl("results.xml", function(data) {
            var xml = data.responseXML;
            var the_id = gup('id');

            var markers = xml.documentElement.getElementsByTagName("marker");
            var last = markers.length-1;

            for (var i = 0; i < markers.length; i++) {
                if (markers[i].hasAttribute('id')) {
                    //if there is, test its value
                    if (markers[i].getAttribute('id') == the_id) {
                          var name = markers[i].getAttribute("name");
                          var address = markers[i].getAttribute("address");
                          var type = markers[i].getAttribute("type");
                          var point = new google.maps.LatLng(
                              parseFloat(markers[i].getAttribute("lat")),
                              parseFloat(markers[i].getAttribute("lng")));
                          var html = "<b>" + name + "</b> <br/>" + address;
                          var icon = customIcons[type] || {};
                          var marker = new google.maps.Marker({
                            map: map,
                            position: point,
                            icon: icon.icon,
                            shadow: icon.shadow
                          });

                        bindInfoWindow(marker, map, infoWindow, html);
                     }
                     else {
                         var name = markers[last].getAttribute("name");
                          var address = markers[last].getAttribute("address");
                          var type = markers[last].getAttribute("type");
                          var point = new google.maps.LatLng(
                              parseFloat(markers[last].getAttribute("lat")),
                              parseFloat(markers[last].getAttribute("lng")));
                          var html = "<b>" + name + "</b> <br/>" + address;
                          var icon = customIcons[type] || {};
                          var marker = new google.maps.Marker({
                            map: map,
                            position: point,
                            icon: icon.icon,
                            shadow: icon.shadow
                          });

                        bindInfoWindow(marker, map, infoWindow, html);
                     }

                }
            }
          });
        }

Я добавил else, поэтому он должен заменить i в цикле for последним маркером xml, но он не работает

а вот функция, которая получает идентификатор из URL

function gup( name ) {
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results == null )
    return "";
  else
    return results[1];
}

Я думаю, мне нужно проверить, присутствует ли идентификатор, если нет, получить последний маркер.

1 Ответ

1 голос
/ 23 августа 2010

Ах ... во-первых, ваше предложение "else" находится на неправильном уровне (и привязано к неправильному, если). Это выполняется один раз для каждого маркера с идентификатором , потому что он находится внутри цикла for. Как минимум, вы должны переместить остальное из цикла for.

Но цикл for тоже не нужен. Вместо того, чтобы проходить по элементам маркера, проверяя, какой из них имеет правильный идентификатор, используйте getElementById(id):

 var the_id = gup('id');
 var respDoc = data.responseXML.documentElement
 var the_marker = respDoc.getElementById(the_id);
 // If the_id is '' then there will be no such marker, and the_marker will be
 // null, which is "falsy".
 if (!the_marker) {
   var markers = respDoc.getElementsByTagName("marker");
   // check whether there are any markers.
   if (markers.length < 1) return; // avoid errors
   the_marker = markers[markers.length - 1];
 }
 // Now do what you need to with the_marker.getAttribute("name") etc.
 // This is just your code, with markers[i] replaced by the_marker:
 var name = the_marker.getAttribute("name");
 var address = the_marker.getAttribute("address");
 var type = the_marker.getAttribute("type");
 var point = new google.maps.LatLng(
   parseFloat(the_marker.getAttribute("lat")),
   parseFloat(the_marker.getAttribute("lng")));
 var html = "<b>" + name + "</b> <br/>" + address;
 var icon = customIcons[type] || {};
 var marker = new google.maps.Marker({
    map: map,
    position: point,
    icon: icon.icon,
    shadow: icon.shadow
 });

 bindInfoWindow(marker, map, infoWindow, html);

(тестировалась.)

Наконец, я заметил, что используемый вами gup () смотрит на window.location.href, URL текущей веб-страницы. Это является , что вы хотите, верно? ОК, просто проверяю ...

...