- From: Cyril Auburtin <notifications@github.com>
- Date: Thu, 11 Aug 2016 17:24:50 -0700
- To: whatwg/dom <dom@noreply.github.com>
- Message-ID: <whatwg/dom/issues/150/239332156@github.com>
I saw your implementation, here's a short one that does Domenic's example: ``` function h(s, ...o){ // strings parts (length n) and object variables (length n-1) let html = ''; //let's stupidly concatenate for the moment for (let i=0; i<o.length; i++){ if (typeof o[i]==='function'){// an event listener html += s[i]; } else if (Array.isArray(o[i]) || o[i] instanceof Element) { // children html += s[i]+`<!--c${i}-->`; } else { html += s[i]+o[i]; } } const el = new Range().createContextualFragment(html+s[s.length-1]).firstElementChild; // recover all listeners placeholder and childrens, they should be in same order (tree-order) const nodes = [el].concat(...el.querySelectorAll('*')); const comments = [].concat(...nodes.map(i=>Array.prototype.filter.call(i.childNodes, c=>c.nodeType==8))); const listeners = [].concat(...nodes.map(i=>Array.prototype.filter.call(i.attributes, a=>a.name.startsWith('on')))); for (let i=0; i<o.length; i++){ if (typeof o[i]==='function'){ // listeners const a = listeners.shift(); a.ownerElement.addEventListener(a.name.slice(2), o[i]); a.ownerElement.removeAttribute(a.name); } else if(Array.isArray(o[i]) || o[i] instanceof Element) { // children const c = comments.shift(); c.parentNode.replaceChild(Array.isArray(o[i])?frag(o[i]):o[i], c); } } return el; } function frag(a){ const f=new DocumentFragment(); a.forEach(el => f.appendChild(el)); return f; } h`<ul class="something">${[{text:'lk'}].map(({text}) => h` <li onclick=${e=>console.log('li',text)}> ${text} <span onclick=${e=>console.log('x')}>✕</span> </li>`)} </ul>` ``` -- You are receiving this because you are subscribed to this thread. Reply to this email directly or view it on GitHub: https://github.com/whatwg/dom/issues/150#issuecomment-239332156
Received on Friday, 12 August 2016 00:25:18 UTC