- From: Valery Zinchenko <notifications@github.com>
- Date: Sat, 22 Feb 2025 07:15:44 -0800
- To: whatwg/dom <dom@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <whatwg/dom/issues/533/2676255894@github.com>
FrameMuse left a comment (whatwg/dom#533)
## Use case
I guess the main use case would be removing subscriptions. In my case, I have a (library based) "component" that saves reference to a constructed element, the component must support callbacks for engaging scripts when the element is connected and pause/suspend those scripts when it's disconnected.
In reality, it's a bit more complex since an element may not be disconnected while actually not being in the document. So it should take into account connection/disconnection **from a document** (either parents or the element itself is connected/disconnected).
For accurate work, when https://github.com/whatwg/dom/issues/1255 is implemented, the **document** connection events should fire or they should be accounted by a developer.
## Implementation Proposal
I see it as a separate `NodeLifeObserver` class, based on `MutationObserver`, `IntersectionObserver` signature. Though this also might be worth adding dispatched events (`addEventListener`).
```ts
type NodeLifeEntryCase =
| "connected"
| "disconnected"
| "parentChanged"
| "parentConnected"
| "parentDisconnected"
| "documentConnected"
| "documentDisconnected"
interface NodeLifeEntry {
target: Node
case: NodeLifeEntryCase
}
class NodeLifeObserver {
constructor(callback: (entry: NodeLifeEntry[]) => void) { }
observe(node: Node): void
unobserve(node: Node): void
disconnect(): void
}
```
Additionally I need the moment when is reflowed since connection/disconnection may change the size, but you need to use this recalculated value. So I expect that e.g. `connected` event would occur **before** [relow](reflow - MDN Web Docs Glossary: Definitions of Web-related terms | MDN) and when it does occur, it would trigger additional `reflowed` event.
With this I come up with the following code that extends `NodeLifeObserver` for `Element`.
```ts
type ElementLifeEntryCase =
| NodeLifeEntryCase
| "reflow"
interface ElementLifeEntry {
target: Element
case: ElementLifeEntryCase
}
class ElementLifeObserver {
constructor(callback: (entry: ElementLifeEntry[]) => void) { }
observe(element: Element): void
unobserve(element: Element): void
disconnect(): void
}
```
--
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/dom/issues/533#issuecomment-2676255894
You are receiving this because you are subscribed to this thread.
Message ID: <whatwg/dom/issues/533/2676255894@github.com>
Received on Saturday, 22 February 2025 15:15:48 UTC