gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:12:23 27 4
gpt4 key购买 nike

我在使用 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 源,它检查 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;
}
}
}
},

我希望这对你有用:)

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com