From 2ef8bb215ae5eb54f5e77dc5b4751a85e1bfb1ba Mon Sep 17 00:00:00 2001 From: SethBurkart123 Date: Sun, 17 Aug 2025 11:02:41 +1000 Subject: [PATCH] perf: improved efficiency of element scanning in eventmanager --- src/seqta/utils/listeners/EventManager.ts | 28 +++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/seqta/utils/listeners/EventManager.ts b/src/seqta/utils/listeners/EventManager.ts index f5a33d61..e37c1d5e 100644 --- a/src/seqta/utils/listeners/EventManager.ts +++ b/src/seqta/utils/listeners/EventManager.ts @@ -57,13 +57,37 @@ class EventManager { return { unregister }; } + private buildSelector(options: EventListenerOptions): string | null { + if (options.textContent || options.customCheck) return null; + + let selector = options.elementType || ""; + if (options.id) { + selector += `#${CSS.escape(options.id)}`; + } + if (options.className) { + selector += `.${CSS.escape(options.className)}`; + } + + return selector.trim() || null; + } + private async scanExistingElements( options: EventListenerOptions, callback: (element: Element) => void, ): Promise { const root = options.parentElement || document.documentElement; - const elements = Array.from(root.getElementsByTagName("*")); - elements.unshift(root); + const selector = this.buildSelector(options); + let elements: Element[] = []; + + if (selector) { + elements = Array.from(root.querySelectorAll(selector)); + if (selector && root.matches && root.matches(selector)) { + elements.unshift(root); + } + } else { + elements = Array.from(root.getElementsByTagName("*")); + elements.unshift(root); + } for (let i = 0; i < elements.length; i += this.chunkSize) { const chunk = elements.slice(i, i + this.chunkSize);