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

None.gif < <object  classid ="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
None.gifcodebase
="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#
None.gifversion=6,0,40,0"
 name ="demoMovie"  id ="demoMovie"  width ="318"  height ="252" > >
None.gif
< <param  name ="movie"
None.gif value
="http://www.javascriptref.com/examples/ch18/flash.swf"   /> >
None.gif
< <param  name ="play"  value ="true"   /> >
None.gif
< <param  name ="loop"  value ="false"   /> >
None.gif
< <param  name ="quality"  value ="high"   /> >
None.gif
< <em > >Your browser does not support ActiveX! < </em > >
None.gif
< </object > >
None.gif

    这个例子使用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插件使用,如下插图所示:

None.gif < <object  classid ="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
None.gifcodebase
="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#\
None.gifversion=6,0,40,0"

None.gif name
="demoMovie"  id ="demoMovie"  width ="318"  height ="252" > >
None.gif
< <param  name ="movie"  value =http://www.javascriptref.com/examples/ch18/flash.swf
None.gif 
/> >
None.gif
< <param  name ="play"  value ="true"   /> >
None.gif
< <param  name ="loop"  value ="false"   /> >
None.gif
< <param  name ="quality"  value ="high"   /> >
None.gif
None.gif
< <embed  src ="http://www.javascriptref.com/examples/ch18/flash.swf"
None.gif width"318" height
="252"  play ="true"  loop ="false"  quality ="high"
None.gifpluginspage
="http://www.macromedia.com/go/getflashplayer" > >
None.gif
< <noembed > >
None.gif  Error: No Object or Embed Support
None.gif
< </noembed > >
None.gif
< </embed > >
None.gif
< </object > >

浏览器不识别<object>将会理解<embed>,如果浏览器有能力处理<object>将会忽略<embed>,同时使用<object>和<embed>能最大限度地处理你的内容。
与ActiveX控件交互
JavaScript能与ActiveX控件交互,在某种意义上类似一个插件。在文档对象下根据<object>id,一个控件是易理解的,如果需要的控件不可用,IE浏览器会自动安装它(用户同意下)并使其可用。
 注意:或许你应该在<object>下包括mayscript属性使其能使用回调函数。
这控件暴露了的方法可从JavaScript调用,简单地调用<object>的适当函数遭到质疑,要调用控件的Play()方法,你应写为:
document.demoMovie.Play();
作为一个速例,我们改动先前的这个例子,这样它能运行在Netscape和IE浏览器下。

None.gif <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
None.gif"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
None.gif
< html  xmlns ="http://www.w3.org/1999/xhtml" >
None.gif
< head >
None.gif
< title > Cross-browser Flash Control Example  </ title >
None.gif
< meta  http-equiv ="Content-Type"  content ="text/html; charset=iso-8859-1"   />
ExpandedBlockStart.gifContractedBlock.gif
< script  type ="text/javascript" > dot.gif
InBlock.gif
<!--
InBlock.gif  
var dataReady = false;
InBlock.gif  
var pluginAvailable = false;
InBlock.gif  
function detectPlugin()
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif    
if (navigator.plugins &&
InBlock.gif        ((navigator.plugins[
"Shockwave Flash"&&
InBlock.gif          navigator.plugins[
"Shockwave Flash"]["application/x-shockwave-flash"])
InBlock.gif         
||
InBlock.gif         (navigator.plugins[
"Shockwave Flash 2.0"&&
InBlock.gif          navigator.plugins[
"Shockwave Flash 2.0"]["application/x-shockwave-flash"])
InBlock.gif        ))
InBlock.gif      pluginAvailable 
= true;
InBlock.gif      
return(pluginAvailable);
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
function changeFrame(i)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif     
if (!dataReady)
InBlock.gif        
return;
InBlock.gif     
// Some versions of the ActiveX control don't support TotalFrames,
InBlock.gif
     // so the check is omitted here. However, the control handles values
InBlock.gif
     // out of range gracefully.
InBlock.gif
     document.demo.GotoFrame(parseInt(i));
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
function play()
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif     
if (!dataReady)
InBlock.gif        
return;
InBlock.gif    
if (!document.demo.IsPlaying())
InBlock.gif      document.demo.Play();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
function stop() 
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif     
if (!dataReady)
InBlock.gif        
return;
InBlock.gif     
if (document.demo.IsPlaying())
InBlock.gif        document.demo.StopPlay();
ExpandedSubBlockEnd.gif}

InBlock.gif
InBlock.gif
function rewind() 
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif     
if (!dataReady)
InBlock.gif        
return;
InBlock.gif     
if (document.demo.IsPlaying())
InBlock.gif        document.demo.StopPlay();
InBlock.gif     document.demo.Rewind();
ExpandedSubBlockEnd.gif}

