element-notifier

April 27, 2026 ยท View on GitHub

A MutationObserver dis/connected helper.

import { notify } from 'element-notifier';

const observer = notify(
  // callback that receives any connected/disconnected element
  (element, connected) => {
    if (connected)
      console.log(element, 'has been connected');
    else
      console.log(element, 'has been disconnected');
  },

  // optional arguments
  document,         // the root element to observe
  MutationObserver  // a MutationObserver (non DOM envs)
);

The observer is a regular MutationObserver instance with a self bound, and instrumented, .observe(node) method to observe mutations within fragments too (example: shadowRoot nodes).

Why?

The MutationObserver dance with records is easily error prone:

  • records are triggered lazily in a bizarre order
  • records are related to single containers, but inner elements are not notified
  • it's difficult to ensure that within a MutationObserver callback, all elements, in the right order of events, get passed along uniquely per event

This helper does just this: it passes to the callback every element that has been added, or removed, from the document.

About ShadowDOM

While the observer could crawl nodes within a shadowRoot, in case it's opened, if nodes are removed from it nothing is notified due MutationObserver limitations.

If observing nodes appended or removed from any shadowRoot is desired, use shadow-observer:

import { ShadowObserver, OPEN, CLOSED } from 'shadow-observer';
import { notify } from 'element-notifier';

// augmented method with right options included
const { observe } = notify(
  (node, connected) => { ... },
  document,
  ShadowObserver,
);