YouTube如何在对象标记中没有classid的情况下嵌入工作?

时间:2010-08-23 10:29:55

标签: flash activex youtube embed

从YouTube嵌入功能获得的典型代码片段如下所示:

<object width="660" height="405">
  <param name="movie" value="http://www.youtube.com/v/NWHfY_lvKIQ?fs=1&amp;hl=en_GB&amp;border=1"></param>
  <param name="allowFullScreen" value="true"></param>
  <param name="allowscriptaccess" value="always"></param>
  <embed src="http://www.youtube.com/v/NWHfY_lvKIQ?fs=1&amp;hl=en_GB&amp;border=1"
         type="application/x-shockwave-flash" 
         allowscriptaccess="always" 
         allowfullscreen="true" 
         width="660" 
         height="405">
  </embed>
</object>

现在,<embed>元素有一个type属性告诉浏览器它正在嵌入一个flash文件,但对于使用<object>标记的浏览器,似乎没有可用的信息给浏览器!

为什么此处不需要classid or codebase属性?我能想到的唯一选择是:

  • IE假定在没有其他信息的情况下嵌入Flash
  • 或,IE从<embed>标记
  • 中读取此信息

我找不到文档来验证这两个选项。而且我很好奇!

编辑:发现great comparison of Flash embedding techniques here。仍然想知道它是如何工作的......

2 个答案:

答案 0 :(得分:5)

我进行了一些实验,发现删除<embed>标记会导致IE无法嵌入视频。我很惊讶IE使用了嵌入式标签,所以深入研究。如果您只是想知道答案,请在结尾处向下滚动“摘要”!

在IE8中最简单的方法是:

<embed src="http://www.youtube.com/v/NWHfY_lvKIQ?fs=1&amp;hl=en_GB&amp;border=1"
         width="660"
         height="405">
 </embed>

那里没有类型属性,因此浏览器必须检查src属性的MIME类型以确定要执行的操作。我通过提供具有不同MIME类型的Flash文件来验证这一点 - 除非我提供了application / x-shockwave-flash的类型属性(IE here已记录此行为),否则它不会播放

当然,如果<object>标记 包含classid,<embed>将被忽略,这是您所期望的。我通过让embed标签引用另一个视频来验证这一点

<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" WIDTH="660" HEIGHT="405" id="adobeWay">
<PARAM NAME=movie VALUE="http://www.youtube.com/v/NWHfY_lvKIQ?fs=1&amp;hl=en_GB&amp;border=1">
<PARAM NAME=quality VALUE=high>
<PARAM NAME=bgcolor VALUE=#FFFFFF>

<embed src="http://youtube.com/v/rIFh1ydXWmg"
         type="application/x-shockwave-flash"
         allowscriptaccess="always"
         allowfullscreen="true"
         width="660"
         height="405">
  </embed>

</OBJECT>

使用object标签时,Flash插件并不关心电影的MIME类型。同样,我通过提供具有不同MIME类型的有效SWF文件来验证这一点。

从上一次测试中移除classid,您将在<embed>标记中获得替代视频。 这让我想知道为什么在YouTube风格的嵌入中忽略它们时会有任何<param>标签。

摘要

如果classid中没有<object>属性(或任何其他确定所需插件的方式,如数据属性),IE会在对象标记内呈现任何内容,这意味着它将呈现<embed>标记(IE称为object fallback)。如果该标记不包含type属性,则src的MIME类型用于确定要使用的正确插件。

答案 1 :(得分:0)

这是MIME类型。这是由服务器发送的,以帮助浏览器识别内容的类型。 MIME类型与帮助程序插件相关联。