Google मानचित्र API v3 में सिर्फ एक InfoWindow खोलें


85

मुझे अपने Google मानचित्र पर केवल एक InfoWindow खोलना होगा। नया खोलने से पहले मुझे अन्य सभी जानकारी बंद करनी होगी।

क्या कोई मुझे दिखा सकता है कि यह कैसे करना है?


आपने क्या प्रयास किया?
इग्नाइटेकोडर्स

जवाबों:


151

आपको केवल एक InfoWindowऑब्जेक्ट बनाने की ज़रूरत है , इसके लिए एक संदर्भ रखें, और सभी मार्करों के लिए पुन: उपयोग करें। Google मानचित्र API डॉक्स से उद्धरण :

यदि आप एक समय में केवल एक सूचना विंडो प्रदर्शित करना चाहते हैं (जैसा कि Google मानचित्र पर व्यवहार है), तो आपको केवल एक जानकारी विंडो बनाने की आवश्यकता है, जिसे आप मानचित्र घटनाओं (जैसे उपयोगकर्ता क्लिक) पर विभिन्न स्थानों या मार्करों को पुन: असाइन कर सकते हैं।

इसलिए, आप बस InfoWindowअपने नक्शे को इनिशियलाइज़ करने के बाद ही ऑब्जेक्ट बनाना चाहते हैं , और फिर clickअपने मार्करों के ईवेंट हैंडलर्स को निम्नानुसार संभाल सकते हैं। मान लीजिए कि आपके पास एक मार्कर है someMarker:

google.maps.event.addListener(someMarker, 'click', function() {
   infowindow.setContent('Hello World');
   infowindow.open(map, this);
});

तो फिर InfoWindowअपने आप कॉल करने के लिए बिना एक नया मार्कर पर क्लिक करें बंद हो जाना चाहिए close()विधि।


मैं यह भी करता हूं, लेकिन क्या यह सामान्य है कि अगले मार्कर पर खोलने के लिए infoWindow +1 सेकंड पसंद करता है? कभी-कभी यह बिल्कुल नहीं खुलता है। मैं ठीक उसी कोड का उपयोग करता हूं
MJB

डैनियल, महान विचार !! इससे पहले कि मैं मैन्युअल रूप से सिंक्रनाइज़ करने की कोशिश कर रहा था, लेकिन यह अजीब जावास्क्रिप्ट त्रुटियों को दिखाता है (जैसे "c null है main.js में, या ऐसा कुछ (रेंज 43 में से 123))।
विक्टर

30

अपने infowindow को दायरे से बाहर करें ताकि आप इसे साझा कर सकें।

ये रहा एक सरल उदाहरण:

var markers = [AnArrayOfMarkers];
var infowindow = new google.maps.InfoWindow();

for (var i = 0, marker; marker = markers[i]; i++) {
  google.maps.event.addListener(marker, 'click', function(e) {
    infowindow.setContent('Marker position: ' + this.getPosition());
    infowindow.open(map, this);
  });
}

धन्यवाद। "इस" के प्रयोग से मेरी अधिकांश समस्याओं का समाधान हो गया। मुझे अभी भी समझ में नहीं आया कि सेटकॉन्टेंट के अंदर कस्टम कंटेंट का उपयोग कैसे करें। जैसे मेरे मार्कर लूप में, मैं "i" वेरिएबल का उपयोग करके एक contentHtml वैरिएबल बनाता हूं और इसे डेटाबेस ऑब्जेक्ट से लिंक करता हूं। श्रोता के लिए मैं कैसे उस contentHtml चर को पास कर सकता हूँ?
रयान

मेरे मामले में खिड़की केवल तभी खुलती है जब मैं infowindow.open (", this) में" इस "का उपयोग करता हूं; इसके बजाय "मार्कर"। अपने समाधान को साझा करने के लिए Thx।
मालिक है

मैं भी ऐसा करता हूं, लेकिन क्या यह सामान्य है कि अगले मार्कर पर खोलने के लिए infoWindow +1 सेकंड पसंद करता है? कभी-कभी यह बिल्कुल नहीं खुलता है। मैं ठीक उसी कोड का उपयोग करता हूं
MJB

14

मेरे पास एक ही समस्या थी लेकिन सबसे अच्छा जवाब पूरी तरह से हल नहीं हुआ, मुझे अपने बयान के लिए क्या करना था यह मेरे वर्तमान मार्कर से संबंधित था। शायद इससे किसी को मदद मिले।

for(var i = 0; i < markers.length; i++){
    name = markers[i].getAttribute("name");
    address = markers[i].getAttribute("address");        
    point = new google.maps.LatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng")));                                     
    contentString = '<div style="font-family: Lucida Grande, Arial, sans-serif;>'+'<div><b>'+ name +'</b></div>'+'<div>'+ address +'</div>';                    
    marker = new google.maps.Marker({                       
        map: map,
        position: point,
        title: name+" "+address,
        buborek: contentString 
    });                                     
    google.maps.event.addListener(marker, 'click', function(){
        infowindow.setContent(this.buborek); 
        infowindow.open(map,this); 
    });                                                         
    marker.setMap(map);                 
}

2
जिस तरह से आप contentString पास करते हैं वह मेरे लिए उपयोगी था, thx।
मालिक है

4

एक बालक देर से, लेकिन मैं एक वैश्विक चरवाहे maken infowindow द्वारा केवल एक infowindow खोलने में कामयाब रहा।

var infowindow = new google.maps.InfoWindow({});

फिर सूची के अंदर

infowindow.close();
infowindow = new google.maps.InfoWindow({   
    content: '<h1>'+arrondissement+'</h1>'+ gemeentesFiltered                           
});

infowindow.open(map, this);

1
मेरे लिए बहुत अच्छा काम करता है :)
लुमोस

4

एक ग्लोब को डिक्लेयर करें var selectedInfoWindow;और खोली हुई जानकारी विंडो को होल्ड करने के लिए इसका उपयोग करें:

var infoWindow = new google.maps.InfoWindow({
    content: content
});

// Open the infowindow on marker click
google.maps.event.addListener(marker, "click", function() {
    //Check if there some info window selected and if is opened then close it
    if (selectedInfoWindow != null && selectedInfoWindow.getMap() != null) {
        selectedInfoWindow.close();
        //If the clicked window is the selected window, deselect it and return
        if (selectedInfoWindow == infoWindow) {
            selectedInfoWindow = null;
            return;
        }
    }
    //If arrive here, that mean you should open the new info window 
    //because is different from the selected
    selectedInfoWindow = infoWindow;
    selectedInfoWindow.open(map, marker);
});

0

जब आप किसी नए मार्कर पर क्लिक ईवेंट को हैंडल करते हैं, तो आपको अपने पिछले InfoWindow ऑब्जेक्ट का ट्रैक रखने और उस पर करीबी विधि को कॉल करने की आवश्यकता होती है

एनबी यह साझा जानकारी विंडो ऑब्जेक्ट पर बंद कॉल करने के लिए आवश्यक नहीं है, एक अलग मार्कर के साथ खुला कॉलिंग स्वचालित रूप से मूल बंद कर देगा। देखें डैनियल जवाब जानकारी के लिए।


मुझे पता है कि यह एक पुराना उत्तर है, और v3 एपीआई उस समय अस्पष्ट था ... लेकिन वास्तव में close()विधि को कॉल करने की कोई आवश्यकता नहीं है , अगर किसी एकल InfoWindowऑब्जेक्ट का उपयोग किया जाता है। यह स्वचालित रूप से बंद हो जाएगा यदि open()विधि को उसी वस्तु पर फिर से कहा जाता है।
डैनियल वेसलो

@ daniel-vassallo नोट के लिए धन्यवाद :) मैंने आपके उत्तर को अपने अनुसार बदल दिया है, यह मेरे विचार से सबसे उपयोगी है।
RedBlueThing

