Google Maps: ปิดอัตโนมัติเปิด InfoWindows?


108

ในไซต์ของฉันฉันใช้ Google Maps API v3 เพื่อวางเครื่องหมายบ้านบนแผนที่

InfoWindows ยังคงเปิดอยู่จนกว่าคุณจะคลิกไอคอนปิดอย่างชัดเจน หมายความว่าคุณสามารถเปิด 2+ InfoWindows พร้อมกันได้หากคุณวางเมาส์เหนือเครื่องหมายบนแผนที่

คำถาม : ฉันจะทำอย่างไรเพื่อให้เฉพาะ InfoWindow ที่ใช้งานอยู่ในปัจจุบันเปิดอยู่และ InfoWindows อื่น ๆ ทั้งหมดถูกปิด ความหมายจะเปิด InfoWindow ไม่เกิน 1 ครั้ง?


1
สำหรับฉันมันจะดีกว่าที่จะสร้างหน้าต่างข้อมูลเพียงช่องเดียวและอัปเดต (เป็นเนื้อหาและอื่น ๆ ) เปิดและปิดและทุกอย่าง แต่ฉันค่อนข้างแน่ใจว่าแนวทางนี้ใช้ไม่ได้เสมอไป
andrii

คำตอบ:


154

มีฟังก์ชันclose ()สำหรับ InfoWindows เพียงติดตามหน้าต่างที่เปิดล่าสุดและเรียกใช้ฟังก์ชันปิดเมื่อหน้าต่างใหม่ถูกสร้างขึ้น

การสาธิตนี้มีฟังก์ชันที่คุณกำลังมองหา ผมพบว่ามันอยู่ในแกลเลอรี่ Maps API V3 สาธิต


4
เพิ่มคะแนนสำหรับข้อเสนอแนะในการติดตามหน้าต่างที่เปิดล่าสุดเท่านั้น ดูเหมือนจะเป็นเรื่องง่ายๆ แต่ผู้คนกลับลืมสิ่งเหล่านั้นไป ...
Rémi Breton

1
ฉันเพิ่งใช้เทคนิคเดียวกัน ขอบคุณคริส มันจำเป็นสำหรับฉันเพราะฉันใช้อาร์เรย์ของวัตถุ InfoWindow แทนที่จะเป็นเพียงอันเดียวที่วนรอบและคว้าข้อมูลที่เกี่ยวข้อง InfoWindow แต่ละตัวมีข้อมูลการอัปเดตแยกต่างหากดังนั้นฉันจึงพบว่าเทคนิคนี้มีประโยชน์มาก
InterfaceGuy

2
ลิงก์ "การสาธิตนี้" เสีย
Brendan Whiting

ขอบคุณมาก! ใช้แนวทางนี้และได้ผลเหมือนมีเสน่ห์ คุณแก้ไขวันของฉัน โหวตแล้ว
Alan Espinet

64

ทางเลือกอื่นสำหรับสิ่งนี้ด้วยการใช้ infowindows จำนวนมาก: บันทึกหน้าต่าง infowindow ที่เปิดไว้ก่อนหน้าในตัวแปรแล้วปิดเมื่อเปิดหน้าต่างใหม่

var prev_infowindow =false; 
...
base.attachInfo = function(marker, i){
    var infowindow = new google.maps.InfoWindow({
        content: 'yourmarkerinfocontent'
    });

    google.maps.event.addListener(marker, 'click', function(){
        if( prev_infowindow ) {
           prev_infowindow.close();
        }

        prev_infowindow = infowindow;
        infowindow.open(base.map, marker);
    });
}

3
ชอบอันนี้. เข้าใจง่ายและนำไปใช้ได้
Aamir Afridi

6
ยกโทษให้กับความไร้เดียงสาของฉัน แต่ WTF เป็นพื้นฐาน?
พูด

ฉันไม่เข้าใจว่าทำไมมันถึงไม่ใช่พฤติกรรมเริ่มต้นใน Google maps V3 ...
Mr Washington

ทางออกที่ดีที่สุดและง่ายที่สุดที่ฉันเคยพบมา ขอบคุณ!
Irteza Asad

27
//assuming you have a map called 'map'
var infowindow = new google.maps.InfoWindow();

