2013-07-16 29 views
12

Uaktualniłem mój IE z wersji 10 na 11 i odkryłem, że moje niestandardowe zdarzenie ActiveX nie mogło działać.Zdarzenie niestandardowe ActiveX nie działa na IE11

Powód jest taki, że IE11 nie obsługuje już więcej attachEvent i wydaje mi się, że muszę użyć addEventListener. Na przykład wcześniej użyłem

obj.attachEvent("onSelected", method1); 

i teraz, to

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

Po zmianie kodu spowoduje method1 nie może zostać uruchomiony. Nie mam pojęcia, jak powiązać niestandardowe zdarzenie, które jest zaimplementowane w wtyczce ActiveX, z metodą JS i sprawić, by działało na IE11?

+0

wydaje mi przypomnieć, że kiedy został usunięty z IE10, było przechowywane i udostępniane w trybie zgodności. Nie jestem pewien, czy IE11 robi to samo, czy nie. W jakim trybie próbujesz uruchomić swoją stronę? Czy próbowałeś trybu zgodności? – Spudley

+0

Myślę, że zamierzałeś upuścić "włączony" z "onSelected", ale nadal nie byłem w stanie uzyskać moich zdarzeń ActiveX również w IE11. – Schmoo

Odpowiedz

13

Jedynym sposobem znalazłem do tej pory dla IE 11 stosuje bloki for...event Scenariusz:

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

Oba elementy mogą być również tworzone dynamicznie z JavaScript. Musisz tylko upewnić się, że ustawiony atrybut for z metodą setAttribute:

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

Starsze wersje IE (IE 8 i starszych) nie lubią powyższy kod. Dla tych starszych przeglądarkach należy przekazać parametr codebase parametru i for metodą createElement:

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

nowszych przeglądarek rzuci wyjątek, gdy napotyka ten kod tak, aby obsługiwać wszystkie wersje IE trzeba złapać ten wyjątek, a następnie użyj inna metoda.

-6

ActiveX został usunięty z przeglądarki w IE10. Technologia była stara i coraz bardziej niepotrzebna w świecie HTML5.

Nie wspominacie o tym, co robiła wtyczka? Czy można go teraz zastąpić standardowym kodem?

+3

Używanie formantów ActiveX (innych niż Flash) jest blokowane w trybie "METRO" przeglądarki IE, a nie w trybie pulpitu. – EricLaw

1

Na podstawie odpowiedzi na kayahr utworzyłem funkcję, która dokonuje rejestracji zdarzenia w IE 11. Dziękuję bardzo! To zadziałało dla mnie!

Oto mój kod (nie działa z anonimowych funkcji jako parametr _functionCallback):

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

Musisz użyć przeglądarki wąchania, a kod ma wyglądać

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

modyfikuje @ Kod Gerrit działa dla funkcji anonimowych, po prostu dodaje funkcję attachEvent z powrotem do IE 11 (i polyfill dla innych przeglądarek, choć nie testowany), więc można użyć tego samego kodu. Cieszę się, że znalazłem tę stronę. Obawiałem się, że będę musiał to zrobić w VBScript lub emulować starszą wersję IE.

Zachowanie wydaje się być takie samo, aż do IE5.

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

Przykład użycia z mojego obiektu ActiveX

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