HTML5の新要素をinnerHTMLで生成できないバグを回避する

IE6〜IE8のinnerHTMLには問題が多く、そのひとつに、HTML5の新要素を食わせると悪夢のようなDOMツリーを生成するというものがあります。

var div = document.createElement("div");

div.innerHTML = "<section>section</section>";
document.body.appendChild(div);

上記のコードを実行すると、body以下にはこのような構造ができてしまいます。

<body>
  <div>
    section
    </SECTION>
  </div>
</body>

どうやら、innerHTML に与える文字列を div でラップし、div要素の前に何か一つ以上のダミーの文字列を設定しておき、あとでアンラップすれば上手くいくようです。

http://jsdo.it/uupaa/IEInnerHTMLBug で試せます。

window.onload = function() {
    document.createElement("section"); // HTML5 siv
    
    var div = document.createElement("div");
    
    div.innerHTML = "<section>section</section>";
    
    alert( div.innerHTML ); // "section</SECTION>" in IE6〜IE8
    
    // 対策するには、
    // ダミーの<div>でラップし、あとでdivを除去します
    if (document.uniqueID) { // is IE
    
        var div = document.createElement("div");
        div.innerHTML = "*<div>" +
                        "<section>section</section>" +
                        "</div>";
        alert( "wrapped div.innerHTML = \n" +
                div.innerHTML );
                
        div = div.lastChild; // unwrap                
        alert( "unwraped div.innerHTML = \n" +
                div.innerHTML );
    }
};