打印

BT9024: IE 中可以使用 classid 与 codebase 属性结合完成下载、安装和使用 ActiveX 插件

作者:陆远

标准参考

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 中可以使用 classid 与 codebase 属性结合完成下载、安装和使用 ActiveX 插件。

而即使使用了在 Chrome 与 Safari 中同样支持的利用 classid 属性引入 Media Player 插件,但同时又设置了 type 属性为 application/x-oleobject,则这时仅仅在 IE 中可以正常地引入插件

造成的影响

该问题将造成插件在某些浏览器中不能正常使用。

受影响的浏览器

IE6 IE7 IE8

问题分析

1. IE 对于 classid 的理解

IE 对于 classid 属性有自己的解释方式:类标识符(class identifier)。格式形如:clsid:XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX。类标识符由 ActiveX 组件注册在 Windows 的系统注册表中。
codebase 属性则为该类标识符所对应的 ActiveX 插件的 URI 地址。一般是一个 .cab 安装包。
由于 IE 支持 OLE 技术,所以在其 type 属性的类型列表中支持一种其专有的 application/x-oleobject 类型。

更多信息请参考 MSDN CLASSID Attribute | classid PropertyClass Identifier 中的内容。

2. classid 与 codebase 属性混合使用的情况

分析以下代码:

<object width="100" height="100"
                classid="clsid:78ABDC59-D8E7-44D3-9A76-9A0918C52B4A"
                codebase="downloader.cab#version=1,0,0,0"></object>

代码中 OBJECT 元素设置了 classid 及 codebase 属性,这两个属性对应的是一个 ActiveX 插件。

在各浏览器中运行这个页面,而非 IE 浏览器没有任何反应。只有 IE 中可以弹出如下的下载及安装提示:

IE codebase

可见,在非 IE 浏览器中无法支持这种插件引入方式。

3. 各浏览器对 application/x-oleobject 类型的支持

分析以下代码:

<div style="width:180px; height:100px; background:gray;"> <object id="oo"
                style="width:100%; height:100%;"
                classid="clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6" type="application/x-oleobject"> </object> </div>

上面代码创建了一个 OBJECT 元素,OBJECT 元素通过 classid 定义其嵌入对象为 Windows 下的 Media Player,并设置了其 type 属性为 application/x-oleobject。

这段代码在各浏览器中运行效果如下:

IE6 IE7 IE8 Chrome Safari Firefox Opera
IE application/x-oleobject Chrome application/x-oleobject Safari application/x-oleobject Firefox, Opera application/x-oleobject

可见:

  • Chrome 和 Safari,支持通过 OBJECT 的 classid 属性的某些特有值引入一些特性插件,如 Media Player、Flash等,而对于这种 application/x-oleobject 类型,则也无法识别,所以 OBJECT 元素被渲染出来,但提示下载符合 type 属性指定类型的插件。
  • Firefox 和 Opera 无法支持这种利用 classid 属性引入插件的方式,则根本没有渲染 OBJECT 元素。
  • 仅 IE 支持 type 为 "application/x-oleobject" 这种 MIME,成功引入 Media Player 插件。

解决方案

ActiveX 为微软专有技术,仅被 Windows 中的 IE 支持。所以若希望这类组件可以运行于多种浏览器,则需要使用其他非 IE 支持的 NPAPI 重新设计在这种接口下的插件。以保证最好的兼容性。

type="application/x-oleobject" 这种仅 IE 支持的类型也应避免使用。在页面中引入媒体文件,可以考虑使用 Flash,或者合理的利用 IE 对 Media Player 的支持及其其他浏览器对 HTML5 的新标签 VIDEO 与 AUDIO 元素的支持在不同浏览器中达到相类似的效果。

参见

知识库

相关问题

测试环境

操作系统版本: Windows 7 Ultimate build 7600
浏览器版本: IE6
IE7
IE8
Firefox 3.6.3
Chrome 6.0.422.0 dev
Safari 4.0.5
Opera 10.53
测试页面: oleobject.html
本文更新时间: 2010-07-09

关键字

OBJECT Media Player classid 插件 application oleobject codebase