HTML要素の作成2

html要素作成 - Higé au laitを改良

function createHTML(obj,par){
    for(var k in obj) {
        if(typeof obj[k] == 'object' && obj[k].constructor == Object && k == 'children') {
            for(var j in obj[k]){
                var el = document.createElement(j);
                par.appendChild(el);
                createHTML(obj[k][j],el)
            }
        } else if(typeof obj[k] == 'object' && obj[k].constructor == Object && k == 'style') {
            for(var l in obj[k])
                par[k][l] = obj[k][l];
        } else
            par[k] = obj[k];
    }
}

使いかた例

createHTML({
    style : {
        color : 'blue'
    },
    children: {
        a : {
            href : 'http://exanmple.com/',
            style : {
                border : '1px solid #000'
            },
            children : {
                img : {
                    src : 'http://example.com/hoge.png',
                    alt : 'test'
                }
            }
        },
        span : {
            innerHTML : 'hoge'
        }
    }
},document.body);

createHTMLの第一引数で構造をオブジェクトで,第2引数に挿入したい要素。
'children'とするとさらに子要素を作ることができる。バグありそう…。




上のエントリのdel.icio.usへのリンクを表示させるスクリプトをこれを使って書くと

<省略>

        createHTML({
            children : {
                 a : {
                    style : {
                        margin : '0 5px'
                    },
                    href : 'http://del.icio.us/url?v=2&url='+ encodeURIComponent(url),
                    children : {
                         img : {
                             src : 'http://images.del.icio.us/static/img/delicious.gif', 
                             alt : 'del.icio.us',
                             style : {
                                 borderWidth : '0' 
                             }
                         }
                     }
                }
            }
        },foot);

<省略>

修正 19:10

追記 19:20

innerHTMLとchildrenについての注意

正しく動く
        createHTML({
            children : {
                li : {
                    style : {
                        listStyleType : 'none'
                    },
                    innerHTML : time + ' : ',
                    children : {
                        a : {
                            href : items[i]['link'],
                            innerHTML : items[i]['title']
                        }
                    }
                }
            }
        },ul);
正しく動かない
        createHTML({
            children : {
                li : {
                    style : {
                        listStyleType : 'none'
                    },
                    children : {
                        a : {
                            href : items[i]['link'],
                            innerHTML : items[i]['title']
                        }
                    },
                    innerHTML : time + ' : '
                }
            }
        },ul);


childrenをinnerHTMLで上書きしてしまう。

例 - OperaIRC+の更新情報表示スクリプトより