HTMLDocumentのcreatRangeとXMLDocumentのcreateRange

ちょいとハマったのでメモ。

var str = "<p>hoge<br>hoge</p>";
var range = document.createRange();
var fragment = range.createContextualFragment(str);

通常のHTML内のJavaScriptなら上手くいくが、XML内のJavaScriptだと、パースエラーが起こる。<br>がパース出来ないからだ。

Firefoxchrome特権下のJavaScriptXMLHttpRequestのresponseTextで得たHTMLテキストをパースしようとしてハマったのだ。仕方なく、

var range = window.content.document.createRange();

とブラウザ内のHTMLDocumentを使用してRangeオブジェクトを生成することで解決した。
考えてみれば、RangeオブジェクトのcreateContextualFragmentがHTMLDocumentから生成されたかXMLDocumentから生成されたかで挙動が違うのはまぁ当然だわなぁ。