在 object 标签中没有 classid 的情况下,YouTube 嵌入如何工作?

Posted

技术标签:

【中文标题】在 object 标签中没有 classid 的情况下,YouTube 嵌入如何工作?【英文标题】:How does YouTube embedding work without a classid in the object tag? 【发布时间】:2011-04-02 13:55:17 【问题描述】:

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

<object  >
  <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" 
          
         >
  </embed>
</object>

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

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

IE 在没有其他信息的情况下假定 Flash 嵌入 或者,IE从&lt;embed&gt;标签读取这个信息

我找不到验证任一选项的文档。我很好奇!

编辑:找到great comparison of Flash embedding techniques here。不过还是想知道它是如何工作的……

【问题讨论】:

【参考方案1】:

我试验了一下,发现去掉&lt;embed&gt;标签会导致IE无法嵌入视频。我很惊讶 IE 使用了 embed 标签,因此深入研究。如果您只想知道答案,请向下滚动最后的“摘要”!

在 IE8 中工作的最简单的事情是这样的:

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

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

当然,如果&lt;object&gt; 标签确实 包含classid,&lt;embed&gt; 将被忽略,这是您所期望的。我通过让嵌入标签引用另一个视频来验证这一点

<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"
         
         >
  </embed>

</OBJECT>

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

从上次测试中删除 classid,您将在 &lt;embed&gt; 标记中获得替代视频。 这让我想知道,如果它们只是在 YouTube 样式的嵌入中被忽略,为什么还有任何 &lt;param&gt; 标签。

总结

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

【讨论】:

【参考方案2】:

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

【讨论】:

我意识到它可能是 MIME 类型,但是只有如果 IE 正在查看 &lt;embed&gt; 标记,该信息才可用,这令人惊讶。 IE 的实现一直很不稳定。 事实证明,这完全是设计使然。请参阅我的答案中指向“对象后备”的链接。 您是说 IE 仅在具有 classid 的情况下使用 object,否则它会失败,并呈现里面的内容(通常是 embed,这也是非标准的)。这是不正确的实现。 object 应该会根据 MIME 自动判断插件。 是的,但在这种情况下,对象不能 - 它没有被赋予数据属性,因此没有任何东西可以获取和分析。

以上是关于在 object 标签中没有 classid 的情况下,YouTube 嵌入如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

在HTML语言中object标签有啥作用??

请问html标签中,object标签有啥用

线性结构中元素之间存在一对一关系,树形结构中元素之间存在啥关系

调用ocx ActiveX控件详解(做一个简单的ocx控件)

Object

javaWEB项目中JSP页面使用<object>标签中的属性basecode加载cab文件,打开页面后无法自动下载cab