オブジェクト要素のフォールバックが DOM に適用される

.NET Framework 3.0

object 要素にフォールバック コンテンツ (通常は embed 要素) が含まれている場合、Windows Internet Explorer 9 は、このコンテンツを解析し、ドキュメント オブジェクト モデル (DOM) に追加するようになりましたが、以前のバージョンの Windows Internet Explorer はこれを行いませんでした。 この動作の変更により、Internet Explorer 9 はこのような要素の処理に関して標準への準拠性と相互運用性が向上しました。

この結果、object 要素の名前属性とフォールバック要素に同じ名前を使っている場合、window["myName"] は、"myName" という名前を持つすべての要素を含む集合を返すようになりました。 Internet Explorer が集合ではなく 1 つの要素 (通常は object 要素) を返すことを前提としているページでは、返された値のメソッドやプロパティにアクセスしたときに例外が発生する可能性があります。

object 要素の名前属性とフォールバック コンテンツに同じ名前を使っている場合、window["myPlugin"] を使ってインスタンス化されたプラグインへの参照を取得しようとすると、複数の要素が返されます。以前のバージョンの Internet Explorer では object 要素のみが返されていました。

たとえば、次のスクリプトとマークアップについて考えてみます。

マークアップ


<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" name="myPlugin" 
codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab">
  <param name="movie" value="myflash.swf" />
  <embed src="myflash.swf" name="myPlugin" type="application/x-shockwave-flash"
    pluginspage="http://www.adobe.com/go/getflashplayer"></embed>
</object>

JavaScript


plugin = window["myPlugin"]; //the OBJECT element in IE8, a collection of the OBJECT and 
EMBED elements in IE9
plugin.style.display = "none";  //Causes an exception in IE9: "SCRIPT5007: Unable to set 
value of the property ‘display’: object is null or undefined"

Windows Internet Explorer 8 では、window["myPlugin"] は object 要素だけを返します (Internet Explorer 8 は DOM にフォールバック コンテンツを含めないため)。

Internet Explorer 9 では、embed 要素が DOM に含まれるため、window["myPlugin"] が object 要素と embed 要素の両方を含む集合を返します。この動作は、他のブラウザーとの相互運用性があり、標準に準拠しています。

インスタンス化されたプラグインが必要な場合は、window["myPlugin"] ではなく document["myPlugin"] を使います。親がインスタンス化されている場合、document["myPlugin"] はフォールバック要素とは一致しません。


plugin = document["myPlugin"]; //the instantiated plugin: OBJECT element in IE, 
EMBED element in browsers which use the Netscape plugin model

追加情報:

Internet Explorer 9 プレリリース版では、上の例の場合、document["myPlugin"] は embed 要素を返し、window["myPlugin"] は object 要素と embed の要素の両方を含む HTML コレクションを返しました。

しかし、次のようなコーディング パターンは多くのサイトでよく使われています。


if(document["myPlugin"]) {
     plugin = document["myPlugin"]; //expected to be the object element in Internet Explorer and embed element in other browsers
}

サイトの互換性維持を支援する目的で、Internet Explorer 9 では document["myName"] の動作が改善されました。 プラグインの読み込みが成功すると、インスタンス化されたプラグインが返されます (上の例では、object 要素)。これは、Internet Explorer 8 が返したものと実質的に一致しますが、フォールバック コンテンツについての標準に準拠した解析も実現しています。 この動作により、上のコーディング パターンは、すべての主要なブラウザーで相互運用可能です。

window["myName"] は、Internet Explorer 9 のプレリリース版から変更されないまま残っていますが、インスタンス化された要素以外との一致も必要な場合にのみ使います。次の表では、これらの API が Internet Explorer 9 でどのように機能するかについて説明しています。

window["xyz"] が返す要素document["xyz"] が返す要素
  • "xyz" という name または id を持ち、表示されている embed または object 要素 or
  • "xyz" という name または id を持ち、表示されている親オブジェクトを持たない、embed またはフォールバックがない object 要素 or
  • "xyz" という name または id を持ち、表示されているか、表示されている親を持たない object 要素 or
  • "xyz" という name を持つ appletformiframeimg 要素 or
  • "xyz" という id を持つ applet 要素 or
  • "xyz" という id を持ち、name コンテンツ属性も持つ img 要素

 

object 要素は、object または embed 子孫を持たない場合、フォールバックがないと言われます。

関連トピック

 

 

表示:
© 2014 Microsoft