MSAgent 详细解说(上)「建议收藏」

发布时间:2025-12-09 13:53:44 浏览次数:4

转:http://www.blueidea.com/tech/web/2004/1643.asp作者windy_sk邮箱:windy_sk@126.com

下面是原文:

本文完全原创,所有参考都是
msdn.microsoft.com/library/en-us/msagent/agentstartpage_7gdh.asp

引子:
本来两年前就打算写了,结果拖了这么长时间,近日看到有朋友问及相关的东西,终于决定在还没有完全遗忘之前把自己残存的记忆表达出来,纸、笔…写!
不要说你完全了解 MSAgent,可能你对它的认识也不过是知道而已~~~~~~~~

开篇:
可能 MSAgent 这个名字你不清楚,但如果提起 Office 助手我想在这个目前 MicroSoft 独霸天下的电脑世界应该鲜有人不知道,本文就是交给你如何在网页中调用这个在线尤物。

入题:
一、抛砖引玉
首先,我们先来看一下一个最简单的效果:

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”>
  2. <scriptlanguage=< span=””>“JavaScript”>
  3. //CodedbyWindy_sk<windy_sk@126.com>20040214
  4. varAgent=null;
  5. varAgentID=“Merlin”;
  6. varAgentACS=“merlin.acs”;
  7. MSAgent.Connected=true;
  8. MSAgent.Characters.Load(AgentID,AgentACS);
  9. Agent=MSAgent.Characters.Character(AgentID);
  10. Agent.Show();
  11. </script>

AgentID 内部索引字串,由用户定义;
AgentACS 所调用的角色文件,可以为浏览者本地或远程文件,后面会有单独的部分说明。
MSAgent.Connected 建立连接;
MSAgent.Characters.Load 读取角色;
MSAgent.Characters.Character 返回角色对象;
Agent.Show 显示角色;

好了,我现在已经把 MSAgent 带到你面前了。什么?什么东西都没看到?只有浏览器的报错!没关系,在后面的文章里,我也会告诉你如何才能看到他,当然,这个看到指的是所有浏览你网页的人!

二、伶牙俐齿
下面,我们就让他来做一点实际的东西 —— 说话!还是接续上例:

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”>
  2. <scriptlanguage=< span=””>“JavaScript”>
  3. //CodedbyWindy_sk<windy_sk@126.com>20040214
  4. varAgent=null;
  5. varAgentID=“Merlin”;
  6. varAgentACS=“merlin.acs”;
  7. MSAgent.Connected=true;
  8. MSAgent.Characters.Load(AgentID,AgentACS);
  9. Agent=MSAgent.Characters.Character(AgentID);
  10. Agent.LanguageID=0x0409;
  11. Agent.Show();
  12. Agent.Speak(“HelloEverybody,IamMerlin!”);
  13. Agent.Think(“WhatshallIdothenext?”);
  14. </script>

Merlin 说话了(如果要读出声音来的话,需要客户端在 MicroSoft 的网站上下载并安装相应的语音引擎)!这里涉及到这么几个新的东西:

Agent.LanguageID 声明语言种类,0x0409是英文的编号(有关语言编号请参考 www.microsoft.com/globaldev/reference/oslocversion.mspx ),目前如果没有这个声明,或声明为错误的语种,则语言只是一次性完全显示。

Agent.Speak() 和 Agent.Think() 是 MSAgent 的两个语言表达显示行为,只有显示图形的区别。
了解了这些功能,是不是正在陶醉呀?别急,还有更好的东西呢!

