braintag

公開してしまう備忘録

Objectタグのアホ仕様?


objectタグにはネストの機能があります。

どういう機能かというと、まずは以下を見てください。

  <OBJECT data="./for.mpg" type="video/mpeg">
   <OBJECT data="./bar.jpg" type="image/jpeg">
	ダメです何も表示できません。
   </OBJECT>
  </OBJECT>



  1. 一番外側の、mpegが表示できればmpegだけを表示。
  2. もしもmpegが表示できなければ、次の外側にあるjpgを変わりに表示。
  3. それもダメなら、仕方なく一番深いところにある文字列を表示。

つまり、外側から順番に評価され、表示が可能な時点で表示し、以下は無視するという仕様です。


がしかし!

Gifやjpeg等ではネストできるのですが、MediaPlayerやRealPlayerでネストすると、どうしても両方表示されてしまいます。

※RealPlayerが入っていると両方表示されてしまう。だめだこりゃ。
<object classid="CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA">
<OBJECT CLASSID="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" >
</object>
</object>


  1. RealPlayerが有ればそのままRealPlayerで再生。WindowsMediaPlayerは無視。
  2. RealPlayerがインストールされて無ければWindowsMediaPlayerで再生。

というのが仕様に沿った動作であるはずですが、両方インストールされている場合、1.の時点でRealPlayerとMediaPlayerが両方とも表示されてしまいます。jpegやmpegとは違い、何故かネストが効いてません。

なんなんでしょうかこの仕様。これで一日悩みました。




いい代替方法は無いか、なんとか実現できないのかとお思いのあなたに。

なんとobjectタグは表示できない場合にエラーを返してくれるのです。これはありがたい仕様ですよね。

そのエラーを使ってDHTMLを使い動的にページを生成すればよいのです。

以下がその実現方法。

<html>
<HEAD>
<SCRIPT LANGUAGE="JavaScript1.2">
<!--
function error(){
	html = '';
	html = html + '<OBJECT CLASSID="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95">';
	html = html + '</OBJECT>';
	document.all['ACTIVEX'].insertAdjacentHTML('beforeEnd', html);
}
-->
</SCRIPT>
</HEAD>
<BODY>
<DIV ID=ACTIVEX>
<OBJECT  onError="error()"  classid="CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA">
&nbsp; 
</OBJECT>
</DIV>
</BODY>
</HTML> 



  1. RealPlayerがインストールされている場合、RealPlayerが起動
  2. RealPlayerがインストールされていない時、エラーになり、WindowsMediaPlayerを起動するObjectタグを挿入。

かなり強引ですが、これでなんとか希望通りの動作を実現できました。できれば次のバージョンで、この腐った仕様を治して欲しいものです。