Javascript 如何在OpenLayers 3中删除侦听器
我在stackoverflow这里对我的问题做了一个总结,因为在gis.stackexchange,我所有的问题都没有引起任何注意——很多时候,我在那里无法得到简单问题的答案。因此,我现在的问题是如何删除以这种方式定义的侦听器:Javascript 如何在OpenLayers 3中删除侦听器,javascript,openlayers-3,Javascript,Openlayers 3,我在stackoverflow这里对我的问题做了一个总结,因为在gis.stackexchange,我所有的问题都没有引起任何注意——很多时候,我在那里无法得到简单问题的答案。因此,我现在的问题是如何删除以这种方式定义的侦听器: map.getViewport().addEventListener('click', function (e){ console.log("clicked"); }); 要删除,首先要声明一个附加到click的外部函数 然后使用removeEve
map.getViewport().addEventListener('click', function (e){
console.log("clicked");
});
要删除,首先要声明一个附加到click的外部函数 然后使用
removeEventListener
像这样
function myFunction(event){
//some stuff
console.log("clicked");
}
map.getViewport().addEventListener('click',myFunction);
然后用手把它取下来
map.getViewport().removeEventListener('click',myFunction);
就这些
这里是一个片段
函数myfunction(e){
警报(“事件点击”);
}
document.getElementById(“mybtn”).addEventListener(“单击”,myfunction);
document.getElementById(“mybtn2”).addEventListener(“单击”,函数(e){
document.getElementById(“mybtn”).removeEventListener(“单击”,myfunction);
});代码>
btn
删除btn单击它自己的事件类型,您可以使用它来代替。为了回答您最初的问题,它提供了一种简单快捷的方法来注销它们
看看这个例子:
更具体地说,在这些行:
map.on('pointermove', function(evt) {
if (evt.dragging) {
return;
}
var pixel = map.getEventPixel(evt.originalEvent);
displayFeatureInfo(pixel);
});
map.on('click', function(evt) {
displayFeatureInfo(evt.pixel);
});
ol.Map
对象有一个on
方法,可用于在ol3地图浏览器事件上注册事件侦听器。最好使用这些事件,而不是标准的浏览器事件。请参见此处所有地图浏览器事件的列表:
要取消注册,您可以:
a) 使用un
方法,但确保为提供与第二个参数相同的回调方法。换言之:
var callback = function(evt) {
displayFeatureInfo(evt.pixel);
};
map.on('click', callback);
map.un('click', callback);
b) 另一种方法是使用ol.Observable.unByKey
方法,我非常喜欢这种方法。在
上调用或一次
时,返回一个引用事件的键。然后,您可以使用该键取消对事件的收听:
var key = map.on('click', function(evt) {
displayFeatureInfo(evt.pixel);
});
ol.Observable.unByKey(key);
我发现b)更友好,因为您可以注册一组事件侦听器,并将所有键放入一个数组中。当您想要全部注销它们时,在数组中循环并调用unByKey方法,然后清空数组。与手动注销所有事件相比,它生成的代码更少。如果使用getViewport(),它将返回一个与openlayers无关的HTMLElement。请参见openlayers listener添加和删除的描述,顺便说一句。如果您想注册对地图的单击,例如,知道单击的坐标,那么您肯定应该使用ol3本机地图浏览器事件,因为事件对象将包含该信息。@Alexandre Dubé。谢谢现在我使用的是map。在上,您可以返回并接受@Alexandre Dubéresponse,因为它似乎是最有用的。