Objectタグのアホ仕様?
objectタグにはネストの機能があります。
どういう機能かというと、まずは以下を見てください。
<OBJECT data="./for.mpg" type="video/mpeg"> <OBJECT data="./bar.jpg" type="image/jpeg"> ダメです何も表示できません。 </OBJECT> </OBJECT>
- 一番外側の、mpegが表示できればmpegだけを表示。
- もしもmpegが表示できなければ、次の外側にあるjpgを変わりに表示。
- それもダメなら、仕方なく一番深いところにある文字列を表示。
つまり、外側から順番に評価され、表示が可能な時点で表示し、以下は無視するという仕様です。
がしかし!
Gifやjpeg等ではネストできるのですが、MediaPlayerやRealPlayerでネストすると、どうしても両方表示されてしまいます。
※RealPlayerが入っていると両方表示されてしまう。だめだこりゃ。 <object classid="CLSID:CFCDAA03-8BE4-11CF-B84B-0020AFBBCCFA"> <OBJECT CLASSID="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" > </object> </object>
- RealPlayerが有ればそのままRealPlayerで再生。WindowsMediaPlayerは無視。
- 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"> </OBJECT> </DIV> </BODY> </HTML>
- RealPlayerがインストールされている場合、RealPlayerが起動
- RealPlayerがインストールされていない時、エラーになり、WindowsMediaPlayerを起動するObjectタグを挿入。
かなり強引ですが、これでなんとか希望通りの動作を実現できました。できれば次のバージョンで、この腐った仕様を治して欲しいものです。