2011-03-25 13 views
5

के साथ मैं Google मानचित्र एपीआई के v3 के साथ मिल रहा हूं और इन्फोबॉक्स प्लगइन (http://google-maps-utility-library-v3.googlecode.com/ सूट का हिस्सा) का उपयोग करके कुछ अच्छी तरह से स्टाइल की गई जानकारी विंडो बनाने के लिए जो मार्कर इंटरैक्शन पर प्रतिक्रिया करता है ।Google मानचित्र एपीआई v3 इवेंट माउसओवर इन्फोबॉक्स प्लगइन

इस विशेष प्रयोग के लिए, जब मार्कर को ऊपर और बाहर रखा गया है, तो मैंने इन्फोबॉक्स विंडो पॉप-अप प्राप्त करने का प्रयास किया है, हालांकि मैंने माउसओवर/माउसआउट के बारे में ईवेंट सिस्टम के साथ इस मुद्दे को हल करने के लिए संघर्ष किया है इन्फोबॉक्स विंडो। क्या होता है कि मैं डीआईवी का पता लगा सकता हूं और एक माउसओवर और माउसआउट इवेंट को इन्फोबॉक्स में संलग्न करने के लिए google.maps.event.addDomListener का उपयोग कर सकता हूं, सिवाय इसके कि यह बहुत ही स्पष्ट है - जब मैं इन्फोबॉक्स में एक बच्चे नोड को माउसवर करता हूं, तो यह पैरेंट नोड पर माउसआउट के रूप में गिना जाता है और घटना को आग लगती है।

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

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

<!DOCTYPE html> 
<html> 
<head> 
<style type="text/css"> 
<!-- 
    #map { 
     width:     800px; 
     height:     600px; 
     margin:     50px auto; 
    } 

    .map-popup { 
     overflow:    visible; 
     display:    block; 
    } 

    .map-popup .map-popup-window { 
     background:    #fff; 
     width:     300px; 
     height:     140px; 
     position:    absolute; 
     left:     -150px; 
     bottom:     20px; 
    } 

    .map-popup .map-popup-content { 
     padding:    20px; 
     text-align:    center; 
     color:     #000; 
     font-family:   'Georgia', 'Times New Roman', serif; 
    } 
--> 
</style> 
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
<script type="text/javascript" src="http://google-maps-utility-library-v3.googlecode.com/svn/trunk/infobox/src/infobox_packed.js"></script> 
<script type="text/javascript"> 

    var gmap, gpoints = []; 

    function initialize() { 
     gmap = new google.maps.Map(document.getElementById('map'), { 
      zoom:    9, 
      streetViewControl: false, 
      scaleControl:  false, 
      center:    new google.maps.LatLng(-38.3000000,144.9629796), 
      mapTypeId:   google.maps.MapTypeId.ROADMAP 
     }); 

     for (var i=0; i<5; i++) { 
      gpoints.push(new point(gmap)); 
     } 
    } 

    function popup(_point) { 
     _point.popup = new InfoBox({ 
      content:   _point.content, 
      pane:    'floatPane', 
      closeBoxURL:  '', 
      alignBottom:  1 
     }); 

     _point.popup.open(_point.marker.map, _point.marker); 

     google.maps.event.addListener(_point.popup, 'domready', function() { 
      // Have to put this within the domready or else it can't find the div element (it's null until the InfoBox is opened) 
      google.maps.event.addDomListener(_point.popup.div_, 'mouseout', function() { 
       _point.popup.close(); 
      }); 
     }); 
    } 

    function point(_map) { 
     this.marker = new google.maps.Marker({ 
      position:   new google.maps.LatLng(-37.8131869 - (1 * Math.random()),144.9629796 + (1 * Math.random())), 
      map:    _map 
     }); 

     this.content = '<div class="map-popup"><div class="map-popup-window"><div class="map-popup-content"><a href="http://www.google.com/">Just try to click me!</a><br/>Hovering over this text will result in a <code>mouseout</code> event firing on the <code>map-popup</code> element and this will disappear.</div></div>'; 

     // Scope 
     var gpoint = this; 

     // Events 
     google.maps.event.addListener(gpoint.marker, 'mouseover', function() { 
      popup(gpoint); 
     }); 
    } 

</script> 
</head> 
<body onload="initialize()"> 
    <div id="map"></div> 
</body> 
</html> 

