Prototype d'événement JavaScript dans IE8

J'essaie d'ajouter une méthode au prototype de l'événement. Pour appeler / définir preventDefault() ou, dans IE-speak returnValue = false et -if-desire- stopPropagation() / cancelBubble = true; . Je pensais que le code ci-dessous aurait suffi.

 Event = Event || window.Event; //^^ makes the fiddle work on IE8 ^^ if(!(Event.prototype.stopEvent)) { Event.prototype.stopEvent = function(propagate) { "use strict"; propagate = (propagate ? true : false); if (this.preventDefault) { this.preventDefault(); if (propagate === false) { this.stopPropagation(); } } else { this.returnValue = false; this.cancelBubble = !propagate; } return this; }; } 

Ce qui semble fonctionner, comme vous pouvez le voir ici . Cette violon montre OK dans IE8, Firefox et Chrome. Cependant, lorsque j'ajoute ceci à mon script, IE8 se brise sur la première ligne, en disant «L'événement est indéfini» . Laisser "use strict"; Ne fait aucune différence du tout.

A contrecœur, j'ai essayé cela aussi:

 if (typeof Event === 'undefined') { var Event = window.Event || window.event;//FFS IE :-( } 

Mais en vain: Error: 'Event.prototype' is null or not an object , donc j'ai eu 1 ligne plus loin. La chose est, la méthode prototype entière est une pâte de copie de mon script, mais qu'est-ce que je regarde ici? Quelques idées / suggestions?
Merci

PS: J'aime Pure JavaScript, alors s'il vous plaît, ne suggérez pas jQuery, prototypejs, dojo, … en tant que solution. Je viens de me débarrasser de jQuery. (J'aime jQuery, mais il n'y a pas besoin dans ce cas)


Mettre à jour

Les choses ont pris un virage pour pire, j'ai peur. J'ai trouvé cette référence MSDN . La page entière traite des prototypes DOM Element. Il est assez juste de dire qu'ils sont disponibles et utilisables dans IE8 (dans une certaine mesure). Sur cette page, ce code m'a attiré l'attention:

 Event.prototype.stopPropagation = function () { this.cancelBubble = true; }; Event.prototype.preventDefault = function () { this.returnValue = false; }; 

On peut trouver ~ 3 / 4ths de la page vers le bas, dans la section intitulée "Powerful Scenarios" . Ceci est, à mon avis, exactement la même chose que je veux faire, mais en plus: si j'essaie ce code via jsfiddle, ça ne fonctionne même pas, alors que mon jsfiddle (avec mon code) a fonctionné sur IE8. Ce ne sont que les dernières lignes d'un extrait, mais dans la mesure où je peux travailler, ces quelques lignes de code devraient fonctionner très bien. Je les ai modifiés comme suit:

 Event.prototype.stopPropagation = function () { if (this.stopPropagation) { return this.stopPropagation(); } this.cancelBubble = true; }; Event.prototype.preventDefault = function () { if (this.preventDefault) { return this.preventDefault(); } this.returnValue = false; }; 

J'ai récemment eu une autre forme d'ondes cérébrales, et je pense avoir trouvé une meilleure façon d'augmenter le prototype de l'événement. À strictement parler, le prototype de l' Event n'est pas accessible dans IE (<9), mais je l'ai trouvé accessible si vous revenez d'une instance (bien, l'instance: window.event ). Voici donc un extrait qui fonctionne dans tous les principaux navigateurs (et IE8 – pas 7):

 (function() { function ol(e) {//we have an event object e = e || window.event; if (!e.stopEvent) { if (Object && Object.getPrototypeOf) {//get the prototype e = Object.getPrototypeOf(e); } else {//getting a prototype in IE8 is a bit of a faff, this expression works on most objects, though //it's part of my custom .getPrototypeOf method for IE e = this[e.constructor.toString().match(/(function|object)\s+([AZ][^\s(\]]+)/)[2]].prototype; } e.stopEvent = function(bubble) {//augment it (e references the prototype now bubble = bubble || false; if (this.preventDefault) { this.preventDefault(); if (!bubble) { this.stopPropagation(); } return this; } this.returnValue = false; this.cancelBubble = !bubble; return this; }; } alert(e.stopEvent ? 'ok' : 'nok');//tested, it alerts ok if (this.addEventListener) { this.removeEventListener('load',ol,false); return; } document.attachEvent('onkeypress',function(e) { e = e || window.event; if (e.stopEvent) {//another event, each time alerts ok alert('OK!'); } }); this.detachEvent('onload',ol); } if (this.addEventListener) { this.addEventListener('load',ol,false); } else { this.attachEvent('onload',ol); } })(); 

De cette façon, le doctype d'en-tête n'a pas d'importance: je l'ai testé en utilisant le <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> , et cela fonctionne dans FF, chrome et IE 8, aucun problème. En utilisant <!DOCTYPE html> pour être sûr, cependant

J'espère que ça aide quelqu'un …

Son mode Normes et Quirks. La page JSFiddle a une déclaration DOCTYPE, même si elle est incroyablement simple, <!DOCTYPE html> , qui lance le rendu en mode Standards. Les chances sont que votre page Web n'a pas de DOCTYPE qui laisse le rendu en mode Quirks. Après avoir ajouté ce DOCTYPE simple à une page que j'ai construite à partir de votre violon, cela a fonctionné pour moi.