не может отменить регистрацию события клика в openlayers - PullRequest
2 голосов
/ 03 октября 2011

У меня проблемы с OpenLayers и я не регистрирую события кликов, которые добавляются в слой.По сути, мне нужно сделать следующее:

Когда пользователь нажимает на маркер, он получает пузырь, на котором есть ссылка «изменить».Пользователь щелкает по нему, и он создает новый слой на карте, а затем регистрирует событие щелчка на карте, ожидая, когда пользователь щелкнет по карте.Когда они щелкают где-то на карте, он перемещает маркер туда, где они щелкнули.Это все работает отлично.

Однако проблема заключается в том, что пользователь нажимает, чтобы отредактировать маркер, а затем нажимает кнопку ВНЕ КАРТЫ, чтобы отменить действие и НЕ перемещать маркер, отменяя регистрацию события clickне работаетОни по-прежнему могут нажимать на карту, и она перемещает маркер.

Вот пример кода:

function move_marker(marker) {
    lmLayer = new OpenLayers.Layer.Markers("Landmark Creation",{displayInLayerSwitcher: false});
    map.addLayer(lmLayer);
    map.events.register("click", lmLayer, function(evt){
        var pixel = new OpenLayers.Pixel(evt.clientX,evt.clientY);
        position = map.getLonLatFromPixel(pixel);
        marker.lonlat = pixel;
        marker.moveTo(pixel);
        marker.draw();
        lmLayer.redraw();
        OpenLayers.Event.stop(evt);
    });
}
function cancel_move() {  // this function is triggered by a button outside of the map element
    lmLayer = map.getLayersByName('Landmark Creation');
    lmLayer[0].events.unregister("click");
    map.events.unregister("click");
    map.removeLayer(lmLayer[0]);
}

Как вы можете видеть в функции отмены, я получаю слойпо имени слоя, который в соответствии с console.log находит по индексу 0. Я добавил незарегистрированный элемент в lmLayer в надежде, что это поможет, но пока не повезло.Затем к элементу карты я добавляю вызов отмены регистрации и, наконец, удаляю этот новый слой, потому что мы не хотим, чтобы он мешал.

Буду признателен за некоторые отзывы об этом.Я схожу с ума.

Спасибо!

1 Ответ

3 голосов
/ 04 октября 2011

Я думаю, вам нужно сообщить OpenLayers , какое нажмите событие, которое вы хотите отменить:

var method = function() {
    // Do stuff...
}

map.events.register('click', map, method);
map.events.unregister('click', map, method);

Согласно источнику OpenLayers.Events, он проверяет,scope и method присутствуют в стеке слушателя:

unregister: function (type, obj, func) {
    if (obj == null)  {
        obj = this.object;
    }
    var listeners = this.listeners[type];
    if (listeners != null) {
        for (var i=0, len=listeners.length; i<len; i++) {
   HERE --> if (listeners[i].obj == obj && listeners[i].func == func) { <-- HERE
                listeners.splice(i, 1);
                break;
            }
        }
    }
},

Я надеюсь, что это работает для вас:)

...