20

これは、ここでの回答のフォローアップのようなものです。

WebブラウザのJavascriptで処理する必要のあるイベント(「msg」パラメータを持つ「ReceiveMessage」)を発生させるカスタムActiveXコントロールがあります。これまで、さまざまなプロジェクトでこれを実現するために、次のIEのみの構文を使用することができました。

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

ただし、コントロールが埋め込まれているレイアウト内では、Javascriptはコントロールを見つけることができません。具体的には、これをプレーンHTMLページに入れると正常に機能しますが、<Form>タグでラップされたASPXページに入れると、「MyControlisundefined」エラーが発生します。以下のバリエーションを試しました。

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

...しかし、Javascriptエラー「GetControlisundefined」が発生します。

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 は、以下のようにイベントを JavaScript 関数にバインドする「ScriptCallbackObject」をサポートする必要があります。

  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

このコードはフォームタグ内で機能することがわかりました。この例では、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 に答える
1

ページに「MyControl」という ID を持つ ActiveX 要素がある場合、JavaScript ハンドラの構文は次のようになります。

function MyControl::ReceiveMessage(msg)
{
   alert(msg);
}
于 2008-11-12T04:34:19.760 に答える
0

ActiveX コントロールが別の名前または別のスコープで公開されているため、MyControl::ReceiveMessage の例は機能しないと思います。

GetControl::ReceiveMessage の例では、GetControl 参照が設定される前に関数定義が解析されているため、有効なオブジェクトを参照しておらず、関数をオブジェクトにバインドできません。

MS スクリプト デバッガーを使用して、コントロールの既定の参照が別の名前または別のスコープ (おそらくフォームの子として) で存在するかどうかを判断しようとすることで、この問題に対処します。コントロールの正しい参照を特定できれば、MSDN の記事で指定されている Automagic :: メソッドを使用して関数を適切にバインドできるはずです。

もう1つ考えてみると、参照はIDではなくオブジェクトの名前に基づいている可能性があるため、両方を設定してみてください:)

于 2008-10-07T00:45:57.297 に答える