Frage

Das ist so etwas wie ein Follow-up zu einer Antwort hier .

Ich habe ein ActiveX-Steuerelement, das ein Ereignis ( „ReceiveMessage“ mit einem „msg“ Parametern) wird erhöht, die im Web-Browser von Javascript behandelt werden muss. Historisch gesehen die folgende IE-only verwenden wir in der Lage gewesen Syntax dieses an verschiedenen Projekten zu erreichen:

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

Wenn jedoch in einem Layout, in dem die Steuer begraben wird, kann die Javascript nicht die Kontrolle finden. Insbesondere dann, wenn wir dies in eine einfache HTML-Seite setze es funktioniert gut, aber wenn wir es in eine ASPX-Seite von dem <Form> Tag verpackte, bekommen wir einen Fehler „MyControl nicht definiert ist“. Wir haben versucht, Variationen über das folgende:

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

... aber es ergibt sich die Javascript-Fehler "GetControl ist nicht definiert."

Was ist der richtige Weg, um ein Ereignis zu behandeln von einem ActiveX-Steuerelement gesendet? Im Moment sind wir nur daran interessiert, diese Arbeit im Internet Explorer. Dies hat ein ActiveX-Steuerelement für das, was wir tun.

Danke.

War es hilfreich?

Lösung

Ich war in der Lage zu bekommen diese Arbeit des folgenden Skript Blockformat, aber ich bin immer noch neugierig, ob dies der beste Weg ist:

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

Andere Tipps

Ich habe vor activex in meinen Anwendungen eingesetzt. Ich stelle das Objekt-Tags in der ASP.NET-Form und die folgende JavaScript funktioniert für mich.

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);
}

OK, aber wenn Sie C # (.NET 2.0) mit vererbten Usercontrol (ActiveX) verwenden ... Der einzige Weg, um es Arbeit zu machen, ist durch „Erweiterung“ der Handler Funktionalität Veranstaltung: http://www.codeproject.com/KB/dotnet/extend_events. aspx? display = drucken

Das oben gezeigte Projekt Link von unserem Freund Herr Werner Willemsens hat mein Projekt gespeichert. Wenn Sie das nicht tun, dass die Javascript nicht an den Ereignishandler binden kann.

Er die „Erweiterung“, die in einer komplexen Art und Weise durch das Beispiel wählte er aber, wenn man es einfach machen, den Griff direkt auf das Ereignis Befestigung selbst, es funktioniert auch. Die C # ActiveX sollte „ScriptCallbackObject“ unterstützt die Veranstaltung zu einer JavaScript-Funktion zu binden, wie unten:

  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;
  }

Natürlich haben Sie IObjectSafety und die anderen Sicherheits Sachen zu implementieren, um es besser zu arbeiten.

Wenn Sie ein ActiveX-Element auf Ihrer Seite haben, die eine ID von ‚MyControl‘ hat dann Javascript-Handler Syntax ist folgende:

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

Ich habe diesen Code in einem Formular-Tag funktioniert. In diesem Beispiel ist ein Callback-Funktion-Parameter von JavaScript auf die ActiveX-Steuerung übergeben und callbackparam ist ein Parameter, des Callback-Ereignisses innerhalb des Steuer activeX erzeugt. So kann ich verwende die gleichen Event-Handler für alle Art von Ereignissen, anstatt zu versuchen, eine Reihe von separatem Event-Handler zu erklären.

  
    

<object id="ActivexObject" name="ActivexObject" classid="clsid:15C5A3F3-F8F7-4d5e-B87E-5084CC98A25A"></object>

         

<script>
    function document.ActivexObject::OnCallback(callback, callbackparam){
    callback(callbackparam);
    }
    </script>

  

In meinem Fall musste ich einen Weg, um dynamisch ActiveX-Steuerelemente zu erstellen und ihre Veranstaltungen zu hören. Ich war in der Lage, so etwas zu Arbeit zu bekommen:

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

Und dann einen Handler für ein Ereignis registrieren:

//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);
}

Mit diesem Code können Sie Verschlüsse verwenden und minimiert den Umfang der eval ().

Das <object> Element ActiveX-Steuerelement muss bereits in das Dokument eingefügt werden; andernfalls IE wird das Element nicht finden und Sie werden nur Skriptfehler erhalten.

Ich denke, dass die MyControl :: ReceiveMessage Beispiel funktioniert nicht, weil das ActiveX-Steuerelement mit einem anderen Namen oder in einem anderen Bereich ausgesetzt zu sein.

Mit dem Beispiel GetControl :: ReceiveMessage, ich glaube, dass die Definition die Funktion analysiert wird, bevor der GetControl Bezug gesetzt wird, damit es nicht zu einem Objekt bezieht und die Funktion auf das Objekt nicht binden.

Ich würde dieses Problem anzugreifen, indem die MS Script Debugger und wenn eine Standardreferenz für die Steuerung zu bestimmen versucht, mit einem anderen Namen oder in einem anderen Bereich existiert (möglicherweise als Kind des Formulars). Wenn Sie die richtige Referenz für die Steuerung bestimmen können, sollten Sie in der Lage, die Funktion ordnungsgemäß mit dem Automagic :: Methode zu binden, der MSDN-Artikel gibt.

Ein weiterer Gedanke, der Verweis auf den Namen des Objekts basieren kann und nicht die ID, also versuchen Einstellung beides:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top