Pregunta

Esto es un poco de un seguimiento de la respuesta aquí.

Tengo un control ActiveX personalizado que es la generación de un evento ("ReceiveMessage" con un "msg" parámetro) que debe ser manejado por el Javascript en el navegador web.Históricamente hemos sido capaces de utilizar la siguiente IE-sólo la sintaxis para realizar esto en diferentes proyectos:

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

Sin embargo, cuando dentro de un diseño en el que el control es enterrado, el Javascript no puede encontrar el control.Específicamente, si ponemos esto en una simple página HTML que funciona bien, pero si la ponemos en una página ASPX envuelto por la <Form> etiqueta, obtenemos un "MyControl no está definido" error.Hemos tratado de variaciones en el siguiente:

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

...pero los resultados en el error de Javascript "GetControl es indefinido."

¿Cuál es la forma correcta de manejar un evento que se envían de un control ActiveX?Ahora mismo sólo estamos interesados en conseguir este trabajo en el IE.Esto tiene que ser un control ActiveX personalizado para lo que estamos haciendo.

Gracias.

¿Fue útil?

Solución

Yo era capaz de conseguir este trabajo mediante la siguiente secuencia de comandos de formato de bloque, pero todavía estoy curioso por saber si esta es la mejor manera:

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

Otros consejos

He utilizado activex en mis aplicaciones antes.me coloque el objeto de etiquetas en el ASP.NET la forma y el siguiente JavaScript que funciona para mí.

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, pero si usted está usando C# (.NET 2.0) con heredado UserControl (ActiveX)...La única forma de hacer el trabajo es por "Extender" el evento del controlador de la funcionalidad:http://www.codeproject.com/KB/dotnet/extend_events.aspx?display=Print

El proyecto anterior enlace de nuestro amigo el SeñorWerner Willemsens ha salvado mi proyecto.Si usted no hace que el javascript no se puede enlazar al controlador de eventos.

Él utilizó la "extensión" de una manera compleja debido a que el ejemplo que él eligió, pero si se puede hacer es simple, adjuntando el mango directamente al evento en sí, también funciona.El C# ActiveX debe apoyar "ScriptCallbackObject" para enlazar el evento a una función de javascript, como el de abajo:

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

Por supuesto, usted tiene que implementar IObjectSafety y la seguridad de otros cosas para hacer que funcione mejor.

Si usted tiene un elemento ActiveX en su página que tiene un id de 'MyControl', a continuación, su controlador de javascript sintaxis es esta:

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

He encontrado este código funciona dentro de una etiqueta de formulario.En este ejemplo, callback es una función del parámetro que se pasa en javascript para el control ActiveX, y callbackparam es un parámetro del evento de devolución de llamada que se genera dentro del control activeX.De esta manera puedo usar el mismo controlador de eventos para cualquier tipo de eventos, en lugar de tratar de declarar un montón de controladores de eventos independientes.

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

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

En mi caso, necesitaba una manera de crear dinámicamente los controles ActiveX y escuchar a sus eventos.Yo era capaz de conseguir algo como esto funcione:

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

Y, a continuación, registrar un controlador para un evento:

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

Este código permite el uso de cierres y minimiza el alcance de la eval().

El control de ActiveX <object> elemento ya debe agregarse al documento;de lo contrario, es decir, no va a encontrar el elemento y usted acaba de obtener errores de secuencia de comandos.

Creo que el MyControl::ReceiveMessage ejemplo no funciona debido a que el control ActiveX está siendo expuesta con un nombre diferente o en un ámbito diferente.

Con el ejemplo GetControl::ReceiveMessage, creo que la definición de la función está siendo analizado antes de la GetControl de referencia se establece, por lo tanto no se refiere a un objeto válido y no se puede obligar a la función del objeto.

Yo iba a atacar este problema mediante el depurador de secuencias de comandos de MS y tratando de determinar si un defecto de referencia para el control existe con un nombre diferente o en un ámbito diferente (posiblemente como un niño de la forma).Si usted puede determinar la referencia correcta para el control, usted debería ser capaz de obligar a la función correctamente con el Automagic ::método que el artículo de MSDN especifica.

Un pensamiento más, la referencia puede estar basado en el nombre del objeto y no el ID, así que trate de la configuración de ambos :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top