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>
fonte
2014-10-17 16:40:43
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
Penso che volevi far cadere "on" da "onSelected", ma non sono ancora riuscito a ottenere i miei eventi ActiveX anche in IE11. – Schmoo