三、活灵活现
总是看着一个呆头呆脑的东西一动不动,即使是很 Q ,也会有感到多少的厌烦,下面我们就让他动起来。
这个例子由于调用的是网络文件,所以会慢一点,请耐心等待一下!

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”>
  2. <scriptlanguage=< span=””>“JavaScript”>
  3. //CodedbyWindy_sk<windy_sk@126.com>20040214
  4. varAgent=null;
  5. varAgentID=“Merlin”;
  6. varAgentACS=“http://agent.microsoft.com/agent2/chars/merlin/merlin.acf”;
  7. varAgentStates=“Showing,Hiding,Speaking,Moving”;
  8. varAgentAnimations=“GetAttention,GetAttentionReturn,Congratulate,Acknowledge,Read,WriteContinued,WriteReturn,wave”;
  9. varAgentLoadRequest,AgentStateRequest,AgentAnimationRequest;
  10. MSAgent.Connected=true;
  11. AgentLoadRequest=MSAgent.Characters.Load(AgentID,AgentACS);
  12. Agent=MSAgent.Characters.Character(AgentID);
  13. Agent.LanguageID=0x0409;
  14. AgentStateRequest=Agent.get(“state”,AgentStates);
  15. AgentAnimationRequest=Agent.get(“animation”,AgentAnimations);
  16. Agent.Show();
  17. Agent.MoveTo(400,300);
  18. Agent.Play(“GetAttention”);
  19. Agent.Play(“GetAttentionReturn”);
  20. Agent.speak(“Hi,mayIhaveyourattention,please?”);
  21. Agent.Play(“Congratulate”);
  22. Agent.speak(“Sonicetomeetyou!”);
  23. Agent.Play(“Think”);
  24. Agent.speak(“Howdothinkaboutme?”);
  25. Agent.Play(“Acknowledge”);
  26. Agent.Speak(“It’sverycool,ya?”);
  27. Agent.Play(“Read”);
  28. Agent.Play(“WriteContinued”);
  29. Agent.Play(“WriteReturn”);
  30. Agent.Speak(“Oh,Ihavelotsofthingstodo,seeyou!”);
  31. Agent.Play(“wave”);
  32. Agent.Speak(“Bye-bye!”);
  33. Agent.Hide();
  34. </script>

看到没有?其实只要你善于调动它的积极性,MSAgent 也蛮活泼的!信息观察,不难发现,原来让 MSAgent 动起来,也不过就这么简单:
Agent.MoveTo(x, y) 是角色移动到指定的坐标;
Agent.Play(action) 命令角色做某个动作,动作列表见: msdn.microsoft.com/library/default.asp?url=/library/en-us/msagent/deschar_3pgy.asp (这里需要说明一下,不是所有的角色都支持这些动作的,处理方法后面会有说明!)

Agent.Hide() 隐藏角色(不是释放角色,通过 Agent.Show() 可以再次显示)
Agent.get(Request, list) 预载相关 MSAgent 动画数据,MSAgent人物数据文件支持单结构角色文件(.acs,角色数据与动画数据存于同一个文件),也支持分离结构角色文件(.acf,角色数据存于.acf中,动画数据存于.aca中)。基于本地硬盘和网络调用均可采用这两种模式,当调用网络 acf 文件时,由于角色数据与动画数据分别下载,所以需要预载相关动画数据,使用 acs 文件(一般没有本地 acf 文件的可能性),不需要预载。

AgentLoadRequest, AgentLoadRequest 和 AgentAnimationRequest 这三个参数本例并没有实际用到,返回应相关操作的状态对象(相当于 readystatus 属性),在调用网络 acf 文件时有比较实际的用途,这个会在后面说明!

四、改头换面
MSAgent = Merlin ? 错!MSAgent 是指一系列动画人物的总称,最常见的 office 中的那些活宝,各位应该都熟悉吧?先来看看下面的这个例子:

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”>
  2. <scriptlanguage=< span=””>“JavaScript”>
  3. //CodedbyWindy_sk<windy_sk@126.com>20040214
  4. varAgent=null;
  5. varAgentID,AgentACS;
  6. varAgentLoad=false;
  7. functionLoadAgent(NewAgent){
  8. if(AgentLoad){
  9. MSAgent.Characters.Unload(AgentID);
  10. MSAgent.Connected=false;
  11. Agent=null;
  12. }
  13. AgentID=NewAgent;
  14. AgentACS=“http://agent.microsoft.com/agent2/chars/”+NewAgent+“/”+NewAgent+“.acf”;
  15. MSAgent.Connected=true;
  16. MSAgent.Characters.Load(AgentID,AgentACS);
  17. AgentLoad=true;
  18. Agent=MSAgent.Characters.Character(AgentID);
  19. Agent.get(“state”,“Showing,Hiding”);
  20. Agent.MoveTo(400,300);
  21. Agent.Show();
  22. return;
  23. }
  24. LoadAgent(“Merlin”);
  25. </script>
  26. MSAgentSelect:
  27. “Agent_select”οnchange=“LoadAgent(this[this.selectedIndex].text)”>
  28. Merlin
  29. Peedy
  30. Genie
  31. Robby

