मुझे अपने Google मानचित्र पर केवल एक InfoWindow खोलना होगा। नया खोलने से पहले मुझे अन्य सभी जानकारी बंद करनी होगी।
क्या कोई मुझे दिखा सकता है कि यह कैसे करना है?
जवाबों:
आपको केवल एक 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 को दायरे से बाहर करें ताकि आप इसे साझा कर सकें।
ये रहा एक सरल उदाहरण:
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);
});
}
मेरे पास एक ही समस्या थी लेकिन सबसे अच्छा जवाब पूरी तरह से हल नहीं हुआ, मुझे अपने बयान के लिए क्या करना था यह मेरे वर्तमान मार्कर से संबंधित था। शायद इससे किसी को मदद मिले।
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);
}
एक बालक देर से, लेकिन मैं एक वैश्विक चरवाहे 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);
एक ग्लोब को डिक्लेयर करें 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);
});
जब आप किसी नए मार्कर पर क्लिक ईवेंट को हैंडल करते हैं, तो आपको अपने पिछले InfoWindow ऑब्जेक्ट का ट्रैक रखने और उस पर करीबी विधि को कॉल करने की आवश्यकता होती है ।
एनबी यह साझा जानकारी विंडो ऑब्जेक्ट पर बंद कॉल करने के लिए आवश्यक नहीं है, एक अलग मार्कर के साथ खुला कॉलिंग स्वचालित रूप से मूल बंद कर देगा। देखें डैनियल जवाब जानकारी के लिए।
close()
विधि को कॉल करने की कोई आवश्यकता नहीं है , अगर किसी एकल InfoWindow
ऑब्जेक्ट का उपयोग किया जाता है। यह स्वचालित रूप से बंद हो जाएगा यदि open()
विधि को उसी वस्तु पर फिर से कहा जाता है।
मूल रूप से आप एक फ़ंक्शन चाहते हैं जो एक 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
क्योंकि टैब ईवेंट द्वारा मेरे प्रारंभ में देरी हो रही है।
यहां एक समाधान है जिसे पुन: उपयोग करने के लिए केवल एक जानकारी बनाने की आवश्यकता नहीं है। आप कई जानकारी बना सकते हैं। विंडोज, केवल एक चीज जिसकी आपको जरूरत है, वह है एक क्लोज़एन्फोइन्फो विंडोज फ़ंक्शन का निर्माण, और एक नया इन्फॉइंडो खोलने से पहले इसे कॉल करें। इसलिए, अपना कोड रखते हुए, आपको बस निम्नलिखित की आवश्यकता है:
सभी जानकारी को संग्रहीत करने के लिए एक वैश्विक सरणी बनाएँ
var infoWindows = [];
सरणी में प्रत्येक नई जानकारी को संग्रहीत करें, बस जानकारी के बाद = नया ...
infoWindows.push(infoWindow);
CloseAllInfoWindows फ़ंक्शन बनाएँ
function closeAllInfoWindows() {
for (var i=0;i<infoWindows.length;i++) {
infoWindows[i].close();
}
}
अपने कोड में, infoWindow खोलने से ठीक पहले closeAllInfoWindows () पर कॉल करें।
सादर,
इस तरह हल किया:
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);
Google मानचित्र आपको केवल एक जानकारी विंडो खोलने की अनुमति देता है। इसलिए यदि आप एक नई विंडो खोलते हैं, तो दूसरा अपने आप बंद हो जाता है।