2013-07-16 13 views
12

Ich habe meinen IE von Version 10 auf 11 aktualisiert und festgestellt, dass mein benutzerdefiniertes ActiveX-Ereignis nicht funktionieren konnte.ActiveX benutzerdefiniertes Ereignis kann nicht auf IE11 funktionieren

Der Grund ist, dass IE11 attachEvent nicht mehr unterstützt, und scheint, muss ich addEventListener verwenden. Zum Beispiel zuvor verwendete ich

obj.attachEvent("onSelected", method1); 

und jetzt ist es

obj.addEventListener("onSelected",method1,false); 

Nach Änderung des Codes kann die method1 nicht ausgelöst werden. Ich habe keine Ahnung, wie man benutzerdefinierte Ereignisse, die im ActiveX-Plugin implementiert sind, an die JS-Methode bindet und es mit IE11 arbeiten lässt.

+0

Ich scheine, daran zu erinnern, wenn es von IE10 entfernt wurde, wurde es im Kompatibilitätsmodus zur Verfügung gehalten. Ich bin mir nicht sicher, ob IE11 das gleiche tut oder nicht. In welchem ​​Modus möchten Sie Ihre Seite ausführen? Hast du den Kompatibilitätsmodus ausprobiert? – Spudley

+0

Ich denke, du solltest das "on" von "onSelected" löschen, aber ich konnte meine ActiveX-Ereignisse auch nicht in IE11 finden. – Schmoo

Antwort

13

Der einzige Weg, die ich für IE 11 bisher gefunden wird unter Verwendung der for...event Skriptblöcke:

<script for="myActiveX" event="onSelected(param1, param2)"> 
    method1(param1, param2); 
</script> 
<object id="myActiveX" ...></object> 

Beide Elemente auch dynamisch mit JavaScript erstellt werden kann. Sie müssen nur sicherstellen, dass Sie das for Attribut mit dem setAttribute Verfahren eingestellt:

var handler = document.createElement("script"); 
handler.setAttribute("for", "myActiveX"); 
handler.event = "onSelected(param1, param2)";  
handler.appendChild(document.createTextNode("method1(param1, param2);")); 
document.body.appendChild(handler); 

var activeX = document.createElement("object"); 
activeX.id = "myActiveX"; 
activeX.codebase = "foobar.cab"; 
activeX.classid = "CLSID:123456789-1234-1234-1234-123456789012"; 
document.body.appendChild(activeX); 

älteren IE-Versionen (IE 8 und älter) nicht wie der oben genannten Code. Für diese älteren Browser müssen Sie die codebase Parameter und for Parameter mit der createElement Methode übergeben:

var handler = document.createElement('<script for="myActiveX">'); 
... 
var activeX = document.createElement('<object classid="CLSID:123456789-1234-1234-1234-123456789012">'); 

Neuere Browser eine Ausnahme ausgelöst wird, wenn Sie diesen Code zu begegnen so alle IE-Versionen unterstützen Sie diese Ausnahme abfangen müssen und verwenden Sie dann die andere Methode.

-6

ActiveX wurde in IE10 aus dem Browser entfernt. Die Technologie war alt und in einer HTML5-Welt zunehmend unnötig.

Sie erwähnen nicht, was das Plugin tat? Kann es jetzt mit Standardcode ersetzt werden?

+3

Die Verwendung von ActiveX-Steuerelementen (außer Flash) ist im "METRO" -Modus des IE-Browsers blockiert, nicht im Desktop-Modus. – EricLaw

1

Basierend auf kayahr Antwort habe ich eine Funktion erstellt, die die Ereignisregistrierung in IE 11 durchführt. Vielen Dank! Es hat für mich funktioniert!

Hier ist mein Code (nicht mit anonymen Funktionen als _functionCallback Parameter arbeiten):

