Question

C’est un peu la suite d’une réponse ici .

J'ai un contrôle ActiveX personnalisé qui déclenche un événement (& "ReceiveMessage &" avec un paramètre & "msg &";) qui doit être géré par Javascript dans le navigateur web. Historiquement, nous avons pu utiliser la syntaxe suivante pour IE uniquement sur différents projets:

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

Toutefois, lorsqu'il se trouve à l'intérieur d'une mise en page dans laquelle le contrôle est enterré, le Javascript ne peut pas trouver le contrôle. Spécifiquement, si nous mettons cela dans une page HTML simple, cela fonctionne bien, mais si nous le mettons dans une page ASPX encapsulée par la balise <Form>, nous obtenons un & "; MonContrôle est indéfini &"; Erreur. Nous avons essayé des variantes sur les éléments suivants:

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

... mais il en résulte une erreur Javascript & "; GetControl n'est pas défini. &";

Quel est le bon moyen de gérer un événement envoyé par un contrôle ActiveX? Pour le moment, nous ne souhaitons que faire fonctionner cela dans IE. Ce doit être un contrôle ActiveX personnalisé pour ce que nous faisons.

Merci.

Était-ce utile?

La solution

J'ai pu faire fonctionner cela en utilisant le format de bloc de script suivant, mais je suis toujours curieux de savoir si c'est le meilleur moyen:

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

Autres conseils

J'ai déjà utilisé activex dans mes applications. Je place les balises d'objet dans le formulaire ASP.NET et le code JavaScript suivant fonctionne pour moi.

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, mais si vous utilisez C # (.NET 2.0) avec UserControl (ActiveX) hérité ... Le seul moyen de le faire fonctionner est par & Quot; Extension & Quot; la fonctionnalité de gestionnaire d'événement: http://www.codeproject.com/KB/dotnet/extend_events. aspx? display = Imprimer

Le lien ci-dessus relatif au projet de notre ami M. Werner Willemsens a enregistré mon projet. Si vous ne le faites pas, le javascript ne peut pas être lié au gestionnaire d'événements.

Il a utilisé l'extension & "; extension &"; de manière complexe en raison de l'exemple qu'il a choisi, mais si vous simplifiez la tâche en associant directement le descripteur à l'événement lui-même, cela fonctionne également. L'ActiveX C # devrait prendre en charge & Quot; ScriptCallbackObject & Quot; pour lier l'événement à une fonction javascript comme ci-dessous:

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

Bien sûr, vous devez implémenter IObjectSafety et les autres éléments de sécurité pour améliorer son fonctionnement.

Si votre page contient un élément ActiveX dont l'identifiant est "MyControl", la syntaxe de votre gestionnaire javascript est la suivante:

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

J'ai trouvé ce code fonctionne dans une balise de formulaire. Dans cet exemple, callback est un paramètre de fonction transmis par javascript au contrôle ActiveX et callbackparam est un paramètre de l'événement de rappel généré dans le contrôle activeX. Ainsi, j'utilise le même gestionnaire d'événements pour tous les types d'événements, plutôt que d'essayer de déclarer un ensemble de gestionnaires d'événements distincts.

  
    

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

         

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

  

Dans mon cas, j'avais besoin d'un moyen de créer dynamiquement des contrôles ActiveX et d'écouter leurs événements. J'ai pu obtenir quelque chose comme ça pour fonctionner:

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

Et ensuite pour enregistrer un gestionnaire pour un événement:

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

Ce code vous permet d'utiliser des fermetures et réduit la portée de eval ().

L'élément <object> du contrôle ActiveX doit déjà être ajouté au document; sinon, IE ne trouvera pas l'élément et vous obtiendrez simplement des erreurs de script.

Je pense que l'exemple MyControl :: ReceiveMessage ne fonctionne pas car le contrôle ActiveX est exposé avec un nom ou une portée différente.

Avec l'exemple GetControl :: ReceiveMessage, je pense que la définition de la fonction est analysée avant que la référence GetControl ne soit définie, elle ne fait donc pas référence à un objet valide et ne peut pas lier la fonction à l'objet.

Je voudrais attaquer ce problème en utilisant le débogueur de script MS et en essayant de déterminer si une référence par défaut pour le contrôle existe avec un nom différent ou dans une portée différente (éventuellement en tant qu'enfant du formulaire). Si vous pouvez déterminer la référence correcte pour le contrôle, vous devriez pouvoir lier correctement la fonction à la méthode Automagic :: spécifiée dans l'article MSDN.

Une dernière pensée, la référence peut être basée sur le nom de l'objet et non sur l'ID, essayez donc de définir les deux:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top