我在OpenLayers和取消注册添加到图层的单击事件时遇到问题。基本上,我需要做的是:
当用户点击一个标记时,他们会看到一个带有"编辑"链接的气泡。用户点击它,它在地图上创建一个新层,然后在地图上注册一个点击事件,等待用户点击地图。当玩家点击地图上的某个地方时,游戏便会将标记移动到他们点击的地方。
然而,问题是当用户单击编辑标记,然后单击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元素上,我添加了unregister调用,最后我删除了新图层,因为我们不想让它干扰。
我希望你能给我一些反馈。我快要疯了。
谢谢!
我认为你需要告诉OpenLayers 哪一个点击如果你想取消注册:
var method = function() {
// Do stuff...
}
map.events.register('click', map, method);
map.events.unregister('click', map, method);
根据OpenLayers。事件源,它检查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;
}
}
}
},
我希望这对你有用