2010-07-01 21 views
44

नोट करने के लिए एक InfoWindow जोड़ने: मैं गूगल मैप्स एपीआईगूगल मैप्स एपीआई v3 प्रत्येक मार्कर

मैं प्रत्येक मार्कर मैं नक्शे पर डाल करने के लिए एक जानकारी विंडो को जोड़ने के लिए कोशिश कर रहा हूँ की v3 का उपयोग कर रहा हूँ। वर्तमान में मैं निम्नलिखित कोड के साथ इस कर रहा हूँ: जब मैं एक मार्कर यह सिर्फ जानकारी विंडो के लिए पिछले मार्कर जोड़ा प्रदर्शित करता है पर क्लिक करें

for (var i in tracks[racer_id].data.points) { 
    values = tracks[racer_id].data.points[i];     
    point = new google.maps.LatLng(values.lat, values.lng); 
    if (values.qst) { 
     var marker = new google.maps.Marker({map: map, position: point, clickable: true}); 
     tracks[racer_id].markers[i] = marker; 
     var info = new google.maps.InfoWindow({ 
      content: '<b>Speed:</b> ' + values.inst + ' knots' 
     }); 
     tracks[racer_id].info[i] = info; 
     google.maps.event.addListener(marker, 'click', function() { 
      info.open(map, marker); 
     }); 
    } 
    track_coordinates.push(point); 
    bd.extend(point); 
} 

समस्या है। यह भी स्पष्ट करने के लिए कि आखिरी मार्कर के बगल में जानकारी विंडो दिखाई देती है, मार्कर पर क्लिक नहीं किया गया है। मुझे लगता है कि मेरी समस्या addListener भाग में है लेकिन पोस्टिव नहीं है। कोई विचार?

उत्तर

78

आप for in पाश में a very common closure problem कर रहे हैं:

चर समय addListener से click कॉलबैक कहा जाता है के द्वारा एक ही एकल वातावरण को बंद करने की हिस्सेदारी में संलग्न है, तो, पाश अपने पाठ्यक्रम और चलाने होगा info वैरिएबल अंतिम ऑब्जेक्ट पर इंगित किया जाएगा, जो अंतिम InfoWindow बनाया गया है।

इस मामले में, इस समस्या को हल करने के लिए होगा एक आसान तरीका InfoWindow के साथ अपने Marker वस्तु बढ़ाने के लिए:

var marker = new google.maps.Marker({map: map, position: point, clickable: true}); 

marker.info = new google.maps.InfoWindow({ 
    content: '<b>Speed:</b> ' + values.inst + ' knots' 
}); 

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

यह काफी मुश्किल विषय हो सकता है, अगर आप कैसे बंद काम से परिचित नहीं हैं । आप एक संक्षिप्त परिचय के लिए निम्नलिखित मोज़िला लेख बाहर की जाँच कर सकते हैं:

यह भी ध्यान रखें, कि v3 API, नक्शे पर एक से अधिक की अनुमति देता है InfoWindow रों। यदि आप उस समय केवल InfoWindow दिखाई देने का इरादा रखते हैं, तो आपको इसके बजाय एक InfoWindow ऑब्जेक्ट का उपयोग करना चाहिए, और उसके बाद इसे खोलें और जब भी मार्कर क्लिक किया जाता है तो इसकी सामग्री बदलें (Source)।

+1

क्या आप इस कोड स्निपेट में प्लग करने की आवश्यकता के बारे में और बता सकते हैं? क्या यह लूप के लिए या लूप से पहले किया जाता है, मैं थोड़ा उलझन में हूं। – uday

+1

आपको लूप के लिए कोड स्निपेट _inside_ डालने की आवश्यकता है;) – Tilt

0

इस प्रयास करें:

for (var i in tracks[racer_id].data.points) { 
    values = tracks[racer_id].data.points[i];     
    point = new google.maps.LatLng(values.lat, values.lng); 
    if (values.qst) { 
     var marker = new google.maps.Marker({map: map, position: point, clickable: true}); 
     tracks[racer_id].markers[i] = marker; 
     var info = new google.maps.InfoWindow({ 
      content: '<b>Speed:</b> ' + values.inst + ' knots' 
     }); 
     tracks[racer_id].info[i] = info; 
     google.maps.event.addListener(tracks[racer_id].markers[i], 'click', function() { 
      tracks[racer_id].info[i].open(map, tracks[racer_id].markers[i]); 
     }); 
    } 
    track_coordinates.push(point); 
    bd.extend(point); 
} 
+0

