Re: [w3c/webcomponents] connectedCallback timing when the document parser creates custom elements (#551)

Right ... little variation that uses a `WeakMap` instead and it's also observing children for all occasions

```js
const HTMLParsedElement = (() => {
  const DCL = 'DOMContentLoaded';
  const init = new WeakMap;
  const isParsed = el => {
    do {
      if (el.nextSibling)
        return true;
    } while (el = el.parentNode);
    return false;
  };
  const cleanUp = (el, observer, onDCL) => {
    observer.disconnect();
    el.ownerDocument.removeEventListener(DCL, onDCL);
    init.set(el, true);
    parsedCallback(el);
  };
  const parsedCallback = el => el.parsedCallback();
  return class HTMLParsedElement extends HTMLElement {
    connectedCallback() {
      if ('parsedCallback' in this && !init.has(this)) {
        init.set(this, false);
        if (document.readyState === 'complete' || isParsed(this))
          Promise.resolve(this).then(parsedCallback);
        else {
          const onDCL = () => cleanUp(this, observer, onDCL);
          this.ownerDocument.addEventListener(DCL, onDCL);
          const observer = new MutationObserver((changes) => {
            changes.some(record => {
              if (isParsed(this)) {
                cleanUp(this, observer, onDCL);
                return true;
              }
            });
          });
          observer.observe(this.parentNode, {childList: true, subtree: true});
        }
      }
    }
    get parsed() {
      return init.get(this) === true;
    }
  };
})();
```

I think I'll publish this one to npm.

-- 
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/w3c/webcomponents/issues/551#issuecomment-431312625

Received on Friday, 19 October 2018 10:03:18 UTC