Как внедрить скрипт для прослушивания событий ActiveX?

Я пытаюсь прослушивать события, запускаемые моим объектом ATL. Я обнаружил, что если я включу скрипт, как показано ниже, непосредственно в HTML страницы, он правильно уловит событие.

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

Однако сейчас я динамически создаю html-страницу, и мне просто нужно вставить фрагмент скрипта в тег заголовка. Я закодировал следующий метод, ошибок нет, но он не вызывает никаких событий, когда элемент управления находится на странице.

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)»

Есть ли какая-то зависимость от того, когда скрипт должен существовать в цикле загрузки страницы? (объект всегда создается после добавления тега script). Как еще я могу динамически добавить сценарий прослушивателя событий? Эта проблема возникает в IE7.


person Chris    schedule 22.10.2009    source источник


Ответы (2)


Не используйте setAttribute в документе HTML. Он имеет много ошибок в IE и, как правило, гораздо менее читаем, чем просто использование прямых свойств HTML DOM уровня 1:

tag.src= filePath;

Однако я не уверен, что вставка одного из странных элементов script for IE в DOM действительно работает. Может быть, это так, может быть, это не так, но это довольно уродливо. Не лучше ли attachEvent?

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

Я не использую объекты ATL, но следующее отлично работает с пользовательскими элементами управления и классами vb6/.net:

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

Как упоминалось bobince, setAttribute в IE содержит ошибки, особенно с атрибутом «for», который вместо этого ожидает эквивалент свойства DOM, то есть «htmlFor».

person Andy E    schedule 22.10.2009