如何注入脚本来监听 activeX 事件?

Posted

技术标签:

【中文标题】如何注入脚本来监听 activeX 事件?【英文标题】:How to inject script to listen for activeX events? 【发布时间】:2010-12-08 22:57:16 【问题描述】:

我正在尝试侦听由我的 ATL 对象触发的事件。我发现如果我直接在页面的 html 中包含如下脚本,它会正确地获取事件。

<html>
<head>
<script event="genericScriptEvent(param0, param1, param2, param3, param4, param5,    param6, param7, param8)" for="CMyControl" type="text/javascript">
<.head>
...
</html>

但是,我现在动态创建 html 页面,只需将脚本片段注入到 head 标记中。我编写了以下方法,没有错误,但是一旦控件在页面上,它就不会引发任何事件。

function loadJavascriptEventHandler(element, filePath, objectName, callbackFunction)

    var head = element.doc.getElementsByTagName("head")[0];  
    var tag = element.doc.createElement('script'); 
    tag.setAttribute('type', 'text/javascript'); 
    tag.setAttribute('src', filePath );
    tag.setAttribute('for', objectName );
    tag.setAttribute('event', callbackFunction );
    head.appendChild(tag);   

其中“文件路径”只包含“genericScriptEvent(param0, param1, param2, param3, param4, param5, param6, param7, param8)”

页面加载周期中何时必须存在脚本是否存在某种依赖性? (对象总是在添加脚本标签后创建)。我还能如何动态添加事件侦听器脚本?这个问题出现在IE7中。

【问题讨论】:

【参考方案1】:

不要在 HTML 文档上使用 setAttribute。它在 IE 中有很多错误,并且通常比直接使用 DOM Level 1 HTML 属性的可读性要低得多:

tag.src= filePath;

但是,我不确定将 IE 的一个奇怪的 script for 元素插入 DOM 是否真的有效。也许它有,也许它没有,但它非常丑陋。 attachEvent 会不会更好?

var obj= document.getElementById(objectName);
obj.attachEvent('genericScriptEvent', function(param0, param1) 
    ...
);

【讨论】:

【参考方案2】:

我不使用 ATL 对象,但以下内容对我使用 vb6/.net 用户控件和类非常有用:

function CMyControl::EventName ()  //...Event handling code... 

正如 bobince 所提到的,IE 中的 setAttribute 是错误的,尤其是“for”属性,它需要 DOM 属性等价物,即“htmlFor”。

【讨论】:

以上是关于如何注入脚本来监听 activeX 事件?的主要内容,如果未能解决你的问题,请参考以下文章

.Net 的 ActiveX 事件

如何将 ActiveX 控件挂钩到事件/更改到我的视图模型中?

如何使用终端监听音量键事件?

XSS的那些事儿

IOC 控制反转Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )(代码片

在电脑中Active 是啥?