var latlng1 = new google.maps.LatLng(0,0);
var marker1 = new google.maps.Marker({position:latlng1, map:map});
google.maps.event.addListener(marker1, 'click',
    function(){
        infowindow.close();//hide the infowindow
        infowindow.setContent('Marker #1');//update the content for this marker
        infowindow.open(map, marker1);//"move" the info window to the clicked marker and open it
    }
);
var latlng2 = new google.maps.LatLng(10,10);
var marker2 = new google.maps.Marker({position:latlng2, map:map});
google.maps.event.addListener(marker2, 'click',
    function(){
        infowindow.close();//hide the infowindow
        infowindow.setContent('Marker #2');//update the content for this marker
        infowindow.open(map, marker2);//"move" the info window to the clicked marker and open it
    }
);

การดำเนินการนี้จะ "ย้าย" หน้าต่างข้อมูลไปยังเครื่องหมายที่คลิกแต่ละรายการโดยจะปิดตัวเองจากนั้นเปิดใหม่ (และแพนเพื่อให้พอดีกับวิวพอร์ต) ในตำแหน่งใหม่ เปลี่ยนเนื้อหาก่อนเปิดเพื่อให้ได้เอฟเฟกต์ที่ต้องการ ใช้งานได้กับเครื่องหมาย n


1
หมายเหตุด่วน: การเรียกซ้ำไปยัง infowindow.open () เพียงพอแล้ว ไม่จำเป็นต้องปิดหน้าต่างก่อน
Eric Nguyen

3
@Eric ในขณะที่คุณแก้ไขในทางเทคนิคฉันสังเกตเห็นข้อผิดพลาดที่บางครั้งทำให้หน้าต่างข้อมูลปรากฏในตำแหน่งสุดท้าย การบังคับปิดการพ่ายแพ้ครั้งแรกกล่าวว่าข้อบกพร่อง
Joel Mellon

22

ทางออกของฉัน