0

मूल रूप से आप एक फ़ंक्शन चाहते हैं जो एक new InfoBox()=> संदर्भ को रखता है जो ऑनक्लिक ईवेंट को दर्शाता है। अपने मार्कर बनाते समय (एक लूप में) उपयोग करेंbindInfoBox(xhr, map, marker);

// @param(project): xhr : data for infoBox template
// @param(map): object : google.maps.map
// @param(marker): object : google.maps.marker
bindInfoBox: (function () {
    var options = $.extend({}, cfg.infoBoxOptions, { pixelOffset: new google.maps.Size(-450, -30) }),
        infoBox = new window.InfoBox(options);

    return function (project, map, marker) {
        var tpl = renderTemplate(project, cfg.infoBoxTpl); // similar to Mustache, Handlebars

        google.maps.event.addListener(marker, 'click', function () {
            infoBox.setContent(tpl);
            infoBox.open(map, marker);
        });
    };
}())

var infoBoxएसिंक्रोनस रूप से असाइन किया गया है और स्मृति में रखा गया है। हर बार जब आप bindInfoBox()रिटर्न फ़ंक्शन को कॉल करते हैं, तो इसके बजाय कॉल किया जाएगा। पास करने के लिए भी आसान हैinfoBoxOptionsकेवल एक बार !

मेरे उदाहरण में मुझे एक अतिरिक्त पैराम को जोड़ना है mapक्योंकि टैब ईवेंट द्वारा मेरे प्रारंभ में देरी हो रही है।

InfoBoxOptions


0

यहां एक समाधान है जिसे पुन: उपयोग करने के लिए केवल एक जानकारी बनाने की आवश्यकता नहीं है। आप कई जानकारी बना सकते हैं। विंडोज, केवल एक चीज जिसकी आपको जरूरत है, वह है एक क्लोज़एन्फोइन्फो विंडोज फ़ंक्शन का निर्माण, और एक नया इन्फॉइंडो खोलने से पहले इसे कॉल करें। इसलिए, अपना कोड रखते हुए, आपको बस निम्नलिखित की आवश्यकता है:

  1. सभी जानकारी को संग्रहीत करने के लिए एक वैश्विक सरणी बनाएँ

    var infoWindows = [];
    
  2. सरणी में प्रत्येक नई जानकारी को संग्रहीत करें, बस जानकारी के बाद = नया ...

    infoWindows.push(infoWindow);
    
  3. CloseAllInfoWindows फ़ंक्शन बनाएँ

    function closeAllInfoWindows() {
        for (var i=0;i<infoWindows.length;i++) {
            infoWindows[i].close();
        }
    }
    
  4. अपने कोड में, infoWindow खोलने से ठीक पहले closeAllInfoWindows () पर कॉल करें।

सादर,


-1

इस तरह हल किया:

function window(content){
    google.maps.event.addListener(marker,'click', (function(){
        infowindow.close();
        infowindow = new google.maps.InfoWindow({
            content: content
        });
        infowindow.open(map, this);
    }))
}
window(contentHtml);

-4

Google मानचित्र आपको केवल एक जानकारी विंडो खोलने की अनुमति देता है। इसलिए यदि आप एक नई विंडो खोलते हैं, तो दूसरा अपने आप बंद हो जाता है।


2
यह सही नहीं है, मैं अपने मानचित्र पर 20 से अधिक infowindows खोल सकता हूं। यह v3 btw है।
leo

ठीक है, सही करने के लिए धन्यवाद। मुझे नहीं पता था कि यह संस्करण 3 में बदल गया है।
किमो पुपुत्ती
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.