Haha मैं पहले से ही है कि कोशिश की थी। बस इसे फिर से कोशिश की और दुर्भाग्य से यह अभी भी काम नहीं करता है। – blcArmadillo

+0

यहां समस्या 'i' चर है, जो अभी भी बंद होने में संलग्न है। जब 'क्लिक' कॉलबैक कहा जाता है, तो 'i' चर लूप के अंतिम आइटम पर इंगित किया जाएगा, और इसलिए' जानकारी [i] .open' अभी भी अंतिम 'InfoWindow' खोल देगा। –

0

मैं एक बहुत ही इसी तरह की समस्या थी लेकिन ActionScript 3 में: Stack Over Flow: Dynamic Google Maps API Info Window HTML Content Issue

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

मान लीजिए कि यह एक क्रियालेख विशिष्ट समस्या नहीं है तो जोचनजंग का समाधान काम नहीं करेगा। मैंने अपनी समस्या में पोस्ट किए गए समाधान को देखें और देखें कि क्या आप इसे यहां लागू कर सकते हैं। यह मैप एपीआई के साथ एक गंभीर मुद्दा प्रतीत होता है।

1

हे सब लोग। मुझे नहीं पता कि यह इष्टतम समाधान है, लेकिन मुझे लगा कि मैं इसे भविष्य में लोगों की मदद करने के लिए यहां पोस्ट करूंगा। अगर आप कुछ भी दिखाना चाहिए तो कृपया टिप्पणी करें।

छोरों के लिए मेरा अब है:

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

function add_marker(racer_id, point, note) { 
    var marker = new google.maps.Marker({map: map, position: point, clickable: true}); 
    marker.note = note; 
    google.maps.event.addListener(marker, 'click', function() { 
     info_window.content = marker.note; 
     info_window.open(map, marker); 
    }); 
    return marker; 
} 

आप info_window.close() किसी भी समय info_window बंद करने के लिए उपयोग कर सकते हैं: के रूप में

for (var i in tracks[racer_id].data.points) { 
    values = tracks[racer_id].data.points[i];     
    point = new google.maps.LatLng(values.lat, values.lng); 
    if (values.qst) { 
     tracks[racer_id].markers[i] = add_marker(racer_id, point, '<b>Speed:</b> ' + values.inst + ' knots<br /><b>Invalid:</b> <input type="button" value="Yes" /> <input type="button" value="No" />'); 
    } 
    track_coordinates.push(point); 
    bd.extend(point); 
} 

और add_marker परिभाषित किया गया है। उम्मीद है कि यह किसी की मदद करता है।

9

add_marker में अभी भी एक बंद करने का मुद्दा है, क्योंकि यह google.maps.event.addListener स्कोप के बाहर मार्कर चर का उपयोग करता है।

इससे बेहतर कार्यान्वयन होगा:

function add_marker(racer_id, point, note) { 
    var marker = new google.maps.Marker({map: map, position: point, clickable: true}); 
    marker.note = note; 
    google.maps.event.addListener(marker, 'click', function() { 
     info_window.content = this.note; 
     info_window.open(this.getMap(), this); 
    }); 
    return marker; 
} 

मैं भी मार्कर से नक्शा, इस तरह से आप गूगल मानचित्र वस्तु पारित करने के लिए की जरूरत नहीं है के लिए इस्तेमाल किया, तो आप शायद मानचित्र का उपयोग जहां मार्कर करना चाहते हैं वैसे भी संबंधित है।

+0

वाह! मैं इस पर दो घंटे से अधिक समय तक अटक गया था! पता नहीं था कि दायरे के बाहर मार्कर का उपयोग किया जाएगा! अनेक अनेक धन्यवाद! –

1

पृथ्वी प्लगइन एपीआई के लिए, अपने लूप के बाहर गुब्बारा बनाएं और प्रत्येक काउंटरमार्क के लिए अद्वितीय सामग्री प्राप्त करने के लिए फ़ंक्शन पर अपना काउंटर पास करें!

function createBalloon(placemark, i, event) { 
      var p = placemark; 
      var j = i; 
      google.earth.addEventListener(p, 'click', function (event) { 
        // prevent the default balloon from popping up 
        event.preventDefault(); 
        var balloon = ge.createHtmlStringBalloon(''); 
        balloon.setFeature(event.getTarget()); 

        balloon.setContentString('iframePath#' + j); 

        ge.setBalloon(balloon); 
      }); 
     } 
33

आप घटना में this उपयोग कर सकते हैं:

