我可以捕获单击事件
<Circle onClick={ (event) => this.seatClickHandler(event, seat) } ... />
我想捕获双击事件,这在react-leaflet
中可能吗?
我已经禁用了双击地图放大的功能,因此如果有关于地图的事件,那么对于多边形肯定也会有可用的事件吧?
我可以捕获单击事件
<Circle onClick={ (event) => this.seatClickHandler(event, seat) } ... />
我想捕获双击事件,这在react-leaflet
中可能吗?
我已经禁用了双击地图放大的功能,因此如果有关于地图的事件,那么对于多边形肯定也会有可用的事件吧?
我不得不绕过一些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()