JavaScript事件原型IE8JavaScript事件原型IE8(JavaScript Even

2019-05-12 07:14发布

我想一个方法添加到事件的原型。 为了调用/设置preventDefault() ,或者在IE-说话returnValue = false和-if desired- 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打破在第一行,说“事件没有定义”。 离开了"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:我喜欢纯JavaScript,所以请,不建议jQuery的,prototypejs,道场,...作为一个解决方案。 我刚刚摆脱了的jQuery。 (我喜欢jQuery的,但没有必要为它在这种情况下)


更新

事情已经采取了逆转,我害怕。 我发现这个MSDN参考 。 整个页面涉及DOM元素的原型。 这是很公平地说,他们是选择和使用在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;
};

Answer 1:

最近,我有(另一个)脑电波,和我想我找到了扩充事件原型的更好的方法。 严格来说, Event的原型是不是在IE浏览器访问(<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无所谓所有的东西:我一直在使用的测试了<!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>是安全的,但

希望这可以帮助别人...



Answer 2:

其标准与怪癖模式。 该页面的jsfiddle有一个DOCTYPE声明,尽管是非常简单一个, <!DOCTYPE html>即踢呈现到标准模式。 机会是你的网页没有留下怪癖模式呈现DOCTYPE。 补充说,简单的DOCTYPE到一个页面,我从你的小提琴建成后,它为我工作。



文章来源: JavaScript Event prototype in IE8