たぼさんの部屋

いちょぼとのんびり

WRONG_DOCUMENT_ERR(android標準ブラウザで)

このエラーはnewElementと追加する要素が所属するdocumentが一致しないときに発生するエラーです。

  • ブラウザの実装によって動作が異なります。
  • pc版のブラウザや、android:firefoxですと、appendChildでも動作します。
  • android標準ブラウザではエラーが発生してappendできません。(が、停止もしません)
  • この現象のエラー確認を行うためにはtry,catch(e)でeをアラートさせるようにします。

対処方法

  • 以下のようにinnerHTML , outerHTML を使って要素を追加します。
  • 所属するdocumentを変更する根本的な解決方法があるのかもしれませんが、今はこの対策で行います。
var DOM = parseDOM(xhr.responseText);
var h1 = DOM.getElementsByTagName('h1')[0];
try {
    //既存のdocument.elementにtextから生成したdocument.elementを追加する方法
    /*
     * fragment.appendChild(h1);ではエラーになる(android標準ブラウザにて)
     * WRONG_DOCUMENT_ERR DOM Exeption 4
     * これは、newElementと追加する要素が所属するdocumentが一致しないときに発生するエラーです。
     * [対策]
     * appendChildはできないのでinnerHTML , outerHTMLを使います。
     * outerHTMLを使用するのは、要素そのものも含めて追加したいからです。
     */
    fragment.innerHTML = h1.outerHTML;
} catch(e) {
    alert(e);
}

テキスト形式をDOMに変換するメソッドの内容は既出ですが以下の通り。

var parseDOM = function(text) {
    var htmlDoc;
    htmlDoc = document.implementation.createHTMLDocument('dom');
    //dom でも apfc でも hoge でも動作する
    htmlDoc.documentElement.innerHTML = text;
    return htmlDoc;
};