如何在 Javascript 中处理 ActiveX 事件

IT技术 javascript events activex
2021-02-23 15:31:49

这在某种程度上是对此处答案的跟进

我有一个自定义 ActiveX 控件,它正在引发一个需要在 Web 浏览器中由 Javascript 处理的事件(带有“msg”参数的“ReceiveMessage”)。从历史上看,我们已经能够使用以下仅限 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 控件。

谢谢。

6个回答

我能够使用以下脚本块格式使其工作,但我仍然很好奇这是否是最好的方法:

<script for="MyControl" event="ReceiveMessage(msg)">
    alert(msg);
</script>
有没有人设法使这适用于具有 EventArgs 对象作为参数的方法
2021-04-25 15:31:49
似乎如果您在 <script for="... 标记中使用 :: 语法,那么它会执行您所说的操作 - 每次调用它时都会再次连接事件。如果您只是执行脚本或只是执行function :: 语法我认为它工作正常(不包括在 FORM 标签内的情况)。
2021-05-01 15:31:49
在互联网上的许多示例中 - 我看到了以下代码: <script for="MyControl" event="ReceiveMessage"> function ReceiveMessage(msg) { alert(msg); </script> 尽管上述方法可行,但请注意,如果您的事件将被多次触发,它会失败。当我将 ReceiveMessag 事件挂钩到 ActiveX 控件中的计时器时,我发现了这一点,该计时器在给定的时间间隔后触发。每次触发事件时,都会根据事件被触发的次数调用处理程序。(例如:第 1 次射击:1 次,第 2 次射击:2 次,第 3 次射击:3 次)。不知道为什么!答案?
2021-05-04 15:31:49
没关系,我想通了,ActiveX 界面中“涉及”的每种类型都需要 ComVisible
2021-05-05 15:31:49
从 IE 9 开始,如果使用 HTML 对象标记,则此事件连接方法有效。如果使用 "var ax = new ActiveXObject('myProgId')",则动态事件连接工作 -> "eval('function ax::EventInterfaceMethod(args){ return myJavaScriptMethod(args); }'"
2021-05-10 15:31:49

我以前在我的应用程序中使用过 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);
}
仅供参考:attachEvent 是特定于 IE 的,不适用于 Chrome,基于 WebKit 的相关方法名称是 addEventListener。并进一步澄清 camilin87 的帖子,这两种方法仅适用于标准事件类型,即 onclick、ontouch 等。不适用于自定义 ActiveX 的事件名称
2021-04-16 15:31:49
@TaudrisattachEvent()在动态创建控件时对我有用我有<object>动态创建标记,然后用于attachEvent()挂钩到对象的 ActiveX 事件。请注意,对于 IE11 模式,attachEvent()不可用,因此您提供的动态方法似乎是 IE11 的唯一选项。我创建了一个函数供我的应用程序使用,attachEvent()如果可用,但如果没有,请使用该eval()方法。
2021-04-22 15:31:49
@ewh我是指你我的问题答案,并在图书馆,我与任何ActiveX对象的事件注册处理写入。
2021-04-25 15:31:49
2021-04-29 15:31:49
自从我测试这个已经有一段时间了,但我相信.attachEvent()只有当控件是使用静态 HTML 创建的,或者可能document.write().
2021-05-01 15:31:49

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

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

由于他选择的例子,他以复杂的方式使用了“扩展”,但如果你让它简单,将句柄直接附加到事件本身,它也可以工作。C# ActiveX 应该支持“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 和其他安全性内容才能使其更好地工作。

如果您的页面上有一个 ID 为“MyControl”的 ActiveX 元素,那么您的 javascript 处理程序语法是这样的:

function MyControl::ReceiveMessage(msg)
{
   alert(msg);
}
如果 <object> 标签在表单内,我认为这不起作用。
2021-04-20 15:31:49
@FrankSchwieterman 此处理程序仅MyControl在全局范围内声明时才会响应也许只有表单之外的对象才能id在全局范围内获得它们
2021-05-01 15:31:49

我发现此代码在表单标记中有效。本例中,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>