InBlock.gif
function zoom(percent) 
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif     
if (!dataReady)
InBlock.gif        
return;
InBlock.gif     
if (percent > 0)
InBlock.gif        document.demo.Zoom(parseInt(percent));
ExpandedSubBlockEnd.gif}

ExpandedBlockEnd.gif
//-->
None.gif
</ script >
None.gif
</ head >
None.gif
< body  onload ="dataReady = true;" >
None.gif
< object  id ="demo"  classid ="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"  
None.gifwidth
="318"  
None.gifheight
="300"  
None.gifcodebase
="http://active.macromedia.com/flash2/cabs/swflash.cab#version=5,0,0,0" >
None.gif
< param  name ="movie"  value ="http://demos.javascriptref.com/jscript.swf"   />
None.gif
< param  name ="play"  value ="false"   />
None.gif
< param  name ="loop"  value ="false"   />
ExpandedBlockStart.gifContractedBlock.gif
< script  type ="text/javascript" > dot.gif
InBlock.gif
<!--
InBlock.gif   
if (detectPlugin()) 
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      document.write('
<embed name="demo" src="http://demos.javascriptref.com/jscript.swf" width="318" height="300" 
InBlock.gifplay
="false" loop="false" pluginspage="http://www.macromedia.com/shockwave/download/index.cgi?P1_Prod_
InBlock.gifVersion=ShockwaveFlash5
" swliveconnect="true"></embed>');
ExpandedSubBlockEnd.gif   }
 
InBlock.gif  
else
ExpandedSubBlockStart.gifContractedSubBlock.gif    
dot.gif{
InBlock.gif      
// you can write an image in here in a "real" version     
InBlock.gif
      document.write('Macromedia Flash is required for this demo');
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif
//-->
None.gif
</ script >
None.gif
< noscript >
None.gif  JavaScript is required to demonstrate this functionality!
None.gif
</ noscript >
None.gif
</ object >
None.gif
< form  name ="controlForm"  id ="controlForm"  onsubmit ="return false;"  action ="#"  
None.gifmethod
="get" >
None.gif
< input  type ="button"  value ="Start"  onclick ="play();"   />
None.gif
< input  type ="button"  value ="Stop"  onclick ="stop();"   />
None.gif
< input  type ="button"  value ="Rewind"  onclick ="rewind();"   />< br  />
None.gif
< input  type ="text"  name ="whichFrame"  id ="whichFrame"   />
None.gif
< input  type ="button"  value ="Change Frame"
None.gif onclick
="changeFrame(controlForm.whichFrame.value);"   />< br  />
None.gif
< input  type ="text"  name ="zoomValue"  id ="zoomValue"   />
None.gif
< input  type ="button"  value ="Change Zoom"  
None.gifonclick
="zoom(controlForm.zoomValue.value)"   />  (greater than 100 to zoom out, less
None.gif than 100 to zoom in)
< br  />
None.gif
</ form >
None.gif
</ body >
None.gif
</ html >

你或许会怀疑ActiveX控件能做所有插件能做的事,这答案是肯定的更有甚之。例如,ActiveX控件数据处理能充分利用回调函数,所以使用插件的地方也可用ActiveX,甚至,ActiveX的数据往往嵌入在<object>元素中,这能在(x)HTML中充分利用<object>的事件处理,有趣地,似乎VBScript比JavaScript更易支持,这更象是微软技术,VBScript更接近微软COM。更多内容,请参考:http://www.microsoft.com/com/tech/activex.asp

转载于:https://www.cnblogs.com/unreal/articles/766720.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值