在反应传单多边形(圆形)上捕获双击事件

Catch Double Click event on react leaflet polygon (circle)

我可以捕捉到单击事件

<Circle onClick={ (event) => this.seatClickHandler(event, seat) } ... />

但我还想捕获双击事件,这在 react-leaflet

中是否可行

我在双击时禁用了 zoom-in 地图,所以如果地图有事件,那么多边形应该有可用的东西吗?

不要在同一元素上注册 click 和 dblclick 事件:无法区分单击事件和导致 dblclick 事件的单击事件。

这不是 React 的限制,这是 DOM 的 click 和 dblclick 事件的限制。正如 Quirksmode 的 click documentation:

所建议的

我不得不绕过一些 DOM 的限制。

我曾经检查某个元素是否在短时间内被点击了两次

/**
 * Number of clicks.
 * 
 * @type {Number}
 */
let seatClickNumber;

/**
 * Id of element
 * 
 * @type {Number}
 */
let clickedSeatId;

/**
 * Last timeout ID
 * 
 * @type {Number}
 */
let timeoutId;

/**
 * Checks if seat is double clicked.
 * 
 * @param {Object} seat
 * 
 * @returns {boolean}
 */
isDoubleClick = (seat) => {
   if (clickedSeatId === seat['seatLabelId']) {
        seatClickNumber = seatClickNumber + 1;
    }

    clickedSeatId = seat['seatLabelId'];

    clearTimeout(timeoutId);
    timeoutId = setTimeout(() => {
        clickedSeatId = '';
        seatClickNumber = 1;
    }, 600);

    return seatClickNumber > 1;
};

/**
 * Selects one seat by click event or multiple by holding ctrl key whn clicking.
 *
 * @param {Object} event
 * @param {Object} seat
 */
seatClickHandler = (event, seat) =>
{
    if(this.isDoubleClick(seat)) {
        alert('Double Click!!!');
    }

    let index = this.props.selectedSeats.indexOf(seat);

    if (index !== -1) {
        this.props.deselectSeat(seat);
    } else {
        event.originalEvent.ctrlKey ? this.props.addSelectedSeats(seat) : this.props.setSelectedSeats(seat);
    }
};

基于 rxJS 的解决方案在构造函数或初始化函数中使用它:

const clickEvents = Rx.Observable.fromEvent(document.getElementById('yourId'), 'click');

const unsubscribe$= Rx.Subject()


clickEvents
  .buffer(clickEvents.debounce(300))
  .map(list => list.length)
  .filter(x => x === 2)
  .takeUntil(unsubscribe$)
  .subscribe(() => {
      console.log('you can handle the double click here');
  })

每当您想终止对事件的订阅时

您调用了一个使用

的函数
 unsubscribe$.next()
 unsubscribe$.complete()