2013-07-16 14 views
12

Ho aggiornato il mio IE dalla versione 10 alla 11 e ho riscontrato che il mio evento personalizzato ActiveX non funzionava.L'evento personalizzato ActiveX non funziona su IE11

Il motivo è che IE11 non supporta più attachEvent e sembra che io debba usare addEventListener. Per esempio in precedenza ho usato

obj.attachEvent("onSelected", method1); 

e ora, è

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

Dopo aver modificato il codice, il Method1 non può essere attivato. Non ho idea di come associare l'evento personalizzato, implementato nel plugin ActiveX, al metodo JS e farlo funzionare su IE11?

+0

mi sembra di ricordare che quando è stato rimosso da IE10, è stato tenuto a disposizione in modalità di compatibilità. Non sono sicuro se IE11 faccia lo stesso o no. In quale modalità stai tentando di eseguire la tua pagina? Hai provato la modalità compat? – Spudley

+0

Penso che volevi far cadere "on" da "onSelected", ma non sono ancora riuscito a ottenere i miei eventi ActiveX anche in IE11. – Schmoo

risposta

13

L'unico modo che ho trovato finora per IE 11 sta usando i blocchi di script for...event:

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

Entrambi gli elementi possono anche essere creati dinamicamente con JavaScript. È solo necessario assicurarsi di impostare l'attributo for con il metodo 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); 

vecchie versioni di IE (IE 8 e più anziani) non mi piace il codice di cui sopra. Per questi browser più vecchi è necessario passare il parametro codebase parametri e for con il metodo createElement:

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

browser più recenti saranno un'eccezione quando incontra questo codice in modo di supportare tutte le versioni di IE è necessario rilevare questa eccezione e quindi utilizzare il altro metodo.

-6

ActiveX è stato rimosso dal browser in IE10. La tecnologia era vecchia e sempre più inutile in un mondo HTML5.

Non si parla di cosa stava facendo il plug-in? Può essere sostituito con un codice standard ora?

+3

L'uso di controlli ActiveX (diversi da Flash) è bloccato nella modalità "METRO" del browser IE, non in modalità Desktop. – EricLaw

1

In base alla risposta kayahr, ho creato una funzione che registra l'evento in IE 11. Grazie mille! Ha funzionato per me!

Ecco il mio codice (non funziona con le funzioni anonime come parametro _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); 
    }; 

È necessario utilizzare il browser sniffing, e il codice deve essere simile

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

Modifica @ Codice Gerrit per funzionare per funzioni anonime, inoltre aggiunge semplicemente la funzionalità attachEvent a IE 11 (e polyfill per i browser non ie, sebbene non testati) in modo da poter utilizzare lo stesso codice. Sono felice di aver trovato questa pagina. Avevo paura di doverlo fare in VBScript o emulare una versione precedente di IE.

Il comportamento sembra essere lo stesso fino a 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); 
    } 
}

Esempio di utilizzo con il mio oggetto 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> 
Problemi correlati