20

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

我有一个自定义 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 控件。

谢谢。

4

7 回答 7

13

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

<script for="MyControl" event="ReceiveMessage(msg)">
    alert(msg);
</script>
于 2008-09-30T11:58:46.507 回答
8

我以前在我的应用程序中使用过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);
}
于 2010-07-08T12:19:47.760 回答
5

好的,但是如果您使用带有继承的 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 和其他安全性东西才能使其更好地工作。

于 2008-12-19T01:29:00.833 回答
1

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

function MyControl::ReceiveMessage(msg)
{
   alert(msg);
}
于 2008-11-12T04:34:19.760 回答
1

我发现这段代码在表单标签中工作。本例中,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>

于 2009-01-09T03:58:50.533 回答
1

就我而言,我需要一种方法来动态创建 ActiveX 控件并监听它们的事件。我能够得到这样的工作:

//create the ActiveX
var ax = $("<object></object>", {
    classid: "clsid:" + clsid,
    codebase: install ? cabfile : undefined,
    width: 0,
    height: 0,
    id: '__ax_'+idIncrement++
})
.appendTo('#someHost');

然后为事件注册一个处理程序:

//this function registers an event listener for an ActiveX object (obviously for IE only)
//the this argument for the handler is the ActiveX object.
function registerAXEvent(control, name, handler) {
    control = jQuery(control);

    //can't use closures through the string due to the parameter renaming done by the JavaScript compressor
    //can't use jQuery.data() on ActiveX objects because it uses expando properties

    var id = control[0].id;

    var axe = registerAXEvent.axevents = registerAXEvent.axevents || {};
    axe[id] = axe[id] || {};
    axe[id][name] = handler;

    var script =
    "(function(){"+
    "var f=registerAXEvent.axevents['" + id + "']['" + name + "'],e=jQuery('#" + id + "');"+
    "function document." + id + "::" + name + "(){"+
        "f.apply(e,arguments);"+
    "}"+
    "})();";
    eval(script);
}

此代码允许您使用闭包并最小化 eval() 的范围。

ActiveX 控件的<object>元素必须已经添加到文档中;否则,IE 将找不到该元素,您只会得到脚本错误。

于 2012-05-11T19:07:12.560 回答
0

我认为 MyControl::ReceiveMessage 示例不起作用,因为 ActiveX 控件以不同的名称或在不同的范围内公开。

对于示例 GetControl::ReceiveMessage,我相信在设置 GetControl 引用之前解析函数定义,因此它不引用有效对象并且无法将函数绑定到对象。

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

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

于 2008-10-07T00:45:57.297 回答