Protokół JavaScript Event w IE8
Próbuję dodać metodę do prototypu zdarzenia. Aby zadzwonić / ustawićpreventDefault()
lub, w IE-speakreturnValue = false
i -jeśli pożądane-stopPropagation()
/ cancelBubble = true;
. Myślałem, że poniższy kod byłby wystarczający.
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;
};
}
Który wydaje się działać,jak widać tutaj. To skrzypce pokazujeOK
w IE8, firefox i chrome. Chociaż, kiedy dodam to do mojego skryptu, IE8 łamie pierwszą linię, mówiąc„Zdarzenie jest niezdefiniowane”. Pomijając"use strict";
nie robi żadnej różnicy.
Niechętnie spróbowałem tego też:
if (typeof Event === 'undefined')
{
var Event = window.Event || window.event;//FFS IE :-(
}
Ale bez skutku:Error: 'Event.prototype' is null or not an object
, więc mam jeszcze jedną linię. Chodzi o to, że cała metoda prototypowa jest kopią z mojego skryptu, ale czym tu jestem? Jakieś pomysły / sugestie?
Dzięki
PS: Lubię Pure JavaScript, więc proszę, nie sugeruj jQuery, prototypejs, dojo, ... jako rozwiązania. Właśnie pozbyłem się jQuery. (Lubię jQuery, ale w tym przypadku nie ma takiej potrzeby)
Aktualizacja
Obawiam się, że sprawy pogorszyły się. znalazłemto odniesienie do MSDN. Cała strona dotyczy prototypów DOM Element. Można śmiało powiedzieć, że są dostępne i nadają się do użycia w IE8 (do pewnego stopnia). Na tej stronie ten kod wpadł mi w oko:
Event.prototype.stopPropagation = function ()
{
this.cancelBubble = true;
};
Event.prototype.preventDefault = function ()
{
this.returnValue = false;
};
Można go znaleźć ~ 3/4 strony w dół, w sekcji zatytułowanej"Powerful Scenarios"
. Jest to, moim zdaniem, dokładnie to samo, co chcę zrobić, ale co więcej: jeśli spróbuję tego kodu za pośrednictwem jsfiddle, to nawet nie działa, podczas gdy mój jsfiddle (z moim kodem) działał na IE8. To tylko kilka ostatnich linii fragmentu kodu, ale o ile mogę to sprawdzić, te kilka wierszy kodu powinno działać dobrze. Zmieniłem je w następujący sposób:
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;
};