เครื่องหมายหลายตัวของ Google Maps API พร้อม Infowindows


93

ฉันกำลังพยายามเพิ่มเครื่องหมายหลายตัวด้วยหน้าต่างข้อมูลของตัวเองที่ปรากฏขึ้นเมื่อคลิก ฉันกำลังมีปัญหากับการทำให้อินโฟวินโดวส์ปรากฏขึ้นเมื่อฉันลองใช้งานอาจมีเครื่องหมายเพียงตัวเดียวโดยไม่มีหน้าต่างข้อมูล

ขอบคุณโปรดแจ้งให้เราทราบหากคุณต้องการข้อมูลเพิ่มเติม

<meta name="viewport" content="initial-scale=1.0, user-scalable=no"/>
<style type="text/css">
html {
    height: 100%
}

body {
    height: 100%;
    margin: 0;
    padding: 0
}

#map_canvas {
    height: 100%
}
</style>
<script type="text/javascript"
    src="http://maps.googleapis.com/maps/api/js?key=AIzaSyB1tbIAqN0XqcgTR1-FxYoVTVq6Is6lD98&sensor=false">
</script>
<script type="text/javascript">

var locations = [
    ['loan 1', 33.890542, 151.274856, 'address 1'],
    ['loan 2', 33.923036, 151.259052, 'address 2'],
    ['loan 3', 34.028249, 151.157507, 'address 3'],
    ['loan 4', 33.80010128657071, 151.28747820854187, 'address 4'],
    ['loan 5', 33.950198, 151.259302, 'address 5']
];

function initialize() {

    var myOptions = {
        center: new google.maps.LatLng(33.890542, 151.274856),
        zoom: 8,
        mapTypeId: google.maps.MapTypeId.ROADMAP

    };
    var map = new google.maps.Map(document.getElementById("default"),
        myOptions);

    setMarkers(map, locations)
}


function setMarkers(map, locations) {

    var marker, i
    for (i = 0; i < locations.length; i++) {

        var loan = locations[i][0]
        var lat = locations[i][1]
        var long = locations[i][2]
        var add = locations[i][3]

        latlngset = new google.maps.LatLng(lat, long);

        var marker = new google.maps.Marker({
            map: map, title: loan, position: latlngset
        });
        map.setCenter(marker.getPosition())

        var content = "Loan Number: " + loan + '</h3>' + "Address: " + add

        var infowindow = new google.maps.InfoWindow()

        google.maps.AddListener(marker, 'click', function (map, marker) {
            infowindow.setContent(content)
            infowindow.open(map, marker)
        });
    }
}


</script>
</head>
<body onload="initialize()">
<div id="default" style="width:100%; height:100%"></div>
</body>
</html>

2
ใช้เพียงหน้าต่างเดียวที่สร้างขึ้นก่อนเครื่องหมาย จากนั้นเหตุการณ์คลิกของคุณสำหรับแต่ละเครื่องหมายจะทำงานได้อย่างถูกต้อง ตัวแปรcontentภายในตัวฟังเหตุการณ์ของคุณไม่ได้กำหนดไว้ในฟังก์ชันนั้น
js1568

1
เช่นเดียวกับความคิดเห็นสั้น ๆ หากคุณจัดรูปแบบโค้ดของคุณได้ดีก็จะอ่านได้ง่ายขึ้นมาก
paullb

1
@paullb ฉันจะจัดรูปแบบใหม่ฉันเขียนคำถามนี้เหมือน 4 ปีที่แล้วเมื่อฉันยังเป็นมือใหม่ :)
stacktraceyo

ตรวจสอบบทช่วยสอนนี้เพื่อแสดง infoWindow เครื่องหมายหลายรายการด้วยการคลิกและโฮเวอร์freakyjolly.com/…
Code Spy

คำตอบ:


206

คุณสามารถใช้การปิด เพียงแค่แก้ไขโค้ดของคุณดังนี้:

google.maps.event.addListener(marker,'click', (function(marker,content,infowindow){ 
    return function() {
        infowindow.setContent(content);
        infowindow.open(map,marker);
    };
})(marker,content,infowindow));  

นี่คือการสาธิต


2
ฉันใช้งานได้ แต่ฉันจะเปลี่ยนรหัสได้อย่างไรเมื่อฉันคลิกที่เครื่องหมายอื่นมันจะเปิดหน้าต่างข้อมูลซึ่งแทนที่หน้าต่างข้อมูลที่เปิดไว้ก่อนหน้านี้แทนที่จะเปิดหน้าต่างข้อมูลเพิ่มเติมอย่างต่อเนื่องทุกครั้งที่ฉันคลิกที่เครื่องหมายอื่น
raily

มันได้ผล! แต่ใครช่วยอธิบายให้ฉันฟังหน่อยได้ไหมว่าทำไมมันถึงทำงานแบบนี้
Lakshay

1
คุณสามารถอ่านเกี่ยวกับปัญหาที่คล้ายกันได้ที่นี่
Engineer

1
ในกรณีนี้เราควรปิดหน้าต่างข้อมูลอย่างไรเมื่อคุณคลิกนอกแผนที่
Rohit Tigga

จะปิด infowindow ได้อย่างไร? infowindow.close()ไม่ทำงาน.
mokiSRB

10

นี่คือข้อมูลโค้ดที่ใช้งานได้อย่างแน่นอน คุณสามารถเยี่ยมชมลิงค์ด้านล่างสำหรับการทำงาน jsFiddle และคำอธิบายโดยละเอียด วิธีค้นหาที่อยู่หลายแห่งบนแผนที่ Google ด้วยการซูมที่สมบูรณ์แบบ

