IFRAME

無題


人力検索関連でいろいろ実験したのでメモとして残しておく。


FRAMEやIFRAMEはそれ自体がHTMLを内包するため、documentオブジェクトのコンテナになる。すなわち親となるHTML(documentオブジェクト)の中の独立した別個のdocumentオブジェクトであると認識することができる。


IFRAME内のdocumentオブジェクトには、IFRAMEオブジェクトのdocumentプロパティとしてアクセスできる。IFRAMEのidが"iframe1"だとすると、iframe1.documentでアクセスできる。


ところが、IFRAMEをスクリプトで動的に生成する場合は少し事情が異なっている。

document.write()で生成する場合

  document.write("<iframe id='iframe2' src=''></iframe>");
この場合は、元のHTML内で記述されている場合と同様にiframe2.documentでアクセスできる。

innerHTMLで生成する場合

  div1.innerHTML = "<iframe id='iframe3' src=''></iframe>";
この場合も、document.write()の場合と同じくiframe3.documentでアクセスできる。

document.createElement()で生成する場合

  var iframe4 = document.createElement("IFRAME");
この場合は、生成されたIFRAMEオブジェクトはdocumentオブジェクトを持っていない。
documentプロパティにはNodeオブジェクトが入っているが、このNodeオブジェクトはdocumentオブジェクトではなくDocumentFragmentオブジェクトである。このことは、iframe4.document.nodeTypeで確認できる。documentオブジェクトのnodeTypeはDOCUMENT_NODE(9)であるが、iframe4.document.nodeTypeはDOCUMENT_FRAGMENT_NODE(11)である。
DOMではdocument.createElement()で生成されるオブジェクトについては、tagName、localName、prefix、namespaceURIの4つの属性しか規定していない。そのため、IFRAMEのwindowオブジェクトとしての機能は初期化されていないように見える。
DocumentFragmentオブジェクトは、機能上は単なるNodeオブジェクトに過ぎず、documentオブジェクトとしての機能は持っていないため、iframe4.document.write()のメソッドは使用できない(実行時エラーとなる)。
興味深いのは、iframe4.document.writeは{ [native code] }として定義されているが、実行しようとするとエラーになる点である。厳密には単なるDocumentFragmentオブジェクトではないのかもしれない。Documentオブジェクトでもないのだが。