如何在OpenLayers 3中删除监听器

Jac*_*ian 6 javascript openlayers-3

我在stackoverflow上复制了我的问题,因为在gis.stackexchange中我的所有问题都没有引起任何注意 - 很多时候我无法得到简单问题的答案.那么,我现在的问题是如何删除以这种方式定义的侦听器:

map.getViewport().addEventListener('click', function (e){
   console.log("clicked");      
}); 
Run Code Online (Sandbox Code Playgroud)

Ale*_*ubé 14

OL3会引发您可以使用的各种事件,并且为了回答您的原始问题,可以轻松快捷地注销它们.

请看这个例子:http://openlayers.org/en/v3.13.0/examples/vector-layer.html

更具体地说,在这些方面:

  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);
  });
Run Code Online (Sandbox Code Playgroud)

ol.Map对象有一个on方法可用于在ol3地图浏览器事件上注册事件侦听器.最好使用这些事件而不是标准的浏览器事件.在此处查看所有地图浏览器事件的列表:http://openlayers.org/en/v3.13.0/apidoc/ol.MapBrowserEvent.html

取消注册,您可以:

a)使用该un方法,但要确保提供第二个参数相同的回调方法.换一种说法:

  var callback = function(evt) {
    displayFeatureInfo(evt.pixel);
  };
  map.on('click', callback);
  map.un('click', callback);
Run Code Online (Sandbox Code Playgroud)

b)另一种方法是使用ol.Observable.unByKey我喜欢的方法.调用on或时once,它返回引用该事件的键.然后,您可以使用该键取消活动:

  var key = map.on('click', function(evt) {
    displayFeatureInfo(evt.pixel);
  });
  ol.Observable.unByKey(key);
Run Code Online (Sandbox Code Playgroud)

我发现b)更友好,因为你可以注册一堆事件监听器并将所有密钥放在一个数组中.如果要取消全部注册,请在数组中循环并调用unByKey方法,然后清空数组.它生成的代码少于手动取消注册所有事件的代码.