2010-03-01 9 views
12

विफल रहा है मेरी परियोजना एक निर्दिष्ट अक्षांश और देशांतर सीमा के भीतर भूकंप के बारे में जानकारी प्राप्त करने के लिए एक JSON फ़ीड का उपयोग करती है, अनिवार्य रूप से एक बॉक्स बना रही है। मैं यह जानकारी लेता हूं और सभी परिणामों को Google मानचित्र पर मार्कर में बदल देता हूं। मुझे प्रत्येक मार्कर को कुछ अतिरिक्त जानकारी भी प्रदर्शित करने की आवश्यकता है, इसलिए मैं अंतर्निहित इन्फोविंडो ऑब्जेक्ट्स का उपयोग करने की कोशिश कर रहा हूं जैसे कि जब आप मार्कर पर क्लिक करते हैं तो आप उस मार्कर से जुड़े कुछ जानकारी के साथ टूलटिप खोलते हैं। हालांकि मुझे लगता है कि इससे कोई फर्क नहीं पड़ता कि मैं किस मार्कर पर क्लिक करता हूं, वही infowindow हमेशा उस समूह के उसी मार्कर से ऊपर आता है, और मेरा मानना ​​है कि यह हमेशा मेरे लूप में बनाया गया अंतिम infowindow है। कोड यहाँ है।Google मानचित्र पर एकाधिक मार्करों को एकाधिक InfoWindows को बाध्य करने की कोशिश कर रहा है और

$.getJSON(url, function(json) { 
        for(var i = 0; i < json.earthquakes.length; i++) 
        { 
         var pos = new google.maps.LatLng(json.earthquakes[i].lat, json.earthquakes[i].lng); 
         var info = json.earthquakes[i].lat + ", " + json.earthquakes[i].lng; 
         var marker = new google.maps.Marker({ 
          map: map, 
          position: pos, 
          title: json.earthquakes[i].eqid 
         }) 
         var tooltip = new google.maps.InfoWindow({ 
          content: info 
         }) 
         google.maps.event.addListener(marker, 'click', function() { 
          tooltip.open(map, marker); 
         }); 
         markers.push(marker); 
         tooltips.push(tooltip); 
        }    
       }); 

चिह्न नक्शे और टूलटिप्स पर सभी मार्कर वस्तुओं के लिए एक सरणी है infowindows वस्तुओं के भंडारण के लिए एक और सरणी है। वे वैश्विक हैं।

+0

यह कैसे बंद काम (मार्कर बंद के संदर्भ द्वारा पारित कर दिया है, क्या आप चाहते हैं कि एक प्रति है) के कारण है। लेकिन जब श्रोता को बुलाया जाता है, तो यह 'इस' के साथ ऑब्जेक्ट (मार्कर) का जिक्र करेगा जिसमें श्रोता जोड़ा गया था, ताकि आप 'मार्कर' के बजाय 'this' का उपयोग कर सकें। – herman

उत्तर

20

यह google-maps टैग में एक बहुत ही आम प्रश्न है और बनाने के लिए एक आसान गलती है :)।

क्या हो रहा है यह है कि आपके क्लिक ईवेंट को असीमित रूप से कहा जा रहा है और यह getJSON कॉलबैक (सूची में अंतिम एक) में मार्कर चर में वर्तमान मान उठा रहा है।

आप एक समारोह में अपने addListener कॉल रैप करने के लिए इतना है कि एक बंद मार्कर चर रहा है कि क्लिक कॉलबैक में इस्तेमाल किया जा रहा चारों ओर बनाई गई है की जरूरत है:

function listenMarker (marker) 
{ 
    // so marker is associated with the closure created for the listenMarker function call 
    google.maps.event.addListener(marker, 'click', function() { 
         tooltip.open(map, marker); 
        }); 
} 

फिर अपने मुख्य getJSON कॉलबैक से listenMarker फोन (जहां आप वर्तमान में addListener को बुला रहे हैं)।

+3

इस सरल और स्पष्ट समाधान के लिए धन्यवाद। Infowindow का उपयोग करके, आप अधिक सामग्री जोड़ने के लिए फ़ंक्शन में कुछ और पैरामीटर पास कर सकते हैं। – dwarbi

+0

-1: हालांकि यह काम करता है, यह आवश्यक नहीं है क्योंकि 'यह' उस ऑब्जेक्ट को संदर्भित करेगा जिसे श्रोता में जोड़ा गया है। – herman

2

ऐडलिस्टर कॉल को अपने स्वयं के फ़ंक्शन में रखने से भी एक ही टेक्स्ट प्रदर्शित करने वाले एकाधिक इन्फॉइंडो की समस्या हल हो जाती है।

4

आप भी ऐसा कर सकते हैं:

// so marker is associated with the closure created for the listenMarker function call 
google.maps.event.addListener(marker, 'click', function() { 
        tooltip.open(map, this); 
       }); 

कहाँ "मार्कर" से बदलें कि "इस" ऐड श्रोता कॉल में। इस प्रकार आप उसी बिंदु पर addListerner कोड डाल सकते हैं जिस पर आप मार्कर बनाते हैं, और एक नया फ़ंक्शन नहीं बनाना है।

http://you.arenot.me/2010/06/29/google-maps-api-v3-0-multiple-markers-multiple-infowindows/

पूर्ण समाधान और एक डेमो चेक आउट: डी

+0

बहुत बढ़िया! धन्यवाद! – DDelgro

संबंधित मुद्दे