var map;
var infowindow = new google.maps.InfoWindow();
...
function createMarker(...) {
var marker = new google.maps.Marker({
     ...,
     descrip: infowindowHtmlContent  
});
google.maps.event.addListener(marker, 'click', function() {
    infowindow.setOptions({
        content: this.descrip,
        maxWidth:300
    });
    infowindow.open(map, marker);
});

3
มันสวยงามมาก - ใช้เพียงหน้าต่างเดียวและเปลี่ยนเนื้อหาเพื่อหลีกเลี่ยงการติดตาม / ปิดก่อนหน้านี้
Nick F

โซลูชันนี้มีความสวยงามและใช้งานได้เหมือนมีเสน่ห์ +1
Sebastian Breit

9

จากลิงค์นี้http://www.svennerberg.com/2009/09/google-maps-api-3-infowindows/ :

Teo: วิธีที่ง่ายที่สุดคือมีอินสแตนซ์ของวัตถุ InfoWindow ที่คุณนำมาใช้ซ้ำแล้วซ้ำอีก ด้วยวิธีนี้เมื่อคุณคลิกเครื่องหมายใหม่ infoWindow จะถูก "ย้าย" จากตำแหน่งที่อยู่ในขณะนี้เพื่อชี้ไปที่เครื่องหมายใหม่

ใช้เมธอด setContent เพื่อโหลดเนื้อหาที่ถูกต้อง


ฉันไม่เชื่อว่าจะมีผลบังคับใช้เนื่องจากฉันใช้ Google Maps v3 API
Ted

นอกจากนี้บทความที่คุณเชื่อมโยงก็ไม่ได้สาธิตมากกว่า 1 เครื่องหมาย
Ted

ฉันใช้หน้าต่างช่องเดียวในรูปแบบเดียวกันสำหรับหลาย ๆ ไซต์ คลิกหนึ่งรายการที่เปิดอยู่จะปิดโดยอัตโนมัติ
Keith Adler

4
คุณเชื่อมโยงหลายเครื่องหมายกับ InfoWindow เดียวได้อย่างไร?
Ted

7

ประกาศตัวแปรสำหรับหน้าต่างที่ใช้งานอยู่

var activeInfoWindow; 

และผูกรหัสนี้ในตัวฟังเครื่องหมาย

 marker.addListener('click', function () {
    if (activeInfoWindow) { activeInfoWindow.close();}
    infowindow.open(map, marker);
    activeInfoWindow = infowindow;
});

ขอบคุณมันใช้งานได้จริงเมื่อคลิกที่ใดก็ได้บนแผนที่
Varinder Singh Baidwan

ขอขอบคุณจากคำแนะนำทั้งหมดสิ่งนี้ได้ผลดีที่สุดสำหรับฉันและเป็น AF ที่สะอาด
Matthew Ellis

4

มีวิธีที่ง่ายกว่านอกจากการใช้ฟังก์ชัน close () ถ้าคุณสร้างตัวแปรด้วยคุณสมบัติ InfoWindow มันจะปิดโดยอัตโนมัติเมื่อคุณเปิดตัวแปรอื่น

var info_window;
var map;
var chicago = new google.maps.LatLng(33.84659, -84.35686);

function initialize() {
    var mapOptions = {
        center: chicago,
        zoom: 14,
        mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

    info_window = new google.maps.InfoWindow({
        content: 'loading'
    )};

createLocationOnMap('Location Name 1', new google.maps.LatLng(33.84659, -84.35686), '<p><strong>Location Name 1</strong><br/>Address 1</p>');
createLocationOnMap('Location Name 2', new google.maps.LatLng(33.84625, -84.36212), '<p><strong>Location Name 1</strong><br/>Address 2</p>');

}

function createLocationOnMap(titulo, posicao, conteudo) {            
    var m = new google.maps.Marker({
        map: map,
        animation: google.maps.Animation.DROP,
        title: titulo,
        position: posicao,
        html: conteudo
    });            

    google.maps.event.addListener(m, 'click', function () {                
        info_window.setContent(this.html);
        info_window.open(map, this);
    });
}

1
var map;
var infowindow;
...
function createMarker(...) {
    var marker = new google.maps.Marker({...});
    google.maps.event.addListener(marker, 'click', function() {
        ...
        if (infowindow) {
            infowindow.close();
        };
        infowindow = new google.maps.InfoWindow({
            content: contentString,
            maxWidth: 300
        });
        infowindow.open(map, marker);
    }
...
function initialize() {
    ...
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    ...
    google.maps.event.addListener(map, 'click', function(event) {
        if (infowindow) {
            infowindow.close();
        };
        ...
    }
}

Thanx ฉันต้องปิดหน้าต่างข้อมูลเมื่อไม่ได้คลิกที่เครื่องหมายดังนั้นบนแผนที่
VRC

1

เกี่ยวกับ -

google.maps.event.addListener(yourMarker, 'mouseover', function () {
        yourInfoWindow.open(yourMap, yourMarker);

    });

google.maps.event.addListener(yourMarker, 'mouseout', function () {
        yourInfoWindow.open(yourMap, yourMarker);

    });

จากนั้นคุณสามารถวางเมาส์เหนือมันแล้วมันจะปิดเอง


นี่เป็นวิธีแก้ปัญหาที่น่าสนใจ แต่ไม่ตอบคำถามและใช้ไม่ได้กับอุปกรณ์ระบบสัมผัสเท่านั้น
ลี

1

ฉันเก็บตัวแปรไว้ที่ด้านบนเพื่อติดตามว่าหน้าต่างข้อมูลใดเปิดอยู่ดูด้านล่าง

var currentInfoWin = null;
google.maps.event.addListener(markers[counter], 'click', function() {      
    if (currentInfoWin !== null) {
        currentInfoWin.close(map, this); 
    }
    this.infoWin.open(map, this); 
    currentInfoWin = this.infoWin;  
}); 

[ตัวนับ] กำลังทำอะไรที่นี่?
ลี

0

นี่คือสิ่งที่ฉันใช้หากคุณใช้เครื่องหมายหลายตัวในการวนซ้ำ (Django ที่นี่) คุณสามารถกำหนดดัชนีสำหรับเครื่องหมายแต่ละตัวและตั้งค่าดัชนีนั้นทุกครั้งที่คุณเปิดหน้าต่าง การปิดดัชนีที่บันทึกไว้ก่อนหน้านี้:

markers = Array();
infoWindows = Array();
var prev_infowindow =false;
{% for obj in objects %}
var contentString = 'your content'
var infowindow = new google.maps.InfoWindow({
            content: contentString,
          });
var marker = new google.maps.Marker({
               position: {lat: {{ obj.lat }}, lng: {{ obj.lon }}},
               map: map,
               title: '{{ obj.name }}',
               infoWindowIndex : {{ forloop.counter0 }}
          });
google.maps.event.addListener(marker, 'click',
            function(event)
            {
           if( prev_infowindow ) {
               infoWindows[prev_infowindow].close();
                }
                prev_infowindow = this.infoWindowIndex;
                infoWindows[this.infoWindowIndex].open(map, this);
            }
        );

        infoWindows.push(infowindow);
        markers.push(marker);

      {% endfor %}

-1
var contentString = "Location: " + results[1].formatted_address;    
google.maps.event.addListener(marker,'click', (function(){ 
    infowindow.close();
    infowindow = new google.maps.InfoWindow({
        content: contentString
    });
    infowindow.open(map, marker);
}));
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.