各浏览器下使用 OBJECT 元素和 EMBED 元素嵌入 Flash 存在差异
标准参考
OBJECT 元素定义了一个嵌入的对象。其引入的初衷是取代 IMG 和 APPLET 元素。不过由于安全等各方面原因以及缺乏浏览器支持,这一初衷并未实现。浏览器的对象支持依赖于对象类型。然而,即便是相同的对象类型,各主流浏览器也都 使用了不同的代码来加载。 classid 属性用于指定对象实现的 URI 地址。它可能用来替代或者配合 data 属性,这由引入的对象决定。
codebase 属性指定了一个为 classid、data、archive 属性的相对 URI 提供基本路径。缺省情况下,这个值为当前文档的基本 URI。
type 属性定义被定义在 data 属性中指定的文件中出现的数据的 MIME 类型。
关于 OBJECT 元素及其属性的详细信息,请参考 HTML4.01 规范 13.3 Generic inclusion: the OBJECT element 中的内容。
问题描述
通常情况下,IE 系列浏览器通过 ActiveX 插件使用 OBJECT 元素引入 Flash,而其他浏览器则是通过相应的 NPAPI 插件使用 EMBED 元素。这造成了各浏览器中插入 Flash 的方式的差异。
造成的影响
若仅仅使用 OBJECT 元素设置了 classid 属性引入 Flash,则可能造成在某些浏览器中 Flash 无法被引入。而若嵌套的 OBJECT 和 EMBED 元素参数不统一,也可能造成引入的 Flash 在各浏览器中出现差异。
受影响的浏览器
| 所有浏览器 |
|---|
问题分析
对于 HTML4.01 规范中的 OBJECT 元素,IE 对 classid 属性有自己的解释方式:类标识符(class
identifier)。格式形如:clsid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。由 ActiveX
组件注册在 Windows 的系统注册表中。
codebase 属性则为该类标识符所对应的 ActiveX 插件的 URI 地址。一般是一个 .cab 安装包。(更多请参考 MSDN:CLASSID Attribute | classid Property 及 Class Identifier 中的内容。)
EMBED 元素则是由 NetScape Navigator 2 引入,用于在 HTML
文档中插入符合网景插件应用程序编程接口(NPAPI)规范的插件。NPAPI
插件是跨平台的,并可以在所有实现了此接口规范的浏览器中使用。目前的主流浏览器中 IE 系列以外的浏览器均支持 NPAPI 插件。
事实上 IE3.0 就支持 NPAPI,但是在 IE5.5 SP2 后微软出于安全考虑停止了对 NPAPI 的支持,转而推荐用户使用其 ActiveX 技术作为替代。(更多请参考 MSDN:Netscape 式的插件在升级 Internet Explorer 后不工作)
EMBED 元素拥有一个名为 pluginspage 的属性,其值为 NPAPI 插件的 URL,与 IE 中 OBJECT 元素的 codebase 属性类似,它告诉了浏览器插件的下载地址。
EMBED 元素不属于 HTML4.01 规范中的元素,HTML 文档中直接使用 EMBED 元素可能无法通过 W3C 校验。不过 EMBED 元素目前已经被添加到 HTML5 草案中。(参加 HTML5 草案:4.8.3 The embed element)
至此若需要在 HTML 文档中引入一个已安装的通用的插件,如 Flash,则在 IE 中使用 OBJECT 元素,非 IE 中则使用 EMBED 元素。此外 IE 中也支持 EMBED 元素引入设置了正确 MIME 的插件。
通常,我们会使用类似如下结构的代码引入 Flash:flash.html(SWF 文件来自 Adobe 网站的 Flash 范例)
<object width="200" height="200" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#4,0,0,0">
<param name="src" value="clock.swf" />
<param name="quality" value="high" />
<embed src="clock.swf" type="application/x-shockwave-flash" width="200" height="200" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
</object>
各浏览器中的效果均为:
将 EMBED 元素嵌套在 OBJECT 元素中,在 IE 中会优先使用 OBJECT 元素而忽略 EMBED
元素,在其他浏览器中则优先使用 EMBED 元素而忽略 OBJECT 元素。这样做虽然可以保证在所有浏览器中均能正确加载 Flash,但若
OBJECT 元素与 EMBED 元素的参数设定不统一,则很有可能造成 Flash 在各浏览器中显示效果不一致,甚至是无法正常加载。
关于如何正确地在 HTML 文档中引入 Flash,请参考 Adobe 官方知识库文档:OBJECT and EMBED syntax | Flash 与 Flash OBJECT and EMBED tag attributes中的内容。
下面将分析仅使用一种元素的引入 Flash 的情况下在所有主流浏览器中是否达到一致的效果。(假设浏览器均已正确安装 Flash 所需插件)
1. 使用 OBJECT 元素 classid 属性以及 PARAM 元素:flash_object_classid.html
<div style="border:5px solid black; padding:5px; float:left;">
<object width="200" height="200" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#4,0,0,0">
<param name="src" value="clock.swf" />
<param name="quality" value="high" />
</object>
</div>
这段代码在各浏览器中运行效果如下:
| IE6 IE7 IE8 Chrome Safari | Firefox Opera |
|---|---|
![]() |
![]() |
Firefox 和 Opera 由于不支持 ActiveX 技术所有无法通过 OBJECT 元素及 classid 属性引入 Flash,则此时 OBJECT 元素宽度和高度均为 0。
然
而 Chrome 和 Safari 却正确的加载了 Flash 文件,这是由于 WebKit 内核对 ActiveX
提供了有限的支持,对于比较通用的 ActiveX 插件(如 Flash, Media Player, Director, QuickTime,
RealAudio),浏览器会将它们的在 Windows 系统中的 classid 与其对应的 Mime-Type 相关联,所以可以和 IE
一样仅仅通过 OBJECT 元素的 classid 属性引入这些插件。
2. 使用 OBJECT 元素 type、data 属性:flash_object_type.html
<div style="border:5px solid black; padding:5px; float:left;">
<object width="200" height="200" type="application/x-shockwave-flash" data="clock.swf">
</object>
</div>
这段代码在各浏览器中运行效果如下:
| IE6 IE7 IE8 | Firefox Chrome Safari Opera |
|---|---|
![]() |
![]() |
IE 对 OBJECT 元素的 data 属性设置 Flash 文件 URL 无任何效果。这种方式可以用于非 IE 浏览器。
3. 使用 OBJECT 元素 type、data 属性以及 PARAM 元素:flash_object_all.html
<div style="border:5px solid black; padding:5px; float:left;">
<object width="200" height="200" type="application/x-shockwave-flash" data="clock.swf">
<param name="src" value="clock.swf" />
<param name="quality" value="high" />
</object>
</div>
这种方式仍然仅使用 W3C 规范中标准的 OBJECT 元素,结合了上两个测试样例,使得所有浏览器均可以正常的载入 Flash 文件。
4. 使用 EMBED 元素:flash_embed.html
<div style="border:5px solid black; padding:5px; float:left;">
<embed src="clock.swf" type="application/x-shockwave-flash" width="200" height="200" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer"></embed>
</div>
直接使用 EMBED 元素,所有浏览器均支持。
解决方案
- 若不考虑 W3C 校验,可统一使用 EMBED 元素嵌入 Flash,这样可以避免因参数不统一导致的兼容性问题。
- 若需要考虑 W3C 校验(
Markup Validation Service),则可使用第三种单独使用 OBJECT 与 PARAM 元素的方式。 - 若必须使用 OBJECT 嵌套 EMBED 元素这种混合方式,则要保证 Flash 文件 URL、为 Flash 传递的参数、宽度、高度、wmode 等参数保持统一。
- 可以使用开源的 SWFObject 引入 Flash。(请参见:
)
各浏览器下使用 OBJECT 元素和 EMBED 元素嵌入 Flash 存在差异的更多相关文章
- html5的 embed元素 和 object元素
html5的 embed元素 和 object元素 一.总结 一句话总结: embed定义嵌入的内容,比如插件,比如flash object定义定义一个嵌入的对象,用于包含对象,比如图像.音频.视频. ...
- html5--4-5 embed元素及其他
html5--4-5 embed元素及其他 学习要点 掌握embed元素的使用 了解object元素的使用 温馨提示:关于video和audio的事件方法等涉及都JavaScript知识的内容,暂时不 ...
- IE7浏览器下去除flash动画边框问题
<object width="100%" height="100%" data="/templates/default/swf/guide.sw ...
- 完美解决,浏览器下拉显示网址问题 | 完美解决,使用原生 scroll 写下拉刷新
在 web 开发过程中我们经常遇到,不想让用户下拉看到我的地址,也有时候在 div 中没有惯性滚动,就此也出了 iScroll 这种关于滚动条的框架,但是就为了一个体验去使用一个框架好像又不值得,今天 ...
- Javascript JQuery获取当前元素的兄弟元素/上一个/下一个元素(转)
var chils= s.childNodes; //得到s的全部子节点 var par=s.parentNode; //得到s的父节点 var ns=s.nextSbiling; //获得s的下一个 ...
- 解决文件上传插件Uploadify在火狐浏览器下,Session丢失的问题
因为在火狐浏览器下Flash发送的请求不会带有cookie,所以导致后台的session失效. 解决的方法就是手动传递SessionID到后台. $("#fileresultfiles&qu ...
- IE浏览器下常见的CSS兼容问题
目录 [1]宽高bug [2]边框bug [3]盒模型bug[4]列表项bug [5]浮动bug [6]定位bug [7]表单bug 宽高bug [1]IE6-浏览器下子元素能撑开父级设置好的宽高 & ...
- <select>在chrome浏览器下背景透明问题
在上篇文章<只用CSS美化选择框>运用了背景透明的技巧来美化选择框,但在chrome浏览器下遇到了跟ie.ff不一样的透明效果,下面重现一下: 在一个大的div(背景红色)内放置一个sel ...
- IE7浏览器下CSS属性选择器二三事
一.为何专门说起IE7 以前,或者说数年前,我们从事桌面端网页开发的时候,基本上都还要兼顾IE6浏览器, 即使有些特性,IE7支持,我们也会忽略之.于是,我们会不自然地把IE6和IE7浏览器归为一路货 ...
随机推荐
- JAVA8给我带了什么——Optional和CompletableFuture
不管是JAVA,还是.NET.我们常常会看到空异常(NullPointerException).这种异常都是在运行的过程中出现.往往是变量是一个null值.但是你引用这个变量的后继字段或是方法.所以我 ...
- 【洛谷P3792】由乃与大母神原型和偶像崇拜
题目大意:维护一个序列,支持单点修改和查询一段区间能不能组成连续的一段数. 题解:查询区间能不能组成一段连续的数这个操作较为复杂,很难在较小时间复杂度内直接维护.这里采用线段树维护区间哈希的策略,即: ...
- JAVA过滤器的使用(Filter)
request.setCharacterEncoding("utf-8"); response.setContentType("text/html;charset=utf ...
- JAVA注释的另一种神奇用法
每个JAVA程序员在写程序的时候一定都会用到注释,本篇博客不是讲怎么定义注释,而是说明注释神奇的一种写法. /** * 这是一个测试类 */ public class Test { /** * 程序的 ...
- http和https的作用与区别
PS: https就是http和TCP之间有一层SSL层,这一层的实际作用是防止钓鱼和加密.防止钓鱼通过网站的证书,网站必须有CA证书,证书类似于一个解密的签名.另外是加密,加密需要一个密钥交换算法, ...
- 关于jqGrid中GridUnload方法的困惑
首先 GridUnload 这个方法在 4.7.1 + 的版本中已经删除,直接把4.7.1中的grid.common.js合来用就行. GridUnload 这个方法是直接删除原来的table,重新生 ...
- windows 下mysql 重设root密码方法
1.首先在命令行里关闭mysql服务 net stop mysql2.在命令行里进入mysql安装目录下bin目录,以不检查权限的方式启动:mysqld-nt --skip-grant-tables ...
- grafana-zabbix部署和使用
grafana-zabbix安装 官网安装介绍地址:https://grafana.com/plugins/alexanderzobnin-zabbix-app/installation 下载地址:h ...
- excel自动化翻译2
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- Catfish CMS漏洞集合
转自https://larryxi.github.io/ 0x00 背景 版本:V 4.2.35 官网下载:http://www.catfish-cms.com/page/4.html 文章内容仅作学 ...


