2011-11-21 5 views
5

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

यदि मैं माउसमोव फ़ंक्शन में सेटबाउंड का उपयोग करके आयत को फिर से चलाता हूं, तो मुझे माउसअप ईवेंट कभी नहीं दिखाई देता है! यदि मैं माउसमोव फ़ंक्शन में आयताकार को पुनः हटाने को अक्षम करता हूं, तो मुझे माउसअप ईवेंट मिलता है। मैं माउसअप इवेंट में आयताकार ड्राइंग करके आंशिक रूप से इस पर काम कर सकता हूं, लेकिन फिर उपयोगकर्ता बॉक्स की रेखा खींचने के रूप में रूपरेखा नहीं देख सकता है।

<!DOCTYPE html> 
<html> 
    <head> 
     <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
     <style type="text/css"> 
      html { height: 100% } 
      body { height: 100%; margin: 0; padding: 0 } 
      #mapdiv { height: 100% } 
     </style> 
     <script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script> 
     <script type="text/javascript"> 
      var map, mouseDownPos, gribBoundingBox = "", mouseIsDown = 0; 

     function display_map() 
     {  
      var latlng = new google.maps.LatLng(42, -71); 
      var myOptions = {zoom: 8, center: latlng, mapTypeId: google.maps.MapTypeId.ROADMAP}; 
      map = new google.maps.Map(document.getElementById("mapdiv"), myOptions); 

      google.maps.event.addListener(map,'mousemove',function(event) {mouseMove(event);}); 
      google.maps.event.addListener(map,'mousedown',function(event) {mouseDown(event);}); 
      google.maps.event.addListener(map,'mouseup',function(event) {mouseUp(event);}); 
     } 

     function mouseMove(event) 
     { 
      if (mouseIsDown) 
      { 
      if (gribBoundingBox) // box exists 
       { 
       var bounds = new google.maps.LatLngBounds(gribBoundingBox.getBounds().getSouthWest(), event.latLng); 
       gribBoundingBox.setBounds(bounds); // If this statement is enabled, I lose mouseUp events 
       } 
      else // create bounding box 
       { 
       var bounds = new google.maps.LatLngBounds(mouseDownPos, event.latLng); 
       gribBoundingBox = new google.maps.Rectangle({map: map, bounds: bounds, fillOpacity: 0.05, strokeWeight: 1}); 
       } 
      } 
     } 

     function mouseDown(event) 
     { 
      mouseIsDown = 1; 
      mouseDownPos = event.latLng; 
      map.setOptions({draggable: false}); 
     } 

     function mouseUp(event) 
     { 
      if (mouseIsDown) 
      { 
       mouseIsDown = 0; 
       map.setOptions({draggable: true}); 
     //  var bounds = new google.maps.LatLngBounds(mouseDownPos, event.latLng); 
     //  gribBoundingBox.setBounds(bounds); // If used instead of above, box drawn properly 
       gribBoundingBox.setEditable(true); 
      } 
     } 
    </script> 
</head> 

<body onload="display_map()"> 
    <div id="mapdiv" style="width:100%; height:100%"></div> 
</body> 
</html> 

उत्तर

2

आप आयत सीमा अपडेट करते हैं, mouseup घटना आयत द्वारा सेवन किया जाता है (यह क्योंकि माउस है:

आप http://www.geoffschultz.org/Test/bounding_box.html

यहाँ पर कार्रवाई में इस कोड नमूना देख सकते हैं कोड है कर्सर अब आयताकार के भीतर स्थित है)।

  1. सेट false को आयत वस्तु की clickable संपत्ति: इस के लिए दो समाधान हैं। आयत तब घटना का उपभोग नहीं करेगा।

    gribBoundingBox = new google.maps.Rectangle ({map: map, bounds: bounds, fillOpacity: 0.05, strokeWeight: 1, क्लिक करने योग्य: false});

  2. आयताकार ऑब्जेक्ट में mouseup ईवेंट श्रोता जोड़ें। इस तरह घटना आयताकार और आयताकार द्वारा संभाला जाता है। आपके उदाहरण में आप एक ही श्रोता फ़ंक्शन का उपयोग कर सकते हैं।

    google.maps.event.addListener (gribBoundingbox, 'माउसअप', फ़ंक्शन (ईवेंट) {माउसअप (ईवेंट);});

+0

Tomik, आप इस उत्तर के लिए बहुत बहुत धन्यवाद। यह ठीक काम करता है और मैंने कभी आपकी अंतर्दृष्टि के बिना यह नहीं सोचा होगा। समाधान 1 पूरी तरह से काम किया। – GeoffSchultz

0

कोई अन्य दस्तावेज़ काम नहीं कर रहा है, तो दस्तावेज़ पर माउसअप ईवेंट पंजीकृत करने का भी प्रयास कर सकता है।

document.addEventListener('mouseup', function(evt){ 
    stopDraw(evt); 
}); 
संबंधित मुद्दे