function AttachIE11Event(obj, _strEventId, _functionCallback) { 
     var nameFromToStringRegex = /^function\s?([^\s(]*)/; 
     var paramsFromToStringRegex = /\(\)|\(.+\)/; 
     var params = _functionCallback.toString().match(paramsFromToStringRegex)[0]; 
     var functionName = _functionCallback.name || _functionCallback.toString().match(nameFromToStringRegex)[1]; 
     var handler; 
     try { 
      handler = document.createElement("script"); 
      handler.setAttribute("for", obj.id); 
     } 
     catch(ex) { 
      handler = document.createElement('<script for="' + obj.id + '">'); 
     } 
     handler.event = _strEventId + params; 
     handler.appendChild(document.createTextNode(functionName + params + ";")); 
     document.body.appendChild(handler); 
    }; 

Sie haben Browser verwenden Schnüffeln, und Ihr Code hat wie

if(BrowserDetect.browser == "IE" && BrowserDetect.version >= 11) 
    AttachIE11Event(obj, "onSelected", method1); 
else if(obj.attachEvent) 
    obj.attachEvent("onSelected", method1); 
else if(obj.addEventListener) 
    obj.addEventListener("onSelected", method1); 
2

Modifiziert schauen @ Gerrit-Code, der für anonyme Funktionen verwendet werden kann. Außerdem fügt er einfach attachEvent-Funktionalität zu IE 11 (und Polyfill für nicht-ie Browser, obwohl nicht getestet) hinzu, so dass derselbe Code verwendet werden kann. Ich bin froh, dass ich diese Seite gefunden habe. Ich hatte Angst, dass ich das in VBScript machen oder eine ältere Version von IE emulieren müsste.

Das Verhalten scheint bis zum IE5 identisch zu sein.

Polyfill

if (!window.attachEvent) { 
    window.attachEvent = Element.prototype.attachEvent = function (ename, efunction) { 
    if (typeof efunction !== 'function') { 
     throw new TypeError('Element.prototype.attachEvent - what is trying to be attached is not callable'); 
    } 

    // We got to append somewhere 
    var _body = document.getElementsByTagName('body')[0]; 

    // Get IE Version 
    var msie = (function() { 
     if (typeof document === "undefined") return false; 
     var v = 3, div = document.createElement('div'), a = div.all || []; 

     while (div.innerHTML = '<!--[if gt IE '+(++v)+']><br><![endif]-->', a[0]); 

     var _detection = v > 4 ? v : /*@[email protected]*/false; 

     var _version = _detection === true ? 10 : (!(window.ActiveXObject) && "ActiveXObject" in window) === true ? 11 : _detection; 

     return _version; 

    }()); 

    // Fix ActiveX not working 
    if (msie == 11) { 
     var _params = efunction.toString().match(/(\(.*\))\ *{/)[1]; 
     var _funcName = efunction.toString().match(/^function\s?([^\s(]*)/)[1]; 
     var _fixAnon = false; 

     // Allow for anonymous functions 
     if (_funcName == "") { 
     _fixAnon = true; 
     console.warn('Function name not found. Autogenerating'); 
     _funcName = "autogenFunction" + Math.floor(Math.random()*9999).toString() 
     var _handleFunctionality = "{ var privateFunc = " + efunction.toString() + "; privateFunc.apply(" + _funcName + ", arguments); }"; 
     } 

     // Only one script for|event can be used. Make sure there isn't one already 
     var _query = 'script[for=' + this.id + '][event=' + ename + ']'; 
     var _handle = document.querySelectorAll(_query); 
     var _handleFunc = _funcName + _params + ';'; 

     if (_fixAnon) { 
     var _newFuncName = _funcName + _params; 
     var _newFunction = "function " + _newFuncName + " " + _handleFunctionality; 
     var _newHandle = document.createElement('script'); 
     _newHandle.type = "text/javascript"; 
     _newHandle.appendChild(document.createTextNode(_newFunction)); 
     _body.appendChild(_newHandle); 
     } 

     // If script for|event exists, reuse it 
     if (_handle.length != 0) { 
     _handleFunc += _handle[0].textContent; 
     _body.removeChild(_handle[0]); 
     delete _handle[0]; 
     } 
     _handle = document.createElement('script'); 
     _handle.setAttribute("for", this.id); 
     _handle.event = ename; 
     var _handleText = document.createTextNode(_handleFunc); 
     _handle.appendChild(document.createTextNode(_handleFunc)); 
     _body.appendChild(_handle); 
    } 
    var _event = ename.substr(0,2) == "on" ? ename.substr(2) : ename; 

    // Polyfill for non ie browsers 
    if (window.addEventListener) this.addEventListener(_event, efunction, false); 
    } 
}

Beispiel Verwendung mit meinem ActiveX-Objekt

<script type="text/javascript"> 
function MyObject_ObjectEvent() { 
console.log('I am watching traditionally'); 
} 
var _elem = document.getElementById('MyObject'); 
_elem.attachEvent('ObjectEvent', function() { console.log('I am watching anonymously') }); 
_elem.attachEvent('ObjectEvent', MyObject_ObjectEvent); 
</script>