तो मुझे लगता है कि इसके बाद उस बहुत अच्छा होगा:

यह infobox विधि पर मेरे प्रयास किया गया था! जब मैं अंदर एक बच्चा नोड अपना माउस ले -

+0

क्या आपको कभी इसके लिए अच्छा समाधान मिला? नीचे दिया गया jQuery उदाहरण ऐसा लगता है कि यह पॉपअप को लक्षित करता है, न कि मार्कर।मुझे यह देखने में परेशानी हो रही है कि इन्फोबॉक्स का उपयोग करके इसे कैसे कार्यान्वित किया जाए। इन्फोबॉक्स के नवीनतम देव संस्करण में अपग्रेड करके और ईवेंट प्रचार को चालू करके, मैं पॉपअप को पॉपअप के नीचे किसी भी अंतर्निहित मार्कर पर कूदने में सक्षम नहीं था। –

उत्तर

11

मुझे एक ही समस्या है। जैसा कि आप कहते हैं कि मुद्दा यह है कि बाल तत्वों में से किसी एक पर जाने पर माउसआउट ट्रिगर होता है। समाधान इसके बजाय माउसएन्टर और माउसलेव (jQuery आवश्यक) का उपयोग करना है, अधिक जानकारी के लिए इस पोस्ट को देखें: Hover, mouseover and mouse out

इस मामले में Google मानचित्र ईवेंट श्रोता का उपयोग करना संभव नहीं है (यह माउसenter का समर्थन नहीं करता है)। इसके बजाय आप एक सामान्य jQuery ईवेंट संलग्न कर सकते हैं, या निम्न कोड में दिखाए गए होवर फ़ंक्शन का उपयोग कर सकते हैं:

google.maps.event.addListener(_point.popup, 'domready', function() { 
//Have to put this within the domready or else it can't find the div element (it's null until the InfoBox is opened) 

    $(_point.popup.div_).hover(
     function() { 
      //This is called when the mouse enters the element 
     }, 
     function() { 
      //This is called when the mouse leaves the element 
      _point.popup.close(); 
     } 
    ); 
});  
+0

धन्यवाद इसने मुझे बहुत मदद की! –

+0

होवर फ़ंक्शंस में, मैं एक चर सेट करता हूं यह इंगित करने के लिए कि पॉपअप खुला है या नहीं। फिर मार्कर के लिए 'माउसओवर' कॉलबैक में, मैं केवल इन्फोबॉक्स प्रदर्शित करता हूं यदि यह पहले से खुला नहीं है। आखिरकार, मैंने वैरिएबल को रीसेट करने के लिए 'क्लिकक्लोज़' ईवेंट जोड़ा जो इंगित करता है कि पॉपअप बंद है। अंततः इन्फोबॉक्स सही ढंग से काम करता है जब यह मार्कर ओवरले करता है। – yitwail

+0

jquery के साथ इसका उपयोग करने का हालिया तरीका: 'google.maps.event.addListener (_point,' domready ', function() {$ (_ point.div _)। माउसओवर (फ़ंक्शन (ई) {... ' – user151496

2

क्या होता है कि मैं DIV पता लगाने और infobox करने के लिए एक माउसओवर और mouseout घटना संलग्न करने के लिए है, सिवाय इसके कि यह बहुत बारीकियों है एक google.maps.event.addDomListener का उपयोग कर सकते है इन्फोबॉक्स, यह पैरेंट नोड पर माउसआउट के रूप में गिना जाता है और घटना को आग लगा देता है।

इस पर काबू पाने के लिए अपने mouseout हैंडलर में तत्व पेड़ पर पार करने के लिए और आप DIV पाते हैं या दस्तावेज़ जड़ में अंत है कि क्या जांच करने के लिए हो सकता है एक अनुभवहीन दृष्टिकोण। यदि आपको डीआईवी मिलती है, तो माउस अभी भी पॉपअप के भीतर है और आपको इसे बंद करने की आवश्यकता नहीं है।

jQuery एक दूसरी घटना, mouseleave पेश करके अच्छी तरह से इस समस्या को हल करता है, जो व्यवहार करता है जैसा कि आप इसकी अपेक्षा करेंगे और जैसा ऊपर बताया गया है उसी तरह लागू किया गया है। jQuery sourcecode इस मामले के लिए एक विशेष बंद withinElement है जो देखने के लायक हो सकता है।

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