HTMLElement.prototype でObject.definePropertyを使用して、必要な要素をvoidとして扱う独自の innerHTML 実装で innerHTML セッターとゲッターをオーバーライドする必要があります。innerHTML と HTML パーサーがデフォルトでどのように実装されているかについては、こちらを参照してください。
ただし、たとえば HTMLElement.prototype で HTMLDivElement にフィルターダウンするものを定義する場合、Firefox は継承が苦手であることに注意してください。ただし、Opera では問題なく動作するはずです。
つまり、どの要素が void であるかは、HTML パーサーに依存します。パーサーはこのリストに従い、innerHTML はほとんど同じ規則を使用します。
つまり、JS で独自の innerHTML 実装を作成したくない場合は、おそらくこれを忘れてください。
ただし、ライブ DOM ビューアを使用して、特定のマークアップがどのように解析されるかを他の人に示すことができます。おそらく、同じ終了タグが開いている要素を暗黙的に閉じることに気付くでしょう。
ここには、void 要素リストを使用する時代遅れの innerHTML ゲッター (セッターではありません) コードがあります。それはあなたにいくつかのアイデアを与えるかもしれません。ただし、setter の実装を作成するのはより難しい場合があります。
一方、innerHTML の代わりに createElement() や appendChild() などを使用する場合は、これを気にする必要はなく、ネイティブの innerHTML ゲッターが不明な要素を終了タグ付きで出力します。
ただし、不明な要素を xml として扱い、XMLSerializer() と DOMParser() を使用して処理を行うことができます。
var x = document.createElement("test");
var serializer = new XMLSerializer();
alert(serializer.serializeToString(x));
var parser = new DOMParser();
var doc = parser.parseFromString("<test/>", "application/xml");
var div = document.createElement("div");
div.appendChild(document.importNode(doc.documentElement, true));
alert(serializer.serializeToString(div));
それはまさにあなたが望むものではありませんが、あなたが遊ぶことができるものです. (Firefox の代わりに Opera でテストして、xmlns 属性の違いを確認してください。また、Chrome は Opera や Firefox のようには機能しないことに注意してください。)