Domanda

Questo è in qualche modo il seguito di una risposta qui .

Ho un controllo ActiveX personalizzato che sta generando un evento (" ReceiveMessage " con un parametro " msg ") che deve essere gestito da Javascript nel programma di navigazione in rete. Storicamente siamo stati in grado di utilizzare la seguente sintassi solo IE per ottenere questo risultato su diversi progetti:

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

Tuttavia, quando si trova all'interno di un layout in cui è nascosto il controllo, Javascript non riesce a trovare il controllo. In particolare, se lo inseriamo in una semplice pagina HTML funziona bene, ma se lo inseriamo in una pagina ASPX racchiusa dal tag <Form>, otteniamo un & Quot; MyControl non è definito & Quot; errore. Abbiamo provato variazioni su quanto segue:

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

... ma provoca l'errore Javascript " GetControl non è definito. "

Qual è il modo corretto di gestire un evento inviato da un controllo ActiveX? Al momento siamo interessati solo a farlo funzionare in IE. Questo deve essere un controllo ActiveX personalizzato per quello che stiamo facendo.

Grazie.

È stato utile?

Soluzione

Sono stato in grado di farlo funzionare utilizzando il seguente formato di blocco di script, ma sono ancora curioso di sapere se questo è il modo migliore:

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

Altri suggerimenti

Ho già usato activex nelle mie applicazioni. inserisco i tag oggetto nel modulo ASP.NET e il seguente JavaScript funziona per me.

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, ma se si utilizza C # (.NET 2.0) con UserControl ereditato (ActiveX) ... L'unico modo per farlo funzionare è & Quot; Estensione di & Quot; funzionalità del gestore dell'evento: http://www.codeproject.com/KB/dotnet/extend_events. aspx? display = Stampa

Il link al progetto precedente del nostro amico Mr. Werner Willemsens ha salvato il mio progetto. In caso contrario, JavaScript non può essere associato al gestore eventi.

Ha usato " extension " in modo complesso a causa dell'esempio che ha scelto, ma se lo rendi semplice, collegando l'handle direttamente all'evento stesso, funziona anche. ActiveX C # dovrebbe supportare & Quot; ScriptCallbackObject & Quot; per associare l'evento a una funzione javascript come di seguito:

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

Ovviamente devi implementare IObjectSafety e le altre cose di sicurezza per farlo funzionare meglio.

Se nella tua pagina è presente un elemento ActiveX con ID "MyControl", la sintassi del gestore javascript è questa:

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

Ho trovato che questo codice funziona all'interno di un tag del modulo. In questo esempio, callback è un parametro di funzione passato da JavaScript al controllo ActiveX e callbackparam è un parametro dell'evento di callback generato all'interno del controllo activeX. In questo modo uso lo stesso gestore di eventi per qualsiasi tipo di evento, piuttosto che provare a dichiarare un gruppo di gestori di eventi separati.

  
    

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

         

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

  

Nel mio caso, avevo bisogno di un modo per creare dinamicamente controlli ActiveX e ascoltare i loro eventi. Sono stato in grado di far funzionare qualcosa del genere:

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

E quindi per registrare un gestore per 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);
}

Questo codice consente di utilizzare le chiusure e riduce al minimo l'ambito di eval ().

L'elemento <object> del controllo ActiveX deve essere già stato aggiunto al documento; in caso contrario, IE non troverà l'elemento e otterrai solo errori di script.

Penso che l'esempio MyControl :: ReceiveMessage non funzioni perché il controllo ActiveX viene esposto con un nome diverso o in un ambito diverso.

Con l'esempio GetControl :: ReceiveMessage, credo che la definizione della funzione venga analizzata prima che venga impostato il riferimento GetControl, quindi non fa riferimento a un oggetto valido e non può associare la funzione all'oggetto.

Vorrei attaccare questo problema utilizzando il debugger di script MS e cercando di determinare se esiste un riferimento predefinito per il controllo con un nome diverso o in un ambito diverso (possibilmente come figlio del modulo). Se è possibile determinare il riferimento corretto per il controllo, si dovrebbe essere in grado di associare correttamente la funzione con il metodo Automagic :: specificato dall'articolo MSDN.

Ancora una volta, il riferimento potrebbe essere basato sul nome dell'oggetto e non sull'ID, quindi prova a impostare entrambi :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top