var infowindow = new google.maps.InfoWindow();  
google.maps.event.addListener(marker, 'mouseover', (function(marker) {  
           return function() {  
               var content = address;  
               infowindow.setContent(content);  
               infowindow.open(map, marker);  
           }  
         })(marker));  

6

ลิงค์ที่มา

ลิงค์สาธิต

รหัสต่อไปนี้จะแสดงเครื่องหมายหลายด้วย InfoWindow คุณสามารถ Uncomment code เพื่อแสดงข้อมูลบนHover ได้เช่นกัน

ป้อนคำอธิบายภาพที่นี่

            var map;
            var InforObj = [];
            var centerCords = {
                lat: -25.344,
                lng: 131.036
            };
            var markersOnMap = [{
                    placeName: "Australia (Uluru)",
                    LatLng: [{
                        lat: -25.344,
                        lng: 131.036
                    }]
                },
                {
                    placeName: "Australia (Melbourne)",
                    LatLng: [{
                        lat: -37.852086,
                        lng: 504.985963
                    }]
                },
                {
                    placeName: "Australia (Canberra)",
                    LatLng: [{
                        lat: -35.299085,
                        lng: 509.109615
                    }]
                },
                {
                    placeName: "Australia (Gold Coast)",
                    LatLng: [{
                        lat: -28.013044,
                        lng: 513.425586
                    }]
                },
                {
                    placeName: "Australia (Perth)",
                    LatLng: [{
                        lat: -31.951994,
                        lng: 475.858081
                    }]
                }
            ];

            window.onload = function () {
                initMap();
            };

            function addMarkerInfo() {
                for (var i = 0; i < markersOnMap.length; i++) {
                    var contentString = '<div id="content"><h1>' + markersOnMap[i].placeName +
                        '</h1><p>Lorem ipsum dolor sit amet, vix mutat posse suscipit id, vel ea tantas omittam detraxit.</p></div>';

                    const marker = new google.maps.Marker({
                        position: markersOnMap[i].LatLng[0],
                        map: map
                    });

                    const infowindow = new google.maps.InfoWindow({
                        content: contentString,
                        maxWidth: 200
                    });

                    marker.addListener('click', function () {
                        closeOtherInfo();
                        infowindow.open(marker.get('map'), marker);
                        InforObj[0] = infowindow;
                    });
                    // marker.addListener('mouseover', function () {
                    //     closeOtherInfo();
                    //     infowindow.open(marker.get('map'), marker);
                    //     InforObj[0] = infowindow;
                    // });
                    // marker.addListener('mouseout', function () {
                    //     closeOtherInfo();
                    //     infowindow.close();
                    //     InforObj[0] = infowindow;
                    // });
                }
            }

            function closeOtherInfo() {
                if (InforObj.length > 0) {
                    InforObj[0].set("marker", null);
                    InforObj[0].close();
                    InforObj.length = 0;
                }
            }

            function initMap() {
                map = new google.maps.Map(document.getElementById('map'), {
                    zoom: 4,
                    center: centerCords
                });
                addMarkerInfo();
            }

ข้อกำหนดสำหรับโซลูชันนี้คือการใช้ const สำหรับ infowindow และ marker มิฉะนั้นจะใช้ไม่ได้ ..
Jim Jimson

2

หากคุณต้องการเชื่อมโยงการปิดหน้าต่างเข้ากับเหตุการณ์บางอย่างให้ลองทำเช่นนี้

google.maps.event.addListener(marker,'click', (function(marker,content,infowindow){ 
    return function() {
        infowindow.setContent(content);
        infowindow.open(map,marker);
        windows.push(infowindow)
        google.maps.event.addListener(map,'click', function(){ 
            infowindow.close();
        }); 
    };
})(marker,content,infowindow)); 

0
function setMarkers(map,locations){

for (var i = 0; i < locations.length; i++)
 {  

 var loan = locations[i][0];
 var lat = locations[i][1];
 var long = locations[i][2];
 var add =  locations[i][3];

 latlngset = new google.maps.LatLng(lat, long);

 var marker = new google.maps.Marker({  
          map: map, title: loan , position: latlngset  
 });
 map.setCenter(marker.getPosition());


 marker.content = "<h3>Loan Number: " + loan +  '</h3>' + "Address: " + add;


 google.maps.events.addListener(marker,'click', function(map,marker){
          map.infowindow.setContent(marker.content);
          map.infowindow.open(map,marker);

 });

 }
}

จากนั้นย้ายvar infowindow = new google.maps.InfoWindow()ไปที่initialize()ฟังก์ชัน:

function initialize() {

    var myOptions = {
      center: new google.maps.LatLng(33.890542, 151.274856),
      zoom: 8,
      mapTypeId: google.maps.MapTypeId.ROADMAP

    };
    var map = new google.maps.Map(document.getElementById("default"),
        myOptions);
    map.infowindow = new google.maps.InfoWindow();

    setMarkers(map,locations)

  }

1
google.maps.events.AddListenerควรจะเป็นgoogle.maps.event.addListener
Patrick Yan

ฉันได้รับTypeError: map.infowindow is undefinedถ้าฉันรวมvar infowindow = new google.maps.InfoWindow();ไว้ในฟังก์ชัน initialize () ของฉัน
Invot
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.