2009-05-06 16 views
5

मेरे पास कुछ Google मानचित्र/जावास्क्रिप्ट समस्याएं हैं। मुझे लगता है कि मुझे पता है कि परेशानी क्या है लेकिन बस इसे चारों ओर एक रास्ता नहीं पता।Google मानचित्र समस्या: संदर्भ द्वारा बंद और पास

मेरी समस्या का एक उदाहरण here है। जो भी मार्कर आप क्लिक करते हैं, दूसरा दिखाता है। मैं स्पष्ट रूप से अपने ईवेंट श्रोता में गलत जानकारी गुजर रहा हूं लेकिन मुझे बस सही कोड नहीं मिल रहा है। यहाँ कोड के एक हिस्से को काट दिया गया है:

सबसे पहले, यहाँ मेरी कोड के एक हिस्से को बताया गया है:

if (GBrowserIsCompatible() && mapResults != null) { 
    // Read in the JSON 
    var mapDetailsArray = loadJSON(); 

    // Create a map 
    var map = new google.maps.Map2(document.getElementById(elementId)); 
    map.setCenter(new google.maps.LatLng(mapDetailsArray[0].getLatitude(), 
     mapDetailsArray[0].getLongitude()), 13); 
    map.addControl(new google.maps.SmallMapControl()); 

    // Add the points and center 
    var mgr = new google.maps.MarkerManager(map); 
    var bounds = new google.maps.LatLngBounds(); 
    for (var i = 0; i < mapDetailsArray.length; i++) { 
    var mapDetails = mapDetailsArray[i]; 

    var point = new google.maps.LatLng(mapDetails.getLatitude(), mapDetails 
     .getLongitude()); 
    bounds.extend(point); 

    // Create our marker 
    var marker = new google.maps.Marker(point); 

    // What action do we use to show the hover 
    var infoAction = "mouseover"; 

    marker.value = mapDetails; 

    google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 

    mgr.addMarker(marker, 1); 
    } 
    mgr.refresh(); 
} 

"marker.value" हमेशा ऊपर सेट क्या mapDetails था का अंतिम मान के रूप में समाप्त होता है। यदि कुछ भी हो, तो मैं उम्मीद करता हूं कि लूप समाप्त होने के बाद इसे "अपरिभाषित" किया जाए, क्या वह मूल्य वैसे भी नहीं जाना चाहिए? मैंने विभिन्न अलग-अलग मानों की कोशिश की है (उदा। Marker.value = i + 1;) लेकिन यह अभी भी दोनों बिंदुओं के लिए समान मूल्य के रूप में आ जाएगा।

क्या किसी को पता है कि मैं ईवेंट श्रोता में सही मूल्य कैसे पारित कर सकता हूं?

उत्तर

6

बदलें इस:

google.maps.Event.addListener(marker, infoAction, function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }); 
इस के लिए

:

google.maps.Event.addListener(marker, infoAction, (function(marker, point, map) { return function() { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    }})(marker, point, map)); 

यह बंद आप चाहते हैं पैदा करेगा।

स्पष्टता के लिए बाहर विभाजित करें:

var f = function(marker, point, map) 
{ 
    return function() 
    { 
     alert(marker.value); 
     map.openInfoWindowHtml(point, getResultInfoContent(marker.value)); 
    } 
} 

google.maps.Event.addListener(marker, infoAction, f(marker, point, map)); 
+0

कि चाल किया था। चीयर्स ग्रेग। मैंने पहले ऐसा कुछ करने की कोशिश की थी लेकिन वापसी कार्य() {...} कोड को लपेटकर घटा दिया। –

+0

मैंने एक ही समस्या का अनुभव किया है, और एक ही फिक्स का उपयोग किया है। मुझे वास्तव में लगता है कि यह जावास्क्रिप्ट में एक बग है। – SingleNegationElimination

+0

मुझे नहीं लगता कि यह एक बग है, यह बहुत सहज नहीं है – Greg

3

ऊपर जवाब हालांकि बहुत सहज ज्ञान युक्त नहीं है - के रूप में ग्रेग ने कहा।

जब आप किसी ऑब्जेक्ट में कोई ईवेंट जोड़ते हैं, तो उस ऑब्जेक्ट को पारित किया जाता है ताकि आप इसे बंद करके "इस" तक एक्सेस कर सकें। यदि आपने "this.value" के साथ "marker.value" को प्रतिस्थापित किया है तो आपकी समस्या हल हो गई होगी। आप अधिक सामान नीचे पारित करने के लिए की जरूरत है, तो आप इसे वस्तु को टाई हो कर नीचे से गुजरती हैं:

marker.a = 1 
marker.b = 2 
marker.c = 3 

बंद this.a 1 और इतने पर हो जाएगा के भीतर ..

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