gpt4 book ai didi

IE8 中的 JavaScript 事件原型(prototype)

转载 作者:搜寻专家 更新时间:2023-11-01 04:10:44 24 4
gpt4 key购买 nike

我正在尝试向事件原型(prototype)添加一个方法。为了调用/设置 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 .此 fiddle 在 IE8、firefox 和 chrome 中显示 OK。但是,当我将此添加到我的脚本时,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 行。问题是,整个原型(prototype)方法是从我的脚本中复制粘贴的,但我在这里忽略了什么?有什么想法/建议吗?
谢谢

PS:我喜欢纯 JavaScript,所以请不要建议将 jQuery、prototypejs、dojo 等作为解决方案。我刚刚摆脱了 jQuery。 (我喜欢 jQuery,但在这种情况下不需要它)


更新

恐怕事情变得更糟了。我找到了 this MSDN reference .整个页面都在处理 DOM 元素原型(prototype)。可以很公平地说它们在 IE8 中可用和可用(在某种程度上)。在这个页面上,这段代码引起了我的注意:

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

它可以在页面下方的 ~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;
};

最佳答案

我最近有了(另一个)灵​​感,我想我找到了一种更好的方法来增强事件原型(prototype)。严格来说,Event原型(prototype)在 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);
}
})();

那样的话,header 文档类型就没有那么重要了:我已经使用 <!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>不过为了安全

希望这对某人有帮助...

关于IE8 中的 JavaScript 事件原型(prototype),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10617014/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com