UNPKG

emerj

Version:

A tiny JavaScript library to render live HTML/DOM updates efficiently and non-destructively

2 lines (1 loc) 1.17 kB
export default{attrs:function(e){for(var t={},n=0;n<e.attributes.length;n++){var i=e.attributes[n];t[i.name]=i.value}return t},nodesByKey:function(e,t){for(var n={},i=0;i<e.childNodes.length;i++){var r=t(e.childNodes[i]);r&&(n[r]=e.childNodes[i])}return n},merge:function(e,t,n){if((n=n||{}).key=n.key||function(e){return e.id},"string"==typeof t){var i=t;(t=document.createElement(e.tagName)).innerHTML=i}var r,o={old:this.nodesByKey(e,n.key),new:this.nodesByKey(t,n.key)};for(r=0;t.firstChild;r++){var d=t.removeChild(t.firstChild);if(r>=e.childNodes.length)e.appendChild(d);else{var a=e.childNodes[r],s=n.key(d);if(n.key(a)||s){var l=s&&s in o.old?o.old[s]:d;l!==a&&(a=e.insertBefore(l,a))}if(a.nodeType!==d.nodeType||a.tagName!==d.tagName)e.replaceChild(d,a);else if([Node.TEXT_NODE,Node.COMMENT_NODE].indexOf(a.nodeType)>=0){if(a.textContent===d.textContent)continue;a.textContent=d.textContent}else if(a!==d){var f={base:this.attrs(a),new:this.attrs(d)};for(var h in f.base)h in f.new||a.removeAttribute(h);for(var v in f.new)v in f.base&&f.base[v]===f.new[v]||a.setAttribute(v,f.new[v]);this.merge(a,d)}}}for(;e.childNodes.length>r;)e.removeChild(e.lastChild)}};