mirror of
https://github.com/keymanapp/keyman.git
synced 2026-08-06 08:55:34 +00:00
44 lines
No EOL
1.5 KiB
TypeScript
44 lines
No EOL
1.5 KiB
TypeScript
namespace com.keyman.osk.embedded {
|
|
export class SingleInputCapture {
|
|
private readonly handler: (event: TouchEvent) => boolean;
|
|
private readonly baseElement: HTMLElement;
|
|
|
|
private static readonly eventOptionConfig: AddEventListenerOptions = {
|
|
capture: true,
|
|
// While other
|
|
once: true,
|
|
passive: false,
|
|
// While `abort` exists, it's too new to rely upon it for some of the older platforms we support.
|
|
|
|
};
|
|
|
|
constructor(element: HTMLElement, preventPropagation: boolean, captureCallback: () => void) {
|
|
this.baseElement = element;
|
|
|
|
this.handler = (event) => {
|
|
captureCallback();
|
|
if(preventPropagation) {
|
|
event.stopPropagation();
|
|
event.stopImmediatePropagation();
|
|
}
|
|
|
|
// Make extra-sure this is only called once; older versions of Chrome for Android don't support
|
|
// the advanced options configuration that we prefer by default!
|
|
this.cancel();
|
|
|
|
return !preventPropagation;
|
|
}
|
|
|
|
try {
|
|
// Not available in Android Chrome until version 49. `capture`: 52, `once`: 55, `passive`: 51.
|
|
this.baseElement.addEventListener('touchstart', this.handler, SingleInputCapture.eventOptionConfig);
|
|
} catch (err) {
|
|
this.baseElement.addEventListener('touchstart', this.handler, false);
|
|
}
|
|
}
|
|
|
|
cancel() {
|
|
this.baseElement.removeEventListener('touchstart', this.handler, SingleInputCapture.eventOptionConfig.capture);
|
|
}
|
|
}
|
|
} |