Google Maps API v3 Event mouseover с плагином InfoBox - PullRequest
5 голосов
/ 25 марта 2011

Я возился с v3 API Карт Google и использую плагин InfoBox (часть пакета http://google -maps-utility-library-v3.googlecode.com / ) вместечтобы создать несколько красиво оформленных информационных окон, которые реагируют на взаимодействия маркеров.

В этом конкретном эксперименте я попытался открыть всплывающее окно InfoBox, когда маркер перемещался снова и снова, однако яизо всех сил пытался решить проблему с системой событий, касающейся наведения мыши / отключения мыши в окне InfoBox.Что происходит, так это то, что я могу найти DIV и использовать google.maps.event.addDomListener для присоединения события наведения и наведения мыши к InfoBox, за исключением того, что это слишком неудобно - когда я нахожу курсор мыши на дочернем узле в InfoBox, он считается мышью на родительскомузел и запускает событие.

Это как-то связано с распространением?Я знаю, что у InfoBox есть переключатель enableEventPropagation при создании нового InfoBox, но я не совсем уверен, как и почему он будет использоваться.

Цель эксперимента - создать информационное окно со связаннымиссылки внутри, которые появляются при наведении курсора на маркер.Затем вы можете перемещать мышь внутри информационного окна и взаимодействовать, а когда вы наведите курсор мыши, оно закроет информационное окно.Я попробовал другой метод, где наведение курсора на маркер вызывает внешнюю функцию, которая создает внешний элемент информационного окна, который позиционируется и имеет свою собственную обработку событий.Это работает нормально, но наложение пользовательского информационного окна в верхней части карты означает, что при наведении курсора на другой маркер в непосредственной близости (под пользовательским информационным окном) он не может зарегистрировать наведение мыши для маркера.

Это была моя попытка использования метода InfoBox:

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

Так что я думаю, если кто-нибудь знает, как заставить это работать и правильно реагировать (или предоставлять соответствующие советы / рекомендации), тогда это было бы здорово!

Ответы [ 2 ]

11 голосов
/ 12 мая 2011

У меня была такая же проблема. Как вы и сказали, проблема в том, что указатель мыши срабатывает при переходе к одному из дочерних элементов. Решение состоит в том, чтобы вместо этого использовать mouseenter и mouseleave (необходим jQuery), см. Этот пост для получения дополнительной информации: Наведите, наведите курсор мыши и наведите курсор мыши

В этом случае невозможно использовать прослушиватель событий карт Google (он не поддерживает mouseenter). Вместо этого вы можете прикрепить обычное событие 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();
        }
    );
});    
2 голосов
/ 12 мая 2011

Что происходит, так это то, что я могу найти DIV и использовать google.maps.event.addDomListener, чтобы прикрепить событие mouseover и mouseout к InfoBox, за исключением того, что это слишком неудобно - когда я наведите курсор мыши на дочерний узел внутриInfoBox, он считается мышью на родительском узле и запускает событие.

Наивным подходом для преодоления этого может быть обход дерева элементов в вашем обработчике mouseout и проверка того,найдите DIV или в конечном итоге в корне документа.Если вы нашли DIV, мышь все еще находится во всплывающем окне, и вам не нужно закрывать ее.

jQuery решает эту проблему, вводя второе событие, mouseleave,который ведет себя так, как вы ожидаете, и реализован аналогично тому, как описано выше. Исходный код jQuery имеет специальное закрытие withinElement для этого случая, на которое стоит обратить внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...