无法在openlayers中取消注册click事件

时间:2011-10-03 16:06:17

标签: event-handling openlayers markers

我遇到OpenLayers问题并取消注册添加到图层的点击事件。基本上,我需要做的是:

当用户点击某个标记时,他们会获得一个包含“编辑”链接的气泡。用户单击它并在地图上创建一个新图层,然后将点击事件注册到地图,等待用户单击地图。当他们点击地图上的某个位置时,它会将标记移动到他们点击的位置。这一切都很完美。

然而,问题是当用户点击编辑标记,然后单击地图外部的按钮取消操作而不移动标记时,点击事件的注销不起作用。他们仍然可以点击地图并移动标记。

以下是代码示例:

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]);
}

正如你在cancel函数中看到的那样,我按图层名称获取图层,根据它在索引0处找到的console.log,我将注册添加到lmLayer中,希望这会有所帮助,但是到目前为止,没有运气。然后在map元素上我添加了unregister调用,最后我删除了那个新层,因为我们不希望它干扰。

我很感激对此的一些反馈。我正在失去理智。

谢谢!

1 个答案:

答案 0 :(得分:3)

我认为您需要告诉OpenLayers 哪个 点击您要取消注册的事件:

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

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

根据OpenLayers.Events源,它会检查侦听器堆栈中是否存在scopemethod

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;
            }
        }
    }
},

我希望这对你有用:)