注 虽然未激活控件不响应任何直接的用户交互;但它们响应脚本命令。
要激活一个交互控件,可以单击该控件,也可以使用 Tab 键将焦点设置在该控件上,然后按 SPACEBAR 或 ENTER 键。从外部脚本加载的交互控件无需激活即可立即响应用户交互。
某些有窗口的控件使用 Windows API 函数(如 GetKeyState 和 GetCursorPos)确定键盘和鼠标的状态,然后响应函数结果。仅对于这些控件而言,先出现一个提示,然后才会在 Internet Explorer 中运行控件。要运行控件,用户需要先单击消息窗口中的按钮,然后页面才会加载。加载后,控件不需要激活。目前,以下控件具有该行为,但供应商正在继续研发没有该行为的新控件。
•
Virtools™Web Player from Virtools SA
•Macromedia Shockwave Player™from Adobe Systems Inc.
•QuickTime™from Apple Computer, Inc.
从外部脚本文件加载时,这些控件不显示提示。
下图显示提示对话框。
外部加载交互控件
要创建加载交互控件(这些控件立即响应用户输入)的 Web 页,使用 Microsoft JScript 从外部脚本文件加载控件。您不能编写与主 HTML 页内联的脚本元素来从外部加载控件。如果脚本是以编程方式内联编写的(例如,用 writeln 函数),加载的控件就像由 HTML 文档本身加载的一样,需要激活。要确保控件在加载后是交互的,使用以下任一技术。
下面的示例使用 document.write 动态加载控件。
// HTML Filehtml body leftmargin=0 topmargin=0 scroll=no script src="Embed.js"/script /body/html// embed.jsdocument.write(' embed src="examplecontrol"')
外部脚本文件也可以修改某个元素的 outerHTML 属性来达到同样的效果,如下例所示。
// HTML Filehtml body div script src="embedControlOuterHTML.js"/script /div /body/html// embedControlOuterHTML.jsembedControlLocation.outerHTML = 'embed src="examplecontrol"';
下一示例使用 document.createElement 加载一个使用 OBJECT 元素的 ActiveX 控件。
重要 使用 createElement 向 Web 页加载 Object 元素或 Embed 元素时,请小心创建该元素,初始化其属性,将该元素添加到页面的 DOM,然后再创建要由该新元素加载的 ActiveX 控件。有关详细信息,请参阅 createElement 文档。
// HTML Filehtml body div id="DivID" script src="createElementExplicit.js"/SCRIPT PRE html body// createElementExplicit.jsvar myObject = document.createElement('object');DivID.appendChild(myObject);myObject.width = "200";myObject.height = "100";myObject.classid= "clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6"; myObject.URL = "example.wmv";myObject.uiMode = "none" ;
下一示例使用 innerHTML 和 JScript 函数加载 ActiveX 控件,同时指定参数值。
// HTML Filehtml head script src="external_script.js" language="JScript" /script /head body div id="EXAMPLE_DIV_ID" This text will be replaced by the control /div script language="JScript" CreateControl( "EXAMPLE_DIV_ID", "clsid:6BF52A52-394A-11d3-B153-00C04F79FAA6", "EXAMPLE_OBJECT_ID", "600", "400", "example.wmv", "-1") /script /body/html
// external_script.jsfunction CreateControl(DivID, CLSID, ObjectID, WIDTH, HEIGHT, URL, AUTOSTART){ var d = document.getElementById(DivID); d.innerHTML = 'object classid=' + CLSID + ' id=' + ObjectID + ' width=' + WIDTH + ' height=' + HEIGHT +' param name="URL" value=' + URL + ' param name="autoStart" value=' + AUTOSTART + '/';}
由于下一示例使用 writeln 函数将脚本插入原始的 HTML 文档,因此产生的控件需要激活。要加载一个无需激活的控件,请使用上述示例之一。
// HTML Filehtml body div id="embedControlLocation" script id="elementid" src="embedControl.js"/script /div /body/html// embedControl.jsdocument.writeln('script');document.write('document.writeln('');document.write( 'object classid = "clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6" width="100" height="100" /');document.write('');');document.writeln('/script');
警告 如果在控制面板的“Internet 选项”的“高级”选项卡中不选“禁用脚本调试 (Internet Explorer)”选项,则使用这些技术创建的控件仍需激活。
返回页首以编程方式确定控件是否未激活
您不能使用 JScript 函数或服务器端脚本来确定某个控件是否为激活。宿主 Web 浏览器控件的应用程序不能确定某个控件是否为激活。
(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/webkaifa/)控件可以通过 DISPID_AMBIENT_UIDEAD 环境属性确定激活状态,该属性通过 IDispatch::Invoke 调用。该属性通过 IOleControl::OnAmbientPropertyChange 进行更改时,会通知实现 IOleControl 接口的控件。
返回页首辅助影响
当辅助工具遇到 ActiveX 控件时,可以使用对象的 IAccessible 接口获取有关该控件的信息。可以用 IAccessible::accDoDefaultAction 方法激活未激活的控件。
下表描述在未激活控件上调用 IAccessible 方法产生的结果。
方法说明
IAccessible::accDoDefaultAction
激活控件并在 MSAA 树内公开 ActiveX 控件或 Java Applet。
IAccessible::accHitTest
返回 CHILDID_SELF
IAccessible::accLocation
底层 ActiveX 控件或 Java Applet 的位置
IAccessible::accNavigate
返回 E_NOTIMPL
IAccessible::accSelect
返回 E_NOTIMPL
IAccessible::get_accChild
返回 S_FALSE
IAccessible::get_accChildCount
返回 0 和 S_OK
IAccessible::get_accDefaultAction
返回“Select this control”
IAccessible::get_accDescription
返回 E_NOTIMPL
IAccessible::get_accFocus
返回 E_NOTIMPL
IAccessible::get_accHelp
返回“This control is inactive.Select the control to activate and use it.”
IAccessible::get_accHelpTopic
没有变化 — 返回 E_NOTIMPL
IAccessible::get_accKeyboardShortcut
没有变化 — 委托该对象。如果没有对象,该方法返回 E_NOTIMPL。
IAccessible::get_accName
返回“Inactive Control”
IAccessible::get_accParent
没有变化 — 返回父链中最近的可访问的元素。
IAccessible::get_accRole
返回 ROLE_SYSTEM_PUSHBUTTON
IAccessible::get_accSelection
返回 E_NOTIMPL
IAccessible::get_accState
返回对象的当前状态。该状态总是包括 STATE_SYSTEM_FOCUSABLE
IAccessible::get_accValue
返回 E_NOTIMPL
IAccessible::put_accName
返回 E_NOTIMPL
IAccessible::put_accValue
返回 E_NOTIMPL
有关激活的控件或不需要激活的控件的信息,请参阅 Active Accessibility SDK。
注 辅助工具触发默认操作后应该刷新,这样才能正确显示 ActiveX 控件的数据及其子控件的数据(如果有)。
返回页首WebBrowser 控件影响
默认情况下,宿主 WebBrowser Control 的自定义应用程序不会阻止由 APPLET、EMBED 或 OBJECT 元素加载的交互式 ActiveX 控件。未激活控件阻止仅应用于以下应用程序。
•
Windows Explorer
•Internet Explorer
•MSN Explorer
•AOL®Explorer
•AOL®8.0
•AOL®9.0
•CompuServe 2000
•AIM®
•Maxthon Browser
•NetCaptor
•Browse3D
•Macromedia Dreamweaver
•Macromedia Contribute
•Netscape®8(将 Internet Explorer 用作呈现引擎时)
要与应用程序中 Internet Explorer 的行为匹配,将 DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE 标志添加到 DOCHOSTUIINFO 结构的 dwFlags 参数中,如下例所示。
HRESULT GetHostInfo(DOCHOSTUIINFO *pInfo){ ... pInfo-cbSize = sizeof(DOCHOSTUIINFO); pInfo-dwFlags = { Other DOCHOSTUIFLAGs } | DOCHOSTUIFLAG_ENABLE_ACTIVEX_INACTIVATE_MODE; ... return S_OK;}
还可以通过将应用程序的进程名添加到以下注册表项来启用交互控件阻止。
HKEY_LOCAL_MACHINE (or HKEY_CURRENT_USER)SOFTWAREMicrosoftInternet ExplorerMainFeatureControlFEATURE_ENABLE_ACTIVEX_INACTIVATE_MODEprocess_name.exe=(DWORD) 0x00000001
注 因为用户可以修改注册表,所以 DOCHOSTUIINFO 标志是启用交互控件阻止的首选方法。
默认情况下,应用程序可以注册以并入 ActiveX 控件激活。有关详细信息,请咨询您的技术客户经理或与 Microsoft 的产品支持部门联系。
返回页首附录 A:未激活控件所阻止的 DHTML 事件
下表列出 ActiveX 控件未激活时所阻止的 DHTML 事件。
onactivate
ondragleave
onmouseout
onbeforeactivate
ondragover
onmouseover
onbeforecopy
ondragstart
onmouseup
onbeforecut
ondrop
onmousewheel
onbeforedeactivate
onfocus
onmove
onbeforepaste
onfocusin
onmoveend
onblur
onfocusout
onmovestart
onclick
onhelp
onpage
oncontextmenu
onkeydown
onpaste
oncontrolselect
onkeypress
onresize
oncopy
onkeyup
onresizeend
oncut
onlosecapture
onresizestart
ondblclick
onmousedown
onscroll
ondeactivate
onmouseenter
onselectstart
ondragend
onmouseleave
-
ondragenter
onmousemove
-