Я смог получить эту работу с помощью следующего формата блока сценария, но мне все еще любопытно, если это - лучший способ:
<script for="MyControl" event="ReceiveMessage(msg)">
alert(msg);
</script>
Хорошо, но если Вы используете C# (.NET 2.0) с наследованным UserControl (ActiveX)... Единственный способ заставить его работать путем "Расширения" функциональности обработчика события: http://www.codeproject.com/KB/dotnet/extend_events.aspx?display=Print
вышеупомянутая ссылка проекта от нашего друга г-на Werner Willemsens сохранила мой проект. Если Вы не делаете этого, JavaScript не может связать с обработчиком событий.
Он использовал "расширение" сложным способом из-за примера, который он выбрал, но если Вы делаете это простым, присоединяя дескриптор непосредственно к самому событию, это также работает. ActiveX C# должен поддерживать "ScriptCallbackObject" для привязки события с функцией JavaScript как ниже:
var clock = new ActiveXObject("Clocks.clock");
var extendedClockEvents = clock.ExtendedClockEvents();
// Here you assign (subscribe to) your callback method!
extendedClockEvents.ScriptCallbackObject = clock_Callback;
...
function clock_Callback(time)
{
document.getElementById("text_tag").innerHTML = time;
}
, Конечно, необходимо реализовать IObjectSafety и другой материал безопасности, чтобы заставить его работать лучше.
Я нашел этот код работами в теге form. В этом примере обратный вызов является параметром функции, переданным в JavaScript к элементу управления ActiveX, и callbackparam является параметром события обратного вызова, сгенерированного в элементе управления ActiveX. Таким образом, я использую тот же обработчик событий для любых типов событий, вместо того, чтобы попытаться объявить набор отдельных обработчиков событий.
<object id="ActivexObject" name="ActivexObject" classid="clsid:15C5A3F3-F8F7-4d5e-B87E-5084CC98A25A"></object>
<script>
function document.ActivexObject::OnCallback(callback, callbackparam){
callback(callbackparam);
}
</script>
Если у Вас есть элемент ActiveX на Вашей странице, которая имеет идентификатор 'MyControl' затем, Ваш синтаксис обработчика JavaScript - это:
function MyControl::ReceiveMessage(msg)
{
alert(msg);
}
Я думаю что MyControl:: пример ReceiveMessage не работает, потому что элемент управления ActiveX выставляется с другим именем или в другом объеме.
С примером GetControl:: ReceiveMessage, я полагаю, что функциональное определение анализируется, прежде чем ссылка GetControl устанавливается, таким образом это не относится к доступному объекту и не может связать функцию с объектом.
я принялся бы за решение этой проблемы при помощи отладчика сценариев MS и пытающийся определить, существует ли ссылка по умолчанию для управления с другим именем или в другом объеме (возможно как ребенок формы). Если можно определить корректную ссылку для управления, необходимо смочь связать функцию правильно с Автоволшебством:: метод, который указывает статья MSDN.
Еще одна мысль, ссылка может быть основана на названии объекта а не идентификатора, так попытайтесь установить обоих :)
Раньше я использовал activex в своих приложениях. Я помещаю теги объекта в форму ASP.NET, и у меня работает следующий код JavaScript.
function onEventHandler(arg1, arg2){
// do something
}
window.onload = function(){
var yourActiveXObject = document.getElementById('YourObjectTagID');
if(typeof(yourActiveXObject) === 'undefined' || yourActiveXObject === null){
alert('Unable to load ActiveX');
return;
}
// attach events
var status = yourActiveXObject.attachEvent('EventName', onEventHandler);
}