说object?说啥呢?先简单说下object历史。Long long ago……为了实现将大量不需要在服务端的运算转移到到客户端,NetScape(NS)率先率先实现了对Java applet的支持。当时如日中天的微软当然不甘落后,而且微软觉得自己可以更NB一点,于是自己重新开发了ActiveX以替代Java applet。众所周知,HTML是标记性语言,任何的内容都需要标签来表示。于是NetScaple使用了<applet>标签来嵌入Java applet,IE则使用<object>标签来嵌入ActiveX。尽管在当时NS具有绝对优势的市场份额,而IE因与windows捆绑也“鸡犬升天”,一步步蚕食着NS的市场,双方为了争夺更多的用户,NS在随后的版本中也实现了对<object>的支持,当然仅仅是实现了对<object>标签的支持,而不是ActiveX;而IE则也开始支持<applet>和<embed>标签。
后来HTML4提出了一个概念-inclusions(包含对象),Java applet、ActiveX均是inclusions,也包括.png、.gif等图像文件,.avi等视频文件。同时标准建议使用<object>标签来嵌入inclusions。主流浏览器也开始提供对<object>更为良好的支持,但是在实现上还是存在一些差异。比如IE始终将<object>嵌入的对象作为ActiveX来处理。
那么如何使用<object>来嵌入对象?举一个大家都很熟悉的嵌入flash的例子。以下三段代码均能在现代主流浏览器中得到正确地解析而将flash嵌入到页面中。
<embed src="temp.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="200" height="200"></embed>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="200" height="200">
<param name="movie" value="temp.swf" />
<param name="quality" value="high" />
</object>
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="200" height="200">
<param name="movie" value="temp.swf" />
<param name="quality" value="high" />
<embed src="temp.swf" quality="high" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash" width="200" height="200"></embed>
</object>
正如前面所说,由于历史原因,最初对嵌入对象的实现方式不尽相同,但到今天个主浏览器对嵌入对象方式都具有了较好的兼容性。不论是使用<embed>,还是<object>都能在页面中嵌入对象。第三段代码是Dreamweaver中插入flash使用的代码,这段代码更好地解决了浏览器兼容性的问题,包括一些老版本浏览器。当浏览器不支持<object>标签时,会解析<object>中除<param>外的其他标签,所以第三段代码较之第一、二段代码具有更好的兼容性。
关于<object>中相关属性的介绍就不在此赘述了,大家可参考其他一些资料都有详细介绍。在此提醒两处需要注意的地方:
- 在使用<object>嵌入对象的时候,需要为<object>设置id属性,否则IE会报错
- 使用兼容方式嵌入对象的时候,对象的获取存在差异。标准的方法是用下面函数即可获取到对象
function getSwfMovie(movieName){
if(navigator.appName.indexOf("Microsoft")!=-1) return window[movieName];
else return document[movieName];
}
但是该方法在Firefox中无法获取到对象,而是需要通过获取<embed>来完成
function getSwfMovie(movieName){
if(navigator.appName.indexOf("Microsoft")!=-1) return window[movieName];
else return document[movieName].getElementsByTagName("embed")[0];
}
