Open infoWindow of specific marker from outside Google Maps (V3)

前端 未结 2 962
半阙折子戏
半阙折子戏 2020-12-30 07:55

I can\'t seem to get my head around this problem:

I\'ve got a map with (a lot of) markers (companies) that come from a generated XML file. Below the map, I want to s

相关标签:
2条回答
  • 2020-12-30 08:06

    You are on the right track. You just need to create a separate global array for your Marker objects and push all created markers to this array. When you write out all your company data to html include a call with the index of the marker executed on click. Below is an example code. I used JSON as my data structure to hold company info instead of XML.

    <html> 
    <head> 
        <meta name="viewport" content="initial-scale=1.0, user-scalable=yes" /> 
        <meta http-equiv="content-type" content="text/html; charset=UTF-8"/> 
        <title>Google Maps Scroll to Marker</title> 
    
        <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
    
    </head> 
    <body onload="initialize()"> 
    
        <div id="map_canvas" style="width: 900px;height: 600px;"></div> 
        <div id="companies"></div>
        <script type="text/javascript"> 
            var map;
            //JSON of company data - equivalent of your XML 
            companies = {
                "data": [
                {
                    "name": "Company 1",
                    "lat": 42.166,
                    "lng": -87.848 
                }, 
                {
                    "name": "Company 2",
                    "lat": 41.8358,
                    "lng": -87.7128 
                },
                {
                    "name": "Company 3",
                    "lat": 41.463, 
    
                    "lng": -88.870 
                },
                {"name":"Company 4",
                "lat":41.809, "lng":-87.790}		
                ]
            }
            //we will use this to store google map Marker objects 
            var markers=new Array();
            function initialize() {
                var chicago = new google.maps.LatLng(41.875696,-87.624207);
                var myOptions = {
                    zoom: 9,
                    center: chicago,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                }
                map = new google.maps.Map(document.getElementById("map_canvas"),
                    myOptions);
                listCompanies();
            }		 
    
            function listCompanies() {
                html = ""
            //loop through all companies
            for (i=0;i<companies.data.length;i++) {
            //get the maker postion
            lat  = companies.data[i].lat
            lng =  companies.data[i].lng
    
            //add google maps marker
            marker = new google.maps.Marker({
                map:map,
                position: new google.maps.LatLng(lat,lng),
                title: companies.data[i].name
            })
            markers.push(marker);
            html += "<div onclick=scrollToMarker(" + i + ")>"+companies.data[i].name+"</div>";
            }
            //display company data in html
            document.getElementById("companies").innerHTML =html;
            }
    
            function scrollToMarker(index) {
                map.panTo(markers[index].getPosition());
            }
    </script>
    
    </body> 
    </html> 

    Ok I added another solution for you - uising your code. This one uses your bindInfWindow function to bind the DOM (HTML) click event to open info window and scroll to marker. Please note that because you are loading companies dynamically the divs (or some other tags) that hold their names and ids must exist in the DOM BEFORE you start binding events to it - so the first function you need to execute is the one that renders companies HTML (not the map init). Please note I have not tested this one as I do not have your data..

    //you must write out company divs first
    
    <body onload="showCompanies()">
    
    
    
    <script>
    //JavaScript Document
    var map;
    //this is your text data
    var markers = new Array();
    
    
    //you need to create your company list first as we will be binding dom events to it so it must exist before marekrs are initialized
    function showCompanies() {
     downloadUrl("/ajax/member-xml-output.php?country=BE", function(data) {
        var xml = data.responseXML;
        markers = xml.documentElement.getElementsByTagName("marker");
    
        for (var i = 0; i < markers.length; i++) {
          var company = markers[i].getAttribute("company");
    
          markerId = "id_"+i;
    
          company_list += "<div id="+markerId+">"+company+"</div>";
        }       
    
        //display company data in html
        document.getElementById("company_list").innerHTML = company_list;
    
        //now you are ready to initialize map
        initialize_member_map("lang")
      });
    }
    
    function initialize_member_map(lang) {
      map = new google.maps.Map(document.getElementById("large-map-canvas"), {
        center: new google.maps.LatLng(50.85034, 4.35171),
        zoom: 13,
        mapTypeId: 'roadmap'
      });
    
    
    
    
        var xml = data.responseXML;
    
        var bounds = new google.maps.LatLngBounds();
        //your company data was read in and is ready to be mapped
        for (var i = 0; i < markers.length; i++) {
          var infoWindow = new google.maps.InfoWindow;
          var company = markers[i].getAttribute("company");
          var address = markers[i].getAttribute("address");
          var type = markers[i].getAttribute("type");
          var uid = markers[i].getAttribute("uid");
          var point = new google.maps.LatLng(
              parseFloat(markers[i].getAttribute("lat")),
              parseFloat(markers[i].getAttribute("lng")));
          var html = "<b>" + company + "</b> <br/>" + address;
          bounds.extend(point); 
          var marker = new google.maps.Marker({
            map: map,
            position: point,
            uid: uid
          });
          //add the new marker object to the gMarkers array
    
          markerId = "id_"+i;
          bindInfoWindow(marker, map, infoWindow, html,markerId); 
    
        }       
        map.setCenter(bounds.getCenter());
        map.fitBounds(bounds); 
    
    
    }
    
    function scrollToMarker(index) {
        map.panTo(markers[index].getPosition());
    }
    
    function bindInfoWindow(marker, map, infoWindow, html, markerId) {
      google.maps.event.addListener(marker, 'click', function() {
        infoWindow.setContent(html);
        infoWindow.open(map, marker);
      });
      //bind onlcick events to the div or other object in html
      markerObj =  document.getElementById(markerId);
      //you can create DOM event listeners for the map
      google.maps.event.addDomListener(markerObj, 'click', function() {
        infoWindow.setContent(html);
        infoWindow.open(map, marker);
        map.panTo(marker.getPosition());
      });
    
    }
    
    function downloadUrl(url, callback) {
      var request = window.ActiveXObject ?
          new ActiveXObject('Microsoft.XMLHTTP') :
          new XMLHttpRequest;
    
      request.onreadystatechange = function() {
        if (request.readyState == 4) {
          request.onreadystatechange = doNothing;
          callback(request, request.status);
        }
      };
    
      request.open('GET', url, true);
      request.send(null);
    }
    function doNothing(){
    }
    
    </script> 
    
    0 讨论(0)
  • 2020-12-30 08:13

    since i cannot remove this answer, I decided to add some notes!

    if your xml format is similar to this: http://www.w3schools.com/dom/books.xml

    you may access author nodeValue with following lines.

    markers = xml.documentElement.getElementsByTagName("book");
    
    for (var i = 0; i < markers.length; i++) {
      authors = markers[i].getElementsByTagName('author')[0].innerHTML;
    }
    

    hope it helps someone :)

    0 讨论(0)
提交回复
热议问题