@elibrary-inno/bookreader
Version:
The Internet Archive BookReader.
44 lines (37 loc) • 1.22 kB
JavaScript
// @ts-check
export class SelectionObserver {
selecting = false;
startedInSelector = false;
/** @type {HTMLElement} */
target = null;
/**
* @param {string} selector
* @param {function('started' | 'cleared', HTMLElement): any} handler
*/
constructor(selector, handler) {
this.selector = selector;
this.handler = handler;
}
attach() {
// We can't just use selectstart, because safari on iOS just
// randomly decides when to fire it 😤
// document.addEventListener("selectstart", this._onSelectStart);
// This has to be on document :/
document.addEventListener("selectionchange", this._onSelectionChange);
}
detach() {
document.removeEventListener("selectionchange", this._onSelectionChange);
}
_onSelectionChange = () => {
const sel = window.getSelection();
if (!this.selecting && sel.toString()) {
this.selecting = true;
this.target = $(sel.anchorNode).closest(this.selector)[0];
this.handler('started', this.target);
}
if (this.selecting && (sel.isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {
this.selecting = false;
this.handler('cleared', this.target);
}
};
}