Используйте Observables. Вы можете думать о них как о потоках событий. Отмена вывода должна дать желаемый результат.
var event_a = Rx.Observable.fromEvent(document, 'mousemove');
var event_b = Rx.Observable.fromEvent(document, 'click'); // or in this case (input_element, 'click')
var debounce_ms = 100;
var debounced_event = merge(event_a, event_b).debounceTime(debounce_ms);
На этапе устранения неполадок удаляются несколько событий, которые происходят в указанный интервал времени. Если оба события (или более одной копии одного и того же события) происходят менее чем за 100 мс, будет отправлено только одно событие.
Об устранении неисправностей Observables: https://www.learnrxjs.io/operators/filtering/debouncetime.html
В приведенном выше примере используются события, отличные от ваших; просто адаптируйте его для прослушивания любых событий, которые вы хотите. Наконец, подпишитесь на Observable и вызовите соответствующий код обработки событий:
debounced_event.subscribe(() => {
// do event handling things here
});
Чтобы использовать Observables на своей странице, включите куда-нибудь rx.js. Вот пример кода для загрузки его из CDN.
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.1/rxjs.umd.js"></script>