Прототип события JavaScript в IE8

Я пытаюсь добавить метод в прототип события. Для того, чтобы позвонить / установитьpreventDefault() или, в IE-говоритьreturnValue = false и, если желательно,stopPropagation() / cancelBubble = true;, Я думал, что кода ниже было бы достаточно.

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

Который, кажется, работает,как вы можете видеть здесь, Эта скрипка показываетOK в IE8, Firefox и Chrome. Хотя, когда я добавляю это в свой скрипт, IE8 разрывается на первой строке, говоря'Event is undefined', Покидать"use strict"; не имеет значения вообще.

Я неохотно пробовал и это:

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

Но безрезультатноError: 'Event.prototype' is null or not an objectИтак, я получил 1 строку дальше. Дело в том, что весь метод-прототип является копией вставки из моего скрипта, но что я здесь упускаю? Есть идеи или предложения?
Спасибо

PS: I like Pure JavaScript, so please, don't suggest jQuery, prototypejs, dojo,... as a solution. I've just gotten rid of jQuery. (I like jQuery, but there is no need for it in this case)

Update

Боюсь, дела обернулись к худшему. я нашелэта ссылка MSDN, Вся страница посвящена прототипам DOM Element. Довольно справедливо сказать, что они доступны и применимы в IE8 (в некоторой степени). На этой странице этот код попался на глаза:

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

Его можно найти примерно на 3/4 части страницы в разделе под названием"Powerful Scenarios", На мой взгляд, это то же самое, что я хочу сделать, но что еще: если я попробую этот код через jsfiddle, он даже не будет работать, тогда как мой jsfiddle (с моим кодом) работал на IE8. Это всего лишь несколько последних строк фрагмента, но, насколько я понимаю, эти несколько строк кода должны работать просто отлично. Я изменил их следующим образом:

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;
};
 Elias Van Ootegem16 мая 2012 г., 13:08
Это все еще не объясняет, почему тот же код работает в скрипте, которую я настроил, но не на моей странице. Там все браузеры работают нормально, кроме IE8, который не работает в режиме причуд.
 Misha Reyzlin18 мая 2012 г., 13:07
Это все еще работает, если вы обращаетесь к полученному кадру напрямую?fiddle.jshell.net/v4sTx/4/show (извините, у меня нет доступного мне банкомата IE8 для тестирования)
 RobG16 мая 2012 г., 13:02
Чего вам не хватает, так это того, что хост-объектам не требуется реализовывать какое-либо наследование, тем более наследование прототипа. И даже если они это сделают, вы не можете ожидать их изменения. Кроме того, IE 8 реализует некоторые такие функции, но только в стандартном режиме, а не в режиме причуд. Таким образом, общее решение исключается до тех пор, пока IE 8 и другие браузеры, которые не реализуют наследование прототипов для объектов DOM, больше не используются. Это может быть довольно долго.
 Misha Reyzlin18 мая 2012 г., 13:34
Мое практическое предложение состояло бы в том, чтобы не страдать и обернуть функциональность событий своим собственным пространством имен и делегировать туда логику (что делают jQuery и другие), однако очень интересно, почему это происходит
 Elias Van Ootegem18 мая 2012 г., 13:19
@ gryzzly: Да, там тоже все отлично работает. Даже в режиме совместимости. Я не могу решить это вообще. Я пытался настроитьsecond one, Это тоже работает в IE8: -S, даже если я получаю доступ к кадру напрямую.

Ответы на вопрос(2)

Решение Вопроса

Недавно у меня была (другая) мозговая волна, и я думаю, что нашел лучший способ дополнить прототип события. Строго говоря,Event Прототип недоступен в IE (& lt; 9), но я обнаружил, что он доступен, если вы работаете с экземпляром (ну, экземпляр:window.event). Вот фрагмент кода, который работает во всех основных браузерах (и IE8 - не 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+([A-Z][^\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);
        }
})();

Таким образом, тип заголовка не имеет большого значения: я проверил его, используя<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">и он работает в FF, Chrome и IE 8, никаких проблем. С помощью<!DOCTYPE html> быть в безопасности, хотя

Надеюсь, это поможет кому-то ...

Его Стандарты против режима Причуд. Страница JSFiddle имеет объявление DOCTYPE, хотя и невероятно простое,<!DOCTYPE html>, который запускает рендеринг в режиме стандартов. Скорее всего, ваша веб-страница не имеет DOCTYPE, который оставляет рендер в режиме Quirks. После добавления этого простого DOCTYPE на страницу, которую я создал из вашей скрипки, это сработало для меня.

 21 мая 2012 г., 15:38
Черт возьми удобные методы на Event, кстати, я их краду! :)
 Elias Van Ootegem21 мая 2012 г., 19:01
Мои страницы имели тип документа, но не нотацию HTML5. Страница все равно отображается в стандартном режиме, но каким-то образом IE8 снова переключился в режим, совместимый с IE7. Однако переключение на тип документа HTML5 действительно работает. Я вроде бы предположил, что они пнули бы IE в режиме причуд, а не Стандарты ... Хорошо заметили, и спасибо
 22 мая 2012 г., 16:26
Просто быстрое примечание для тех, кто приходит после; Вы можете определить режим отображения страницы, проверивdocument.compatMode имущество. Значение & quot; CSS1Compat & quot; является стандартным режимом, все остальное (включая нуль) не является.

Ваш ответ на вопрос