翻译图书《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>的开、关标签内被处理,例如:

<<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
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插件使用,如下插图所示:

<<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
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浏览器下。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"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

posted @ 2007-05-31 17:33  虚幻  阅读(476)  评论(0编辑  收藏  举报