IE8中的JavaScript事件原型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IE8中的JavaScript事件原型相关的知识,希望对你有一定的参考价值。

我正在尝试向Event原型添加方法。为了调用/设置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;
    };
}

似乎有效,as you can see here。这个小提琴在IE8,Firefox和Chrome中显示OK。但是,当我将其添加到脚本中时,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:我喜欢Pure javascript,所以请不要建议使用jQuery,prototypejs,dojo等作为解决方案。我刚刚摆脱了jQuery。 (我喜欢jQuery,但在这种情况下不需要它)


更新

恐怕情况已经恶化。我找到了this MSDN reference。整个页面涉及DOM Element原型。可以公平地说,它们在IE8中可用(在某种程度上)。在此页面上,此代码引起了我的注意:

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

可以在标题为"Powerful Scenarios"的部分中找到页面的约3/4分之三。在我看来,这与我想做的事情完全相同,但更重要的是:如果我通过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;
};
答案

我最近有(另一个)头脑风暴,我认为我找到了一种增强事件原型的更好方法。严格来说,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>是安全的,但是

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

另一答案

其标准与怪癖模式。 JSFiddle页面有一个DOCTYPE声明,尽管它是一个非常简单的<!DOCTYPE html>,它使渲染进入“标准”模式。可能是您的网页没有DOCTYPE,从而使渲染处于Quirks模式。将这个简单的DOCTYPE添加到我用您的提琴制作的页面后,它对我有用。

以上是关于IE8中的JavaScript事件原型的主要内容,如果未能解决你的问题,请参考以下文章

javascript中的事件学习总结

JavaScript课程——Day16(扩展原型上的方法继承)

点击网页中的一个按钮,找到该按钮触发的javascript事件的方法代码

javascript实现拖拽事件(兼容IE8)

兼容ie8,firefox,chrome浏览器的代码片段

总结javascript基础概念系列计划分为三个部分:作用域,事件循环,原型链。