google.maps.event.addListener(marker, 'click', function() { 
    // this = marker 
    var marker_map = this.getMap(); 
    this.info.open(marker_map); 
    // this.info.open(marker_map, this); 
    // Note: If you call open() without passing a marker, the InfoWindow will use the position specified upon construction through the InfoWindowOptions object literal. 
}); 
+10

यह सही उत्तर होना चाहिए। @DanielVassallo उत्तर से संबंधित एक ही समस्या से पीड़ित है। –

+0

यह मेरे लिए भी काम करता था .. 'यह' कुंजी थी। –

+3

बहुत अच्छा काम करता है लेकिन मुझे 'this.info.open (marker_map, यह) करना था; ' – askilondz

0

एक ही रास्ता मैं अंत में काम करने के लिए इस मिल सकता है जावास्क्रिप्ट में एक सरणी बनाने के द्वारा किया गया था। सरणी तत्व विभिन्न जानकारी-विंडो का संदर्भ देते हैं (मानचित्र पर प्रत्येक मार्कर के लिए एक जानकारी-विंडो बनाई गई है)। प्रत्येक सरणी तत्व में इसके उपयुक्त मानचित्र मार्कर के लिए अद्वितीय पाठ होता है। मैंने सरणी तत्व के आधार पर प्रत्येक जानकारी-विंडो के लिए जावास्क्रिप्ट ईवेंट को परिभाषित किया। और जब ईवेंट आग लगती है, तो मैं प्रदर्शित करने के लिए उपयुक्त मान को संदर्भित करने के लिए सरणी तत्व का संदर्भ देने के लिए "यह" कीवर्ड का उपयोग करता हूं।

var map = new google.maps.Map(document.getElementById('map-div'), mapOptions); 
zipcircle = []; 
for (var zip in zipmap) { 
    var circleoptions = { 
     strokeOpacity: 0.8, 
     strokeWeight: 1, 
     fillOpacity: 0.35, 
     map: map, 
     center: zipmap[zip].center, 
     radius: 100 
    }; 
    zipcircle[zipmap[zip].zipkey] = new google.maps.Circle(circleoptions); 
    zipcircle[zipmap[zip].zipkey].infowindowtext = zipmap[zip].popuptext; 
    zipcircle[zipmap[zip].zipkey].infowindow = new google.maps.InfoWindow(); 
    google.maps.event.addListener(zipcircle[zipmap[zip].zipkey], 'click', function() { 
     this.infowindow.setContent(this.infowindowtext); 
     this.infowindow.open(map, this); 
    }); 
} 
4

उपयोग घटना को बंद ...

यह कैसे v3 में यह करने के लिए है: https://developers.google.com/maps/documentation/javascript/examples/event-closure

+1

एक लिंक को अग्रेषित करने के बजाय एक उदाहरण शामिल करना बेहतर है। यदि यह लिंक गायब हो जाता है, तो आपका उदाहरण अभी भी मदद करेगा और आप एक बहुत पुराने प्रश्न (4 वर्ष पुराने) का जवाब दे रहे हैं। –

+1

उस उदाहरण में दिखाया गया तरीका मेरे लिए काम करता है। अपने लूप में "जानकारी" बनाएं, लेकिन उसके बाद एक अलग फ़ंक्शन बनाएं जो "मार्कर" और "जानकारी" को InfoWindow और श्रोता को ईवेंट में बनाने के लिए लेता है। @ ostapische के उत्तर ने उचित ईवेंट विंडो बनाई, लेकिन वे सभी उन स्थानों पर थे जो किसी विशेष मार्कर से जुड़े नहीं थे। –

+0

यह एक अच्छा संसाधन है। ES2015 ब्लॉक स्कोपिंग शायद इस पर ख्याल रखता है। – sheriffderek

0

मैं एक ऐसी ही समस्या थी। यदि आप चाहते हैं कि कुछ जानकारी के लिए मार्कर पर होवर किया जाए, तो इसे क्लिक करने के बजाय, मुझे पता चला कि जानकारी विंडो का उपयोग करने का एक अच्छा विकल्प मार्कर पर एक शीर्षक सेट करना था। इस तरह जब भी आप मार्कर पर माउस को घुमाते हैं तो शीर्षक एएलटी टैग की तरह प्रदर्शित होता है। 'marker.setTitle (' मार्कर '+ आईडी);' यह बहुत

1

मेरे मामले में मार्कर के लिए एक श्रोता बनाने के लिए यह एक foreach पाश के अंदर पूरी तरह से काम किया है (का उपयोग जावास्क्रिप्ट insidde उस्तरा) की जरूरत को हटा

google.maps.event.addListener(marker, 'click', function() { 
    marker.info.open(map, this); 
}); 
संबंधित मुद्दे