我正在尝试侦听我的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中会出现此问题。
答案 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”。