翻译图书《JavaScript 2.0》选段之 ActiveX
翻译图书《JavaScript 2.0》 The Complete Reference, Second Edition by Thomas Powell and Fritz Schneider 中选段
Part V: Chapter 18: JavaScript and Embedded Objects ActiveX
ActiveX 是能使Windows程序在运行时加载并且使用其他程序或对象的微软组件对象技术。ActiveX控件是能同浏览器页面交互的主要子程序。例如,一个<textarea>倘若作一个特殊应用而是起容量不够,页面开发作者或许会使用一个类似MS Word 的ActiveX控件来提供编辑界面。
虽然ActiveX控件看起来很象Java applets,这两项技术根本不同,举例来说,一旦一个ActiveX控件被安装在用户机器后,其允许更多的访问本地系统。这样的松懈的安全设置以为着这个控件能访问或修改文件,并且能做各种强大的、潜伏着讨厌的事情。既然ActiveX控件是执行代码,他们提供给特殊的操作系统或平台。这就意味着除了IE、Windows,他们也得到低限度地支持。
当Java applets被需要时才进行下载,ActiveX控件却象插件,一旦被安装就持久稳固在计算机中。这个安装过程通常是自动化的,这既有好处又有坏处,好在于用户不需要手工安装需要的组件,但是也存在着安全隐患,因为大多数用户很容易被欺骗而安装一个恶意控件,我们将在第22讨论ActiveX控件的安全性。
包含ActiveX控件
一个ActiveX控件要使用带有classid属性、并指明GUID(全局唯一标识)的<object>标签,这语法类似于applets中的<object>语法,使用<param>元素传递参数,其他的都应包含在<object>的开、关标签内被处理,例如:
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#
version=6,0,40,0" name="demoMovie" id="demoMovie" width="318" height="252">>
<<param name="movie"
value="http://www.javascriptref.com/examples/ch18/flash.swf" />>
<<param name="play" value="true" />>
<<param name="loop" value="false" />>
<<param name="quality" value="high" />>
<<em>>Your browser does not support ActiveX!<</em>>
<</object>>
这个例子使用ActiveX控件定义了一个嵌入式Flash文件。通常地,ActiveX控件含有以“clsid:”开头的classid属性,我们在一节曾见过另外一种以“java:”开头的classid。通常地,这个classid属性给控件指定一个唯一标识,由卖方随ActiveX控件发布这个classid值,这也通常被web开发工具插入,例如 Macromedia Dreamweaver
codebase属性指定ActiveX二进制版本,classid和codebase在Netscape下会进行手动探测这个插件,如果用户计算机没有需要的版本或控件,将会根据指定位置提示用户下载。
嵌入对象的交互式包含
至今能使页面和嵌入对象交互的最佳方法是使用ActiveX控件和插件语法相结合,为此,<object>供IE/Windows的ActiveX控件
使用,并包含<embed>供Netscape和IE/Macintosh插件使用,如下插图所示:
codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#\
version=6,0,40,0"
name="demoMovie" id="demoMovie" width="318" height="252">>
<<param name="movie" value=http://www.javascriptref.com/examples/ch18/flash.swf
/>>
<<param name="play" value="true" />>
<<param name="loop" value="false" />>
<<param name="quality" value="high" />>
<<embed src="http://www.javascriptref.com/examples/ch18/flash.swf"
width"318" height="252" play="true" loop="false" quality="high"
pluginspage="http://www.macromedia.com/go/getflashplayer">>
<<noembed>>
Error: No Object or Embed Support
<</noembed>>
<</embed>>
<</object>>
浏览器不识别<object>将会理解<embed>,如果浏览器有能力处理<object>将会忽略<embed>,同时使用<object>和<embed>能最大限度地处理你的内容。
与ActiveX控件交互
JavaScript能与ActiveX控件交互,在某种意义上类似一个插件。在文档对象下根据<object>id,一个控件是易理解的,如果需要的控件不可用,IE浏览器会自动安装它(用户同意下)并使其可用。
注意:或许你应该在<object>下包括mayscript属性使其能使用回调函数。
这控件暴露了的方法可从JavaScript调用,简单地调用<object>的适当函数遭到质疑,要调用控件的Play()方法,你应写为:
document.demoMovie.Play();
作为一个速例,我们改动先前的这个例子,这样它能运行在Netscape和IE浏览器下。
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Cross-browser Flash Control Example </title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript">
<!--
var dataReady = false;
var pluginAvailable = false;
function detectPlugin()
{
if (navigator.plugins &&
((navigator.plugins["Shockwave Flash"] &&
navigator.plugins["Shockwave Flash"]["application/x-shockwave-flash"])
||
(navigator.plugins["Shockwave Flash 2.0"] &&
navigator.plugins["Shockwave Flash 2.0"]["application/x-shockwave-flash"])
))
pluginAvailable = true;
return(pluginAvailable);
}
function changeFrame(i)
{
if (!dataReady)
return;
// Some versions of the ActiveX control don't support TotalFrames,
// so the check is omitted here. However, the control handles values
// out of range gracefully.
document.demo.GotoFrame(parseInt(i));
}
function play()
{
if (!dataReady)
return;
if (!document.demo.IsPlaying())
document.demo.Play();
}
function stop()
{
if (!dataReady)
return;
if (document.demo.IsPlaying())
document.demo.StopPlay();
}
function rewind()
{
if (!dataReady)
return;
if (document.demo.IsPlaying())
document.demo.StopPlay();
document.demo.Rewind();
}
function zoom(percent)
{
if (!dataReady)
return;
if (percent > 0)
document.demo.Zoom(parseInt(percent));
}
//-->
</script>
</head>
<body onload="dataReady = true;">
<object id="demo" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
width="318"
height="300"
codebase="http://active.macromedia.com/flash2/cabs/swflash.cab#version=5,0,0,0">
<param name="movie" value="http://demos.javascriptref.com/jscript.swf" />
<param name="play" value="false" />
<param name="loop" value="false" />
<script type="text/javascript">
<!--
if (detectPlugin())
{
document.write('<embed name="demo" src="http://demos.javascriptref.com/jscript.swf" width="318" height="300"
play="false" loop="false" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_
Version=ShockwaveFlash5" swliveconnect="true"></embed>');
}
else
{
// you can write an image in here in a "real" version
document.write('Macromedia Flash is required for this demo');
}
//-->
</script>
<noscript>
JavaScript is required to demonstrate this functionality!
</noscript>
</object>
<form name="controlForm" id="controlForm" onsubmit="return false;" action="#"
method="get">
<input type="button" value="Start" onclick="play();" />
<input type="button" value="Stop" onclick="stop();" />
<input type="button" value="Rewind" onclick="rewind();" /><br />
<input type="text" name="whichFrame" id="whichFrame" />
<input type="button" value="Change Frame"
onclick="changeFrame(controlForm.whichFrame.value);" /><br />
<input type="text" name="zoomValue" id="zoomValue" />
<input type="button" value="Change Zoom"
onclick="zoom(controlForm.zoomValue.value)" /> (greater than 100 to zoom out, less
than 100 to zoom in)<br />
</form>
</body>
</html>
你或许会怀疑ActiveX控件能做所有插件能做的事,这答案是肯定的更有甚之。例如,ActiveX控件数据处理能充分利用回调函数,所以使用插件的地方也可用ActiveX,甚至,ActiveX的数据往往嵌入在<object>元素中,这能在(x)HTML中充分利用<object>的事件处理,有趣地,似乎VBScript比JavaScript更易支持,这更象是微软技术,VBScript更接近微软COM。更多内容,请参考:http://www.microsoft.com/com/tech/activex.asp