看到没有? 原来 MSAgent 还有这么多可爱的造型呢!上面的例程中,我定义了一个读取角色的函数 LoadAgent ,通过这个函数更换角色,其中的大部分的功能在前面的章节中已经介绍了,这里仅仅说明一下,新的方法:

MSAgent.Characters.Unload() 卸载角色,其中 AgentID ,必须是 MSAgent.Characters.Load() 中声明过的

Agent.MoveTo() 这个方法上一节中介绍过,但是如果把它放在 Agent.Show() ,则相当于定义角色的出现位置

其实,MSAgent 绝对不仅仅是那么多,但是 MicroSoft 的官方网站上只提供了那么多……怎么办?可以从他的网站上连接角色,当然可可以从你的网站上呀!你可以在这里 www.microsoft.com/msagent/downloads/user.asp 下载官方角色以及语音引擎(可惜没有中文);当然,如果你有兴趣的话也可以开发一个属于自己的 Agent ,相关开发工具 www.microsoft.com/msagent/downloads/developer.asp ,网上也有很多高手做好的动画人物,推荐一个网站 www.msagentring.org/chars.htm 你也可以自己搜索一下。

安装后角色文件存放在 %WINDOWS%\msagent\chars 目录下的 *.acs 文件,上传到服务器上,直接引用到那个路径就可以了!(你也可以在你的硬盘里搜索一下 *.acs 会有不小的收获呦)这里要说明一下,请自行更改程序中标明网络路径的相关语句,且注意扩展名是 .acs !

如果要让本机支持相应的 MSAgent ,也就是说不用网络调用,只要把 *.acs 文件 copy 到 %WINDOWS%\msagent\chars 目录就可以了,但如果是 *.exe 的安装文件,则会自动把角色文件放置到相应的路径下。

五、排难解错
能否显示 MSAgent 的关键在于是否安装了 MSAgent 的核心组件
( Microsoft Agent core components – activex.microsoft.com/activex/controls/agent2/MSagent.exe ),但是如何让这一被动行为变为主动呢?可以用下面两种方法:

方法一:

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”CodeBase=“http://activex.microsoft.com/activex/controls/agent2/MSagent.exe#VERSION=2,0,0,0”>

特点:自动下载组件并安装,比较方便,但会下载的等待时间不会提示,在网速慢的时候会以为页免死掉,且不是很方便控制。

方法二:

