изменение показателя Z маркера при наведении, чтобы сделать его видимым

Я пытаюсь сделать маркер, на котором я сейчас зависаю, большим Z-индексом, чем другие, так что даже если он скрыт другими маркерами, он получит полную видимость при наведении на него.

нажмите на любой маркер я хочу сделать то же самое .

  google.maps.event.addListener(this.marker, 'mouseover', function() {
            this.old_ZIndex = this.getZIndex(); //trying to get the current z- index
            console.log(this.old_ZIndex); //this is undefined: why?
            this.setZIndex(this.old_ZIndex + 100); //setting a higher z-index than all other  markers
            console.log("the old z index is ",this.old_ZIndex);
        });

но с этим я бы бесконечно увеличил индекс Z.. есть ли другой способ, которым я могу вернуться назад, когда я наведу курсор или щелкну любой другой маркер . .

или есть лучше способ его реализации ??

5 ответов


'этот.getZIndex () 'всегда возвращает' undefined', если вы ранее не устанавливали zIndex на маркере, либо при инициализации его в первую очередь, либо с помощью функции setOption ().

ваш скрипт также может не работать на 100%, если есть более 100 маркеров.

Я собрал очень простую карту ниже, которая содержит 2 маркера, слегка перекрывающихся. При наведении одного из маркеров он установит zIndex на самый высокий уровень, необходимый для его приведения к вершине, а затем верните его обратно к тому, что было ранее в mouseout:

    var map;
    var markers = new Array();
    var highestZIndex = 0;

    function initialize() {

        /* SETUP MAP */
        var myLatlng = new google.maps.LatLng(52.06768, -1.33758);
        var mapOptions = {
            center: myLatlng,
            zoom: 10,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        }
        map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions);

        /* ADD 1st MARKER */
        var markerOptions = {
            position: new google.maps.LatLng(52.06768, -1.32058), 
            map: map,
            zIndex:1
        };
        marker = createMarker(markerOptions, false);
        marker.set("myZIndex", marker.getZIndex());

        google.maps.event.addListener(marker, "mouseover", function() {
            getHighestZIndex();
            this.setOptions({zIndex:highestZIndex+1});
        });
        google.maps.event.addListener(marker, "mouseout", function() {
            this.setOptions({zIndex:this.get("myZIndex")});
        });

        /* ADD 2nd MARKER */
        var markerOptions = {
            position: new google.maps.LatLng(52.06768, -1.33758), 
            map: map,
            zIndex:2    
        };
        marker = createMarker(markerOptions, false);
        marker.set("myZIndex", marker.getZIndex());

        google.maps.event.addListener(marker, "mouseover", function() {
            getHighestZIndex();
            this.setOptions({zIndex:highestZIndex+1});
        });
        google.maps.event.addListener(marker, "mouseout", function() {
            this.setOptions({zIndex:this.get("myZIndex")});
        });

    }

    function createMarker(markerOptions) {
        var marker = new google.maps.Marker(markerOptions);
        markers.push(marker);
        return marker;
    }

    function getHighestZIndex() {

        // if we haven't previously got the highest zIndex
        // save it as no need to do it multiple times
        if (highestZIndex==0) {
            if (markers.length>0) {
                for (var i=0; i<markers.length; i++) {
                    tempZIndex = markers[i].getZIndex();
                    if (tempZIndex>highestZIndex) {
                        highestZIndex = tempZIndex;
                    }
                }
            }
        }
        return highestZIndex;

    }

var marker = new google.maps.Marker({
                position: myLatLng,
                map: map,
                zIndex: 1
            });       

            google.maps.event.addListener(marker, 'mouseover', function () {
                this.setOptions({zIndex:10});
            });
            google.maps.event.addListener(marker, 'mouseout', function () {
                this.setOptions({zIndex:1});
            });

Итак, этот вопрос был год назад, но я кое-что понял и подумал, что другие могут оценить это. Есть даже icon rollovers участвует в качестве бонуса. Я имею дело с тысячами автобусных и железнодорожных остановок, поэтому это оказалось довольно эффективным для меня.

google.maps.event.addListener(marker, 'mouseover', function () {
    if (this.getIcon() === busnot) { this.setIcon(busovr); }
    if (this.getIcon() === lrtnot) { this.setIcon(lrtovr); }
    $.each($.grep(markers, function (item) { return item.getZIndex() == 10 }), function (i, e) { e.setOptions({ zIndex: 1 }); });
    this.setOptions({zIndex:10});
});
google.maps.event.addListener(marker, 'mousemove', function () {
    if (this.getIcon() === busnot) { this.setIcon(busovr); }
    if (this.getIcon() === lrtnot) { this.setIcon(lrtovr); }
    $.each($.grep(markers, function (item) { return item.getZIndex() == 10 }), function (i, e) { e.setOptions({ zIndex: 1 }); });
    this.setOptions({ zIndex: 10 });
});
google.maps.event.addListener(marker, 'mouseout', function () {
    if (this.getIcon() === busovr) { this.setIcon(busnot); }
    if (this.getIcon() === lrtovr) { this.setIcon(lrtnot); }
    $.each($.grep(markers, function (item) { return item.getZIndex() == 10 }), function (i, e) { e.setOptions({ zIndex: 1 }); });
});

способ, которым я это сделал, состоял в том, чтобы одна переменная(highestZ) установила zIndex для всех моих маркеров(в моем случае я сделал это с полилиниями) и инкрементами, а одна переменная временно удерживала Z-индекс любого маркера i "mouseover":

задайте переменные как глобальные:

var highestZ = 1; //set 1 for the first z-index
var tmpZIndex = 0;

затем при создании / инициализации параметров маркера просто добавьте это

zIndex : highestZ++ //this sets the z-index for the marker and increments it for the next one

образец (я сделал свой в цикле):

var routePath = new google.maps.Polyline({
           strokeWeight: 5,
           zIndex : highestZ++ //set zIndex and increment it
         });

и, наконец, просто наведите курсор мыши и обработчики событий mouseout:

        google.maps.event.addListener(routePath, "mouseover", function() {
            tempZIndex = routePath.zIndex; //set "this" z-index value to tempZIndex for mouseout
            routePath.setOptions({
                zIndex: highestZ + 1 //set the z-index to the highest z-index available plus 1 for it to be the topmost marker on mouseover
            });
        });
        google.maps.event.addListener(routePath, "mouseout", function() {
            routePath.setOptions({
                zIndex: tempZIndex //set the z-index back to it's original set upon mouseover earlier
            });

мой ответ, вероятно, прост, и общий и, конечно, неполный, чтобы сосредоточиться только на проблеме, надеюсь, вы можете работать дальше, чтобы соответствовать вашему проекту.


Я думаю, что самый простой способ-использовать CSS вместо Javascript:

.your-custom-marker-class {
   z-index: 100;
}
.your-custom-marker-class:hover {
   z-index: 101;
}

Это означает, что вы должны использовать CustomOverlays (https://developers.google.com/maps/documentation/javascript/customoverlays#introduction) вместо маркеров по умолчанию, но у этого есть и другие преимущества, если вы хотите настроить макет и т. д.