2009-12-09 13 views
81

में केवल एक InfoWindow खुला है, मुझे अपने Google मानचित्र पर केवल एक InfoWindow खोलने की आवश्यकता है। एक नया खोलने से पहले मुझे अन्य सभी इन्फोविंडोज़ बंद करने की ज़रूरत है।Google मानचित्र API v3

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

+0

तुम क्या करने की कोशिश की थी? – IgniteCoders

उत्तर

143

आप सिर्फ एक InfoWindow वस्तु बनाने यह के लिए एक संदर्भ रखने के लिए, और पुन: उपयोग करने की जरूरत है सभी मार्करों के लिए है। :

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

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

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

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

+0

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

+0

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

-3

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

+2

जो सही नहीं है, मैं अपने मानचित्र पर जितना 20 इन्फॉन्डोज़ खोल सकता हूं। यह v3 btw है। – leo

+0

ठीक है, सुधार करने के लिए धन्यवाद। मुझे नहीं पता था कि यह संस्करण 3 में बदल गया था। –

0

आप अपना पिछला InfoWindow वस्तु का ट्रैक रखने और उस पर पास विधि कॉल जब आप एक नया मार्कर पर क्लिक करें घटना को संभालने के लिए की जरूरत है।

N.B यह करीब साझा जानकारी विंडो वस्तु पर कॉल करने के लिए एक अलग मार्कर के साथ खुला बुला स्वचालित रूप से मूल बंद हो जाएगा आवश्यक नहीं है। विवरण के लिए Daniel's answer देखें।

+0

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

+0

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

+0

धन्यवाद @Cannonade :) –

26

अपने इन्फॉविंडो को दायरे से बाहर बनाएं ताकि आप इसे साझा कर सकें।

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

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); 
    }); 
} 
+0

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

+0

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

+0

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

11

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

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

जिस तरह से आप सामग्री को पार करते हैं स्ट्रिंग मेरे लिए उपयोगी था, thx। – ownking

+0

आपने मुझे एक समस्या हल की महोदय! हंगरी पावर! ;) – martincpt

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

3

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

var infowindow = new google.maps.InfoWindow({}); 
तो listner अंदर

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

infowindow.open(map, this); 
+1

मेरे लिए बहुत अच्छा काम करता है :) – lumos

3

एक globar 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); 
}); 
-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); 
0

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

  1. सभी infoWindows

    var infoWindows = []; 
    
  2. स्टोर सरणी में प्रत्येक नए infoWindow, बस के बाद infoWindow = नए स्टोर करने के लिए एक वैश्विक सरणी बनाएँ: तो, अपने कोड रखने, तो आप सिर्फ करने की जरूरत है ...

    infoWindows.push(infoWindow); 
    
  3. closeAllInfoWindows समारोह बनाएं

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

सादर,