event javascript events activex

event.preventdefault() javascript



Cómo manejar un evento ActiveX en Javascript (7)

Pude hacerlo funcionar con el siguiente formato de secuencia de comandos, pero todavía tengo curiosidad de saber si es la mejor manera:

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

Esto es algo así como un seguimiento de una respuesta aquí .

Tengo un control ActiveX personalizado que genera un evento ("ReceiveMessage" con un parámetro "msg") que necesita ser manejado por Javascript en el navegador web. Históricamente, hemos podido utilizar la siguiente sintaxis de IE para lograr esto en diferentes proyectos:

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

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

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

... pero da como resultado el error de Javascript "GetControl no está definido".

¿Cuál es la forma correcta de manejar un evento enviado desde un control ActiveX? En este momento, solo estamos interesados ​​en hacer que esto funcione en IE. Esto tiene que ser un control ActiveX personalizado para lo que estamos haciendo.

Gracias.


Creo que el ejemplo MyControl :: ReceiveMessage no funciona porque el control ActiveX se está exponiendo con un nombre diferente o en un ámbito diferente.

Con el ejemplo GetControl :: ReceiveMessage, creo que la definición de la función se analiza antes de que se establezca la referencia GetControl, por lo que no se refiere a un objeto válido y no puede vincular la función al objeto.

Atacaría este problema utilizando el depurador de MS Script e intentando determinar si existe una referencia predeterminada para el control con un nombre diferente o en un ámbito diferente (posiblemente como un elemento secundario del formulario). Si puede determinar la referencia correcta para el control, debe poder enlazar la función correctamente con el método Automagic :: que el artículo de MSDN especifica.

Un pensamiento más, la referencia puede estar basada en el nombre del objeto y no en el ID, así que intente configurar ambos :)


Si tiene un elemento ActiveX en su página que tiene una identificación de ''MyControl'', entonces la sintaxis de su gestor de JavaScript es esta:

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


Encontré que este código funciona dentro de una etiqueta de formulario. En este ejemplo, la devolución de llamada es un parámetro de función pasado por javascript al control ActiveX, y callbackparam es un parámetro del evento de devolución de llamada generado dentro del control ActiveX. De esta forma, uso el mismo controlador de eventos para cualquier tipo de evento, en lugar de tratar de declarar un grupo de manejadores de eventos por separado.

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

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


He usado activex en mis aplicaciones antes. coloco las etiquetas de objeto en el formulario ASP.NET y el siguiente JavaScript 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); }


En mi caso, necesitaba una forma de crear dinámicamente controles ActiveX y escuchar sus eventos. Pude hacer algo como esto para trabajar:

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

Y luego 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 le permite usar cierres y minimiza el alcance de eval ().

El elemento <object> del control ActiveX ya debe agregarse al documento; de lo contrario, IE no encontrará el elemento y obtendrá errores de scripts.


OK, pero si está usando C # (.NET 2.0) con UserControl heredado (ActiveX) ... La única manera de hacerlo funcionar es "Extendiendo" la funcionalidad del controlador del evento: http://www.codeproject.com/KB /dotnet/extend_events.aspx?display=Print

El enlace del proyecto anterior de nuestro amigo el Sr. Werner Willemsens ha salvado mi proyecto. Si no lo hace, el javascript no se puede vincular al controlador de eventos.

Utilizó la "extensión" de una manera compleja debido al ejemplo que eligió, pero si lo hace simple, adjuntar el identificador directamente al evento en sí, también funciona. El ActiveX de C # debería admitir "ScriptCallbackObject" para vincular el evento a una función de JavaScript como la siguiente:

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, debe implementar IObjectSafety y otras cuestiones de seguridad para que funcione mejor.