event-handling - 无法在 openlayers 中取消注册点击事件

标签 event-handling openlayers markers

我在使用 OpenLayers 时遇到问题,无法注册添加到图层的单击事件。基本上,我需要做的是:

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

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

以下是代码示例:

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 希望这会有所帮助,但是到目前为止,还没有运气。然后在 map 元素上添加取消注册调用,最后删除该新图层,因为我们不希望它干扰。

如果您能对此提供一些反馈,我将不胜感激。我快疯了。

谢谢!

最佳答案

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

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

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

根据 OpenLayers.Events 源,它检查监听器堆栈中是否存在范围方法:

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

我希望这对你有用:)

关于event-handling - 无法在 openlayers 中取消注册点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7637560/

相关文章:

javascript - 基于缩放级别显示 WMS 图层

z-index - 更改 openlayers 中标记的 z 索引

tags - 如何将多个标签应用于pytest中的测试用例?

javascript - jQuery 的 click() 函数怎么会比 addEventListener() 快这么多?

c# - 使用事件处理程序刷新所有 DataGrid

javascript - react js eventListeners 没有按预期删除

JavaScript 事件监听器测验

javascript - 将弹出窗口放置在从获取查询(GeoJSON 响应)检索到的点上

javascript - 简单的 OpenLayers 函数在 jQuery 函数中不起作用

android - google map marker clustering ad custom Infowindow Adapter 如何为 clusterItem(标记)设置标签