如何在Javascript中处理ActiveX事件

时间:2020-03-06 14:53:54  来源:igfitidea点击:

这是这里答案的后续措施。

我有一个自定义ActiveX控件,该控件引发一个事件(带有" msg"参数的" ReceiveMessage"),该事件需要由Web浏览器中的Javascript处理。从历史上看,我们已经能够使用以下仅IE语法在不同项目上完成此任务:

function MyControl::ReceiveMessage(msg)
{
   alert(msg);
}

但是,当在将控件埋入其中的布局内时,Javascript无法找到该控件。具体来说,如果将其放入纯HTML页面中,则可以正常工作,但是,如果将其放入由<Form>标签包裹的ASPX页面中,则会出现" MyControl is undefined"错误。我们已经尝试了以下方面的变体:

var GetControl = document.getElementById("MyControl");
function GetControl::ReceiveMessage(msg)
{
   alert(msg);
}

...,但会导致Javascript错误" GetControl未定义"。

处理从ActiveX控件发送的事件的正确方法是什么?现在,我们只对让此功能在IE中起作用感兴趣。这必须是我们正在执行的自定义ActiveX控件。

谢谢。

解决方案

我可以使用以下脚本块格式来使其正常工作,但是我仍然好奇这是否是最好的方法:

<script for="MyControl" event="ReceiveMessage(msg)">
    alert(msg);
</script>

我认为MyControl :: ReceiveMessage示例不起作用,因为ActiveX控件使用不同的名称或者在不同的作用域中公开。

以示例GetControl :: ReceiveMessage为例,我认为函数定义是在设置GetControl引用之前进行解析的,因此它没有引用有效的对象,也无法将函数绑定到该对象。

我将通过使用MS脚本调试器并尝试确定该控件的默认引用是否存在不同名称或者不同范围(可能是表单的子项)来解决此问题。如果可以为控件确定正确的引用,则应该能够将功能与MSDN文章指定的Automagic ::方法正确绑定。

再想一想,引用可能是基于对象的名称而不是ID,因此请尝试同时设置两个:)

如果网页上有一个ID为" MyControl"的ActiveX元素,则JavaScript处理程序语法为:

function MyControl::ReceiveMessage(msg)
{
   alert(msg);
}

是的,但是如果我们正在使用带有继承的UserControl(ActiveX)的C(.NET 2.0)...
使其起作用的唯一方法是"扩展"事件的处理程序功能:
http://www.codeproject.com/KB/dotnet/extend_events.aspx?display=打印

以上来自我们朋友Werner Willemsens先生的项目链接已保存我的项目。
如果我们不这样做,则javascript无法绑定到事件处理程序。

由于他选择的示例,他以复杂的方式使用了"扩展名",但是如果我们使它简单,可以将句柄直接添加到事件本身,它也可以工作。
CActiveX应该支持" 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标记内有效。在此示例中,callback是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。我将对象标记放置在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);
}