Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/441.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在OpenLayers 3中删除侦听器_Javascript_Openlayers 3 - Fatal编程技术网

Javascript 如何在OpenLayers 3中删除侦听器

Javascript 如何在OpenLayers 3中删除侦听器,javascript,openlayers-3,Javascript,Openlayers 3,我在stackoverflow这里对我的问题做了一个总结,因为在gis.stackexchange,我所有的问题都没有引起任何注意——很多时候,我在那里无法得到简单问题的答案。因此,我现在的问题是如何删除以这种方式定义的侦听器: map.getViewport().addEventListener('click', function (e){ console.log("clicked"); }); 要删除,首先要声明一个附加到click的外部函数 然后使用removeEve

我在stackoverflow这里对我的问题做了一个总结,因为在gis.stackexchange,我所有的问题都没有引起任何注意——很多时候,我在那里无法得到简单问题的答案。因此,我现在的问题是如何删除以这种方式定义的侦听器:

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,因为它似乎是最有用的。