GoogleMaps теряет событие mouseUp, если прямоугольник перерисовывается в событии mouseMove - PullRequest
5 голосов
/ 21 ноября 2011

Следующий пример кода сбил меня с толку.Это самая простая версия большого кода, которую я могу использовать для демонстрации своей проблемы.По сути, я хочу, чтобы пользователь мог рисовать ограничивающий прямоугольник, удерживая клавишу мыши и перетаскивая ее.

Если я перерисовываю прямоугольник с помощью setBounds в функции mouseMove, я никогда не увижу событие mouseUp!Если я отключу перерисовку прямоугольника в функции mouseMove, я получу событие mouseUp.Я могу частично обойти эту проблему, нарисовав прямоугольник в событии mouseUp, но тогда пользователь не сможет увидеть контур, когда он перетаскивает поле.

Вы можете увидеть этот пример кода в действии на http://www.geoffschultz.org/Test/bounding_box.html

Вот код:

<!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 ]

2 голосов
/ 21 ноября 2011

Если вы обновите границы прямоугольника, событие mouseup будет использовано прямоугольником (это потому, что курсор мыши теперь расположен внутри прямоугольника).Для этого есть два решения:

  1. Установите clickable свойство объекта прямоугольника на false.Тогда прямоугольник не будет поглощать событие.

    gribBoundingBox = new google.maps.Rectangle ({map: map, bounds: bounds, fillOpacity: 0.05, strokeWeight: 1, clickable: false});

  2. Добавить mouseup прослушиватель событий к объекту прямоугольника.Таким образом, событие используется и обрабатывается прямоугольником.В вашем примере вы можете использовать ту же функцию слушателя.

    google.maps.event.addListener (gribBoundingBox, 'mouseup', function (event) {mouseUp (event);});

0 голосов
/ 05 июля 2013

Можно также попытаться зарегистрировать событие mouseup для документа, если другое решение не работает.

document.addEventListener('mouseup', function(evt){
    stopDraw(evt);
});
...