uconnect
Version:
An essential connected/disconnected DOM helper
2 lines (1 loc) • 1.02 kB
JavaScript
self.uconnect=function(e){"use strict";function t(e){this.observe(e,{subtree:!0,childList:!0})}function n(e){e.type in this&&this[e.type](e)}return e.observe=(e,c,o,d)=>{const s=new WeakMap,a=new WeakMap,i=new WeakMap,r=e=>s.has(e),l=e=>{r(e)&&(h(e,e.removeEventListener,s.get(e)),s.delete(e))},h=(e,t,n)=>{t.call(e,"disconnected",n),t.call(e,"connected",n)},u=(e,t,n,c)=>{for(let{length:o}=e,d=0;d<o;d++)v(e[d],t,n,c)},v=(e,t,n,d)=>{r(e)&&!n.has(e)&&(d.delete(e),n.set(e,0),e.dispatchEvent(new(o||CustomEvent)(t))),u(e[c||"children"]||[],t,n,d)},p=new(d||MutationObserver)((e=>{for(let{length:t}=e,n=0;n<t;n++){const{removedNodes:t,addedNodes:c}=e[n];u(t,"disconnected",i,a),u(c,"connected",a,i)}}));p.add=t,p.add(e||document);const{attachShadow:E}=Element.prototype;return E&&(Element.prototype.attachShadow=function(e){const t=E.call(this,e);return p.add(t),t}),{has:r,connect:(e,t)=>{l(e),(t||(t={})).handleEvent||(t.handleEvent=n),h(e,e.addEventListener,t),s.set(e,t)},disconnect:l,kill(){p.disconnect()}}},e}({});