OpenLayers中的去抖动功能选择

时间:2016-02-18 17:16:16

标签: javascript openlayers-3

我正在使用一组使用大量矢量要素的地图。在某些浏览器中,当OpenLayers处理pointermove事件交互时,存在显着延迟。例如:

function selectOnHover(map, handler, styleFn) {
    var selectMove = new ol.interaction.Select({
        condition: ol.events.condition.pointerMove,
        style: styleFn
    });

    map.addInteraction(selectMove);
    selectMove.on('select', handler);
}

在处理连续输入(例如处理滚动事件)并需要大量处理的其他情况下,我通常会debounce事件的处理程序 - 因此只有在输入暂停时才会执行重要工作(在此处案例,确定交叉特征)。 有没有办法在浏览器事件发送和OpenLayers检查交叉点之间插入去抖动,而不会绕过OpenLayers交互处理?

我已尝试直接处理pointermove / mousemove事件,对它们进行去抖动(重新分配手动创建的synthetic事件),然后使用交互条件仅处理合成事件。除了OpenLayers没有获取Internet Explorer的合成事件之外,这个工作正常。

我正在考虑规避OpenLayers交互 - 例如使用forEachFeatureAtPixel并手动更新样式。

1 个答案:

答案 0 :(得分:4)

事实上,即使使用标准API,您也可以将精选互动包装到自定义互动中,然后去抖动 handleEvent功能:

var app = {};
app.DebounceSelect = function() {
  this.selectInteraction = new ol.interaction.Select({
    condition: ol.events.condition.pointerMove
  });

  var handleEventDebounce = debounce(function(evt) {
    return ol.interaction.Select.handleEvent.call(this.selectInteraction, evt);
  }.bind(this), 100);

  ol.interaction.Interaction.call(this, {
    handleEvent: function(evt) {
        handleEventDebounce(evt);
      // always return true so that other interactions can
      // also process the event
      return true;
    }
  });
};
ol.inherits(app.DebounceSelect, ol.interaction.Interaction);

app.DebounceSelect.prototype.setMap = function(map) {
  this.selectInteraction.setMap(map);
};

var select = new app.DebounceSelect();
map.addInteraction(select);

http://jsfiddle.net/n9nbrye8/3/

有关如何编写自定义互动的示例,请参阅:http://openlayers.org/en/master/examples/custom-interactions.html

ol.interaction.Select.handleEvent

的文档