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

时间:2009-10-22 03:12:29

标签: javascript events activex atl

我正在尝试侦听我的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);   

}

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

在脚本必须存在于页面加载周期中是否存在某种依赖性? (该对象始终在添加脚本标记后创建)。我还能动态添加事件监听器脚本吗?在IE7中会出现此问题。

2 个答案:

答案 0 :(得分:1)

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

tag.src= filePath;

但是,我不确定在DOM中插入一个奇怪的script for元素实际上是有效的。也许它确实如此,也许它没有,但它非常难看。 attachEvent会不会更好?

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

答案 1 :(得分:0)

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

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

正如bobince所提到的,IE中的setAttribute是错误的,尤其是“for”属性,它期望DOM属性等效,即“htmlFor”。