DOM APIを使いません?
DOM APIを使いません?:
reactやvueなどフレームワークでのdom構築が主なこの頃ですが、小規模のプロジェクトの場合、標準仕様を活用することで簡素に仕上げることが可能です。
domは入れ子になることがほとんどです。標準で入れ子の表現をしようとすると、大変なので、ラッパーを作ります。
後は、標準仕様で書けばおk
サンプルとして、イベントなども加えたリストを作ります。
上記の出力は下記です。
非同期にしなくても良いかも。。。
reactやvueなどフレームワークでのdom構築が主なこの頃ですが、小規模のプロジェクトの場合、標準仕様を活用することで簡素に仕上げることが可能です。
再帰的なcreateElementを考える
domは入れ子になることがほとんどです。標準で入れ子の表現をしようとすると、大変なので、ラッパーを作ります。const mergeAttr = (target, attr) => { for (const k of Object.keys(attr)) { if(attr[k] instanceof HTMLElement) target.appendChild(attr[k]); else if(k === 'innerHTML' && attr[k] instanceof Array) mergeAttr(target, attr[k]); else target[k] = attr[k]; } } const createElement = (tagName, attr) => { const target = document.createElement(tagName); attr && mergeAttr(target, attr); return target; }
サンプル
後は、標準仕様で書けばおkサンプルとして、イベントなども加えたリストを作ります。
const listElement = async() => { const ul = createElement('ul', { className: 'list', innerHTML: [ createElement('li', { innerHTML: 'default item' }), createElement('li', { innerHTML: 'default item' }) ], onclick: e => console.log('click event'), add: text => { ul.appendChild(createElement('li', { innerHTML: text })); } }); return ul; } //実行 (async() => { const list = await listElement(); list.add('add item'); console.log(list.outerHTML); })()
//<ul class="list"><li>default item</li><li>default item</li><li>add item</li></ul>
documentへの挿入
const outElement = (element) => { const currentScript = document.currentScript; (async() => { currentScript.parentNode.insertBefore(await element(), currentScript); })() }
<script>outElement(listElement)</script>
チャットもどきを作ってみる
const formElement = async(listElement) => { let input; return createElement('form', { onsubmit: () => { listElement.add(input.value); input.value = ''; return false; }, innerHTML: [ input = createElement('input'), createElement('input', { type: 'submit', value: 'send' }) ] }); } const chatElement = async() => { const list = await listElement(); const form = await formElement(list); return createElement('div', { innerHTML: [list, form] }) }
<script>outElement(chatElement)</script>
コメント
コメントを投稿