js 代码
  1. <scriptlanguage=< span=””>“javascript”>
  2. //CodedbyWindy_sk<windy_sk@126.com>20040214
  3. functionAgent_load_error(){
  4. alert(“TomaketheMSAgentavailable,/npleaseinstallMicrosoftAgentcorecomponentsfirst!”);
  5. window.open(“http://activex.microsoft.com/activex/controls/agent2/MSagent.exe”);
  6. return;
  7. }
  8. </script>
  9. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”οnerrοr=“Agent_load_error()”>

特点:方便出错控制,用户控制下载,但是不能当时显示,需要安装后再次刷新页面。

使用哪种方法就属于见仁见智了,但是最不明智的方法就是两种方法一起上,实践证明 CodeBase 会先于 onerror 生效!

不管怎么说,调用本地角色也比网络角色速度上要快得多,但是你如何预知客户端是否安装了该角色呢?看看下面的例子:

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”>
  2. <scriptlanguage=< span=””>“JavaScript”>
  3. //CodedbyWindy_sk<windy_sk@126.com>20040214
  4. varAgent=null;
  5. varAgentID,AgentACS;
  6. varAgentLoad=false;
  7. functionLoadAgent(NewAgent){
  8. varremote=false;
  9. if(AgentLoad){
  10. MSAgent.Characters.Unload(AgentID);
  11. MSAgent.Connected=false;
  12. Agent=null;
  13. }
  14. AgentID=NewAgent;
  15. AgentACS=NewAgent+“.acs”;
  16. MSAgent.Connected=true;
  17. try{
  18. MSAgent.Characters.Load(AgentID,AgentACS);
  19. agent_exist.innerText=“LocalMSAgentloadsuccessfully!”;
  20. }catch(e){
  21. AgentACS=“http://agent.microsoft.com/agent2/chars/”+NewAgent+“/”+NewAgent+“.acf”;
  22. remote=true;
  23. MSAgent.Characters.Load(AgentID,AgentACS);
  24. agent_exist.innerText=“LocalMSAgentloadunsuccessfully,asaadvice,you’dbettertodownloadthecharactorfiletoyourharddisk!”;
  25. }
  26. AgentLoad=true;
  27. Agent=MSAgent.Characters.Character(AgentID);
  28. if(remote)Agent.get(“state”,“Showing,Hiding”);
  29. Agent.MoveTo(400,300);
  30. Agent.Show();
  31. return;
  32. }
  33. window.onload=function(){LoadAgent(“Merlin”);};
  34. </script>
  35. MSAgentSelect:
  36. “Agent_select”οnchange=“LoadAgent(this[this.selectedIndex].text)”>
  37. Merlin
  38. Peedy
  39. Genie
  40. Robby
  41. LoadStatus:“agent_exist”>

通过设置错误捕获,可以方便的找到调用 MSAgent 的**方式,当然,你还可以通过 DHTML 加上相应的角色下载链接,并指导用户将 *.acs 文件 copy 到相应目录(%WINDOWS%\msagent\chars)或直接安装 *.exe 的角色安装文件以方便下次浏览,我仅仅是为你提供一个思路,具体实践还是自己发挥吧!

六、事件响应
像所有 OOP 一样,MSAgent 也设置有相应的事件响应,看看下面的例子,试试在角色或任务栏的图标上点击鼠标(单/双击),你也可以移动一下角色,看看它有什么反应:

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”>
  2. <scriptlanguage=< span=””>“JavaScript”For=“MSAgent”Event=“Click(CharacterID,Button,Shift,X,Y)”>
  3. //CodedbyWindy_sk<windy_sk@126.com>20040214
  4. if(Button==1&&Agent.Visible){
  5. if(remote){
  6. Agent.get(“state”,“Speaking”);
  7. Agent.get(“animation”,“Acknowledge,Pleased”);
  8. }
  9. Agent.Play(“Acknowledge”);
  10. Agent.Speak(“Yessir!“+CharacterID+”isrighthere!”);
  11. Agent.Play(“Pleased”)
  12. Agent.Speak(“WhatcanIdoforyou?”);
  13. }elseif(Button==4097){
  14. Agent.Visible?Agent.Hide():Agent.show();
  15. }
  16. </script>
  17. <scriptlanguage=< span=””>“JavaScript”For=“MSAgent”Event=“DblClick(CharacterID,Button,Shift,X,Y)”>
  18. //CodedbyWindy_sk<windy_sk@126.com>20040214
  19. if(Button==1||Button==4097){
  20. Agent.StopAll();
  21. if(!Agent.HasOtherClients){
  22. MSAgent.Characters.Unload(AgentID);
  23. MSAgent.Connected=false;
  24. Agent=null;
  25. AgentLoad=false;
  26. }
  27. }
  28. </script>
  29. <scriptlanguage=< span=””>“JavaScript”For=“MSAgent”Event=“Move(CharacterID,X,Y,Cause)”>
  30. //CodedbyWindy_sk<windy_sk@126.com>20040214
  31. if(Cause==1){
  32. if(remote){
  33. Agent.get(“state”,“Moving,Speaking”);
  34. Agent.get(“animation”,“Confused,RestPose”);
  35. }
  36. Agent.MoveTo(400,300);
  37. Agent.Play(“Confused”);
  38. Agent.Speak(“Don’tmovemeOK?”);
  39. Agent.Play(“RestPose”);
  40. }
  41. </script>
  42. <scriptlanguage=< span=””>“JavaScript”>
  43. //CodedbyWindy_sk<windy_sk@126.com>20040214
  44. varAgent=null;
  45. varAgentID,AgentACS;
  46. varAgentLoad=false;
  47. varremote=false;
  48. functionLoadAgent(NewAgent){
  49. if(AgentLoad){
  50. MSAgent.Characters.Unload(AgentID);
  51. MSAgent.Connected=false;
  52. Agent=null;
  53. }
  54. AgentID=NewAgent;
  55. AgentACS=NewAgent+“.acs”;
  56. MSAgent.Connected=true;
  57. try{
  58. MSAgent.Characters.Load(AgentID,AgentACS);
  59. }catch(e){
  60. AgentACS=“http://agent.microsoft.com/agent2/chars/”+NewAgent+“/”+NewAgent+“.acf”;
  61. remote=true;
  62. MSAgent.Characters.Load(AgentID,AgentACS);
  63. if(confirm(“CannotfindtheMSAgentcharactorfileonyourharddisk!\nWouldyouliketodownloadtheMSAgentcharactorfileforthenextshow?”))
  64. window.open(“http://www.msagentring.org/download.asp?char=”+NewAgent.toLowerCase(),“_blank”,“top=2000px”);
  65. }
  66. AgentLoad=true;
  67. Agent=MSAgent.Characters.Character(AgentID);
  68. Agent.LanguageID=0x0409;
  69. if(remote)Agent.get(“state”,“Showing,Hiding”);
  70. Agent.MoveTo(400,300);
  71. Agent.Show();
  72. return;
  73. }
  74. LoadAgent(“Merlin”);
  75. </script>
  76. MSAgentSelect:
  77. “Agent_select”οnchange=“LoadAgent(this[this.selectedIndex].text)”>
  78. Merlin
  79. Peedy
  80. Genie
  81. Robby

是不是感觉交互性强了许多?我们来看一下事件处理的声明方法:
<script language=”JavaScript” for=”MSAgent_Object” event=”Event_Name()”>
//code…
</script>

熟悉一点 JS 编程的应该不会陌生这种声明方式,也就是对某一对象某一事件的单独处理的声明方法,但是如果是该成 MSAgent_Object.Event_Name = function() {//code…} 的事件处理声明是不可以的!(the only way to do this)

如果是采用网络调用的话,如果向用户通知相应的调用进度呢?

js 代码
  1. “visibility:hidden”id=“MSAgent”classid=“CLSID:D45FD31B-5C6E-11D1-9EC1-00C04FD7081F”>
  2. <scriptlanguage=< span=””>“JavaScript”For=“MSAgent”Event=“RequestStart(RequestObject)”>
  3. //CodedbyWindy_sk<windy_sk@126.com>20040214
  4. switch(RequestObject){
  5. caseAgentLoadRequest:
  6. window.status=“LoadingMSAgentFileFromInternetFor“+AgentID+”…”;
  7. break;
  8. caseAgentStateRequest:
  9. window.status=“LoadingMSAgentStateFromInternetFor“+AgentID+”…”;
  10. break;
  11. caseAgentAnimationRequest:
  12. window.status=“LoadingMSAgentAnimationFromInternetFor“+AgentID+”…”;
  13. break;
  14. default:
  15. break;
  16. }
  17. </script>
  18. <scriptlanguage=< span=””>“JavaScript”For=“MSAgent”Event=“RequestComplete(RequestObject)”>
  19. //CodedbyWindy_sk<windy_sk@126.com>20040214
  20. switch(RequestObject){
  21. caseAgentLoadRequest:
  22. if(RequestObject.Status==0){
  23. window.status=“MSAgentFileFor“+AgentID+”HasBeenLoadedSuccessfully!”;
  24. }else{
  25. window.status=“CannotLoadMSAgentFileFor“+AgentID+”From“+AgentACS+”!”;
  26. }
  27. break;
  28. caseAgentStateRequest:
  29. if(RequestObject.Status==0){
  30. window.status=“MSAgentStateFor“+AgentID+”HasBeenLoadedSuccessfully!”;
  31. }else{
  32. window.status=“CannotLoadMSAgentStateFor“+AgentID+”From“+AgentACS+”!”;
  33. }
  34. break;
  35. break;
  36. caseAgentAnimationRequest:
  37. if(RequestObject.Status==0){
  38. window.status=“MSAgentAnimationFor“+AgentID+”HasBeenLoadedSuccessfully!”;
  39. }else{
  40. window.status=“CannotLoadMSAgentAnimationFor“+AgentID+”From“+AgentACS+”!”;
  41. }
  42. break;
  43. break;
  44. default:
  45. window.status=“”;
  46. break;
  47. }
  48. </script>
  49. <scriptlanguage=< span=””>“JavaScript”For=“MSAgent”Event=“DragStart(CharacterID,Button,Shift,X,Y)”>
  50. //CodedbyWindy_sk<windy_sk@126.com>20040214
  51. cur_x=X–Agent.width/2;
  52. cur_y=Y–Agent.height/2;
  53. </script>
  54. <scriptlanguage=< span=””>“JavaScript”For=“MSAgent”Event=“DragComplete(CharacterID,Button,Shift,X,Y)”>
  55. //CodedbyWindy_sk<windy_sk@126.com>20040214
  56. if(remote){
  57. AgentStateRequest=Agent.get(“state”,“Moving,Speaking”);
  58. AgentAnimationRequest=Agent.get(“animation”,“Confused,RestPose”);
  59. }
  60. Agent.MoveTo(cur_x,cur_y);
  61. Agent.Play(“Confused”);
  62. Agent.Speak(“Don’tmovemeOK?”);
  63. Agent.Play(“RestPose”);
  64. </script>
  65. <scriptlanguage=< span=””>“JavaScript”>
  66. //CodedbyWindy_sk<windy_sk@126.com>20040214
  67. varAgent=null;
  68. varAgentID,AgentACS;
  69. varAgentLoad=false;
  70. varremote=false;
  71. varcur_x,cur_y;
  72. varAgentLoadRequest,AgentStateRequest,AgentAnimationRequest;
  73. functionLoadAgent(NewAgent){
  74. if(AgentLoad){
  75. MSAgent.Characters.Unload(AgentID);
  76. MSAgent.Connected=false;
  77. Agent=null;
  78. }
  79. AgentID=NewAgent;
  80. AgentACS=NewAgent+“.acs”;
  81. MSAgent.Connected=true;
  82. try{
  83. AgentLoadRequest=MSAgent.Characters.Load(AgentID,AgentACS);
  84. }catch(e){
  85. AgentACS=“http://agent.microsoft.com/agent2/chars/”+NewAgent+“/”+NewAgent+“.acf”;
  86. remote=true;
  87. AgentLoadRequest=MSAgent.Characters.Load(AgentID,AgentACS);
  88. if(confirm(“CannotfindtheMSAgentcharactorfileonyourharddisk!\nWouldyouliketodownloadtheMSAgentcharactorfileforthenextshow?”))
  89. window.open(“http://www.msagentring.org/download.asp?char=”+NewAgent.toLowerCase(),“_blank”,“top=2000px”);
  90. }
  91. AgentLoad=true;
  92. Agent=MSAgent.Characters.Character(AgentID);
  93. Agent.LanguageID=0x0409;
  94. if(remote){
  95. AgentStateRequest=Agent.get(“state”,“Showing,Thinking,Hiding”);
  96. AgentAnimationRequest=Agent.get(“animation”,“GetAttention,GetAttentionContinued,GetAttentionReturn”);
  97. }
  98. Agent.MoveTo(400,300);
  99. Agent.Show();
  100. Agent.Play(“GetAttention”);
  101. Agent.Play(“GetAttentionContinued”);
  102. Agent.Play(“GetAttentionReturn”);
  103. Agent.speak(“Hi,Iam“+NewAgent+“!”);
  104. Agent.think(“Ohsobad,Ijustwannatakeanap…”);
  105. return;
  106. }
  107. LoadAgent(“Merlin”);
  108. </script>
  109. MSAgentSelect:
  110. “Agent_select”οnchange=“LoadAgent(this[this.selectedIndex].text)”>
  111. Merlin
  112. Peedy
  113. Genie
  114. Robby

注意到窗口底部状态栏的显示了吗?虽然无法获取具体的下载进度,但是至少也可以让浏览者知道角色的动作为什么会有停顿(这个停顿只在某动画第一次调用的时候出现,调用后该动画会被缓存)。

更多的事件说明请参看 msdn.microsoft.com/library/en-us/msagent/paface_2xet.asp 但是浏览器所调用的 MSAgeng 对象并不是所有的事件都支持。

需要做网站?需要网络推广?欢迎咨询客户经理 13272073477