OpenLayers.Popup closeBoxCallback не запущен - PullRequest
2 голосов
/ 15 февраля 2012

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

У меня есть карта OpenLayers с некоторыми маркерами.У каждого маркера есть свое всплывающее окно, которое отображается при нажатии на него.Если щелкнуть маркер, он должен исчезнуть, и должно быть видно только всплывающее окно.Когда всплывающее окно закрыто, маркер должен появиться снова.

var map = new OpenLayers.Map({
    div: 'map'
});
var markers = new OpenLayers.Layer.Markers('Markers');
map.addLayers([new OpenLayers.Layer.Google('Google Streets'), markers]);

var closeCallback = function() {
    console.log("CLOSE!!!");
    this.marker.display(true);
    this.hide();
};
var clickCallback = function(event) {
    for (var i = 0; i < map.popups.length; i = i + 1) {
        if (map.popups[i].visible()) {
            map.popups[i].hide();
        }
    }
    if (map.popups.indexOf(this.popup) == -1) {
        map.addPopup(this.popup, false);
        this.popup.marker = this.marker;
    }
    this.popup.show();
    this.marker.display(!this.popup.visible());
    OpenLayers.Event.stop(event);
};

var lonLat1 = new OpenLayers.LonLat(0, 0).transform(defaultProjection, map.getProjectionObject());
var feature1 = new OpenLayers.Feature(markers, lonLat1);
var marker1 = feature1.createMarker();
var popup1 = new OpenLayers.Popup.FramedCloud(
    'popup1',
    lonLat1,
    new OpenLayers.Size(200, 200),
    'loading...',
    null,
    true,
    closeCallback
);
feature1.data.icon = icon.clone();
feature1.popup = popup1;
markers.addMarker(marker1);
marker1.events.register('mousedown', feature1, clickCallback);

var lonLat2 = new OpenLayers.LonLat(0, 0.5).transform(defaultProjection, map.getProjectionObject());
var feature2 = new OpenLayers.Feature(markers, lonLat2);
var marker2 = feature2.createMarker();
var popup2 = new OpenLayers.Popup.FramedCloud(
    'popup2',
    lonLat2,
    new OpenLayers.Size(200, 200),
    'loading...',
    null,
    true,
    closeCallback
);
feature2.data.icon = icon.clone();
feature2.popup = popup2;
markers.addMarker(marker2);
marker2.events.register('mousedown', feature2, clickCallback);

Событие запускается, если я нажимаю на кнопку закрытия всплывающего окна.Но если я нажимаю на другой маркер, он не срабатывает.

map.addPopup(this.popup, false);

Также, когда я устанавливаю exclusive (второй атрибут addPopup ) в значение true, так чтовсе всплывающие окна будут скрыты, если появится новое событие, которое не было запущено.

Спасибо за помощь.

1 Ответ

0 голосов
/ 30 марта 2016

Пока не существует лучшего решения, я думаю, что мы можем использовать следующее:

Переопределить метод addCloseBox из OpenLayers.Popup.Проверьте изменения, которые я сделал.

/**
 * Method: addCloseBox
 * 
 * Parameters:
 * callback - {Function} The callback to be called when the close button
 *     is clicked.
 */
OpenLayers.Popup.prototype.addCloseBox = function(callback) {

    this.closeDiv = OpenLayers.Util.createDiv(
        this.id + "_close", null, {w: 17, h: 17}
    );
    this.closeDiv.className = "olPopupCloseBox"; 

    // use the content div's css padding to determine if we should
    //  padd the close div
    var contentDivPadding = this.getContentDivPadding();

    this.closeDiv.style.right = contentDivPadding.right + "px";
    this.closeDiv.style.top = contentDivPadding.top + "px";
    this.groupDiv.appendChild(this.closeDiv);

    // COMMENT OUT THIS DEFINITION OF 'closePopup'
    //var closePopup = callback || function(e) {
    //    this.hide();
    //    OpenLayers.Event.stop(e);
    //};

    // NEW DEFINITION OF 'closePopup'
    var closePopup = function(e) {
        this.hide();
        /* Checks whether the callback is a function */
        if (typeof callback == 'function') { 
            /* Triggers the callback */
            callback(); 
        }
        OpenLayers.Event.stop(e);
    };

    OpenLayers.Event.observe(this.closeDiv, "touchend", 
            OpenLayers.Function.bindAsEventListener(closePopup, this));
    OpenLayers.Event.observe(this.closeDiv, "click", 
            OpenLayers.Function.bindAsEventListener(closePopup, this));
};

:)

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