UNPKG

dom-observe

Version:

![npm](https://img.shields.io/npm/v/dom-observe?style=for-the-badge)![npm](https://img.shields.io/npm/dw/dom-observe?style=for-the-badge)![npm](https://img.shields.io/npm/dt/dom-observe?style=for-the-badge) ![node](https://img.shields.io/node/v/dom-observ

118 lines (117 loc) 3.79 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DOMObserver = void 0; const events_1 = require("events"); const delay_me_1 = require("delay-me"); class DOMObserver { /** * @param {SelectorCallback<T>} selector * @param {IDOMObserverInitParameters<T>>} parameters */ constructor(selector, parameters) { this.emitter = new events_1.EventEmitter(); this.observer = null; this._is_active = false; this._parameters = null; this._state = 'disappeared'; this.$elementRef = null; this._parameters = parameters; this.selector = selector; this.observeProcess = this.observeProcess.bind(this); this.onMutationOccurred = this.onMutationOccurred.bind(this); } get isActive() { return this._is_active; } get parameters() { return Object.assign({}, this._parameters); } /** * Starts DOM observation */ start() { if (this._is_active) return; this._is_active = true; this.emit('start'); delay_me_1.setImmediate(this.observeProcess); } /** * Stops DOM observation */ stop() { if (!this._is_active) return; this._is_active = false; this.observer.disconnect(); this.observer = null; this.emit('stop'); } /** * @returns {Promise<void>} * @protected */ async observeProcess() { if (!this._is_active) return; switch (this._state) { case 'appeared': { if (this.$elementRef === null || !document.contains(this.$elementRef)) { this._state = 'disappeared'; if (this.observer !== null) { this.observer.disconnect(); this.observer = null; } const $element = this.$elementRef; this.$elementRef = null; this.emit('disappear', $element); } } break; case 'disappeared': { let $element = this.selector.apply(null, []); if ($element !== null) { this._state = 'appeared'; this.$elementRef = $element; this.emit('appear', $element); if (this.observer !== null) { this.observer.disconnect(); this.observer = null; } if (!this._is_active) return; this.observer = new MutationObserver(this.onMutationOccurred); this.observer.observe(this.$elementRef, this._parameters); } } break; } if (this._is_active) { await delay_me_1.sleep(this.parameters.interval); delay_me_1.setImmediate(this.observeProcess); } } /** * @param {MutationRecord[]} mutations * @protected */ onMutationOccurred(mutations) { if (!this._is_active) return; this.emit('change', this.$elementRef, mutations); } emit(event, ...args) { this.emitter.emit(event, ...args); } on(event, listener) { this.emitter.on(event, listener); return this; } once(event, listener) { this.emitter.once(event, listener); return this; } off(event, listener) { this.emitter.off(event, listener); return this; } } exports.DOMObserver = DOMObserver;