У меня есть объект activex, который я загрузил на страницу html. Затем я использую этот объект activex для создания другого объекта, но мне нужно зарегистрировать событие с новым созданным объектом. Объект ожидает прослушиватель событий определенного типа.
Я могу загрузить эту же dll в C#, и она будет работать нормально. Код для C# выглядит так.
upload = obj.constructUploadObj(uploadConfig);
upload.stateChanged += new UploadActionEvents_stateChangedEventHandler(upload_stateChanged);
В javascript у меня есть аналогичный код, но я не могу зарегистрировать событие с помощью объекта.
uploadAction = obj.constructUploadObj(uploadConfig);
uploadAction.stateChanged = upload_stateChanged;
function upload_stateChanged(sender){
writeLine("uploadState changed " + sender.getState());
}
Я перечислил некоторые свойства объекта uploadAction в javascript, чтобы убедиться, что он действительно создан. Когда я пытаюсь зарегистрировать событие с помощью uploadAction, появляется сообщение об ошибке «Объект не поддерживает это свойство или метод».
Мне кажется, что он ожидает строго типизированного события. Есть ли способ зарегистрировать событие, подобное событию C# в javascript?
Заранее спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ваш javascript должен выглядеть примерно так:
function uploadAction::stateChanged( parms )
{
// ...
// implementation
// ...
}
Обратите внимание, что это объявление статической функции, предполагающее, что у вас есть объект Active X с именем 'uploadAction'. Я знаю, что это действительно работает - мы используем это в моей компании.
UploadAction не является объектом activex. Объект activex позволяет сказать, что axObj имеет конструктивную функцию axObj.constructUpload, которая создает объект uploadAction. Я вызвал функцию в uploadAction после ее создания, чтобы убедиться, что что-то там есть.
Сообщение об ошибке означает, что uploadAction не поддерживает свойство stateChanged. Ваш код javascript выглядит правильно, проблема, похоже, связана с объектом, к которому вы пытаетесь прикрепить обработчик событий.
Когда я загружаю dll в VS 2005 и ссылаюсь на объект загрузки, созданный в C#, свойство stateChanged появляется как событие, которому я могу назначить функцию обработчика. Как показано в приведенном выше коде.
Я бы предложил использовать расширенную модель регистрации событий, описанную здесь.
uploadAction.addEventListener('stateChanged', upload_stateChanged, false);
обратите внимание, вам может потребоваться опросить ваши аргументы для метода upload_stateChanged, поскольку первым аргументом должно быть состояние события. например: upload_stateChanged(evt, sender) ...
У компании выяснилось, что эти свойства недоступны через javascript. Им потребуется экстернализировать их для использования в javascript.
Если я попытаюсь написать такую функцию в своем JS, она полностью выйдет из строя.