- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如果可能的话,我正在寻找答案,甚至是一个好主意。
通常,作为对 IE8 及更早版本的修复,会使用与此类似的解决方法:
var addEvent = function(obj, e, cb) {
if(obj.attachEvent) {
return obj.attachEvent('on' + e, cb);
} else {
obj.addEventListener(e, cb, false);
return true;
}
}
然后程序员将始终使用 addEvent
而不是 addEventListener
。
有什么方法或要点可以创建一个 addEventListener
函数,当 attachEvent
未定义时它会环绕它?
我想这有点棘手,因为 EventTarget 可以是 DOM 元素、文档、窗口或其他东西。
最佳答案
这取决于你想回到多远。在 IE8 上,您可以扩展 Element.prototype
以向所有 HTML 元素添加功能,这至少完成了 90% 的工作。我很确定你不能在 IE6 中这样做(PrototypeJS 不得不求助于扩展单个 Element
实例),我不记得 IE7。不过,除非您的目标是东亚市场,否则您基本上可以忽略 IE7 和更早版本。
这是您如何执行此操作的示例:
(function() {
// Functions for IE
function stopPropagation() {
this.cancelBubble = true;
}
function preventDefault() {
this.returnValue = false;
}
function addEventUsingAttach(eventName, handler)
{
this.attachEvent("on" + eventName, function() {
var e = window.event;
e.stopPropagation = stopPropagation;
e.preventDefault = preventDefault;
handler.call(this, e);
});
}
// Function to add `addEvent` to the given target object
function extendIt(target)
{
if (target.addEventListener) {
target.addEvent = Element.prototype.addEventListener;
}
else {
target.addEvent = addEventUsingAttach;
}
}
// Add it to `Element.prototype` if we have it
if (typeof Element !== "undefined" &&
typeof Element.prototype !== "undefined") {
extendIt(Element.prototype);
}
// Add it to `window` and `document` (etc.)
extendIt(window);
extendIt(document);
})();
然后您手动扩展其他 EventTarget,例如 window
和 document
(请参阅上面代码 list 的末尾)。
原始答案:我最初误读了您的问题是关于添加 addEventListener
,特别是在 IE8 上,而事实上您的问题很明显不是 关于添加那个,但是添加你自己的 addEvent
。我将这个答案留给其他读者:
这取决于你想回到多远。在 IE8 上,您可以扩展 Element.prototype
以向其添加 addEventListener
,页面上的所有 HTML 元素都将使用它(见下文)。但是,您添加的 shim 不支持捕获阶段,因为 IE 在原生支持 addEventListener
之前不支持它。我很确定你不能在早期版本(IE7、IE6)上扩展 Element.prototype
,PrototypeJS 不得不回退到为旧版本的 IE 扩展特定元素。但它适用于 IE8。
扩展 Element.prototype
后,您必须手动扩展您提到的其他事件目标,但扩展 Element.prototype
完成了大部分工作。
但是,如果您这样做并包含第三方脚本,请注意它们可能会假设正确实现了 addEventListeneer
并完成了捕获阶段。
这是将 addEventListener
添加到 IE8 的基本垫片:
(function() {
function stopPropagation() {
this.cancelBubble = true;
}
function preventDefault() {
this.returnValue = false;
}
if (typeof Element !== "undefined" &&
typeof Element.prototype !== "undefined" &&
!Element.prototype.addEventListener) {
Element.prototype.addEventListener = function(eventName, handler, useCapture) {
if (useCapture) {
throw "Browser doesn't support capturing phase";
}
this.attachEvent("on" + eventName, function() {
var e = window.event;
e.stopPropagation = stopPropagation;
e.preventDefault = preventDefault;
handler.call(this, e);
});
};
}
})();
关于javascript - 是否可以扩展 EventTarget 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616538/
我试图弄清楚点击了哪个按钮,此代码在 IE 中运行良好,但如果我在 Chrome、Firefox 或 Safari 中运行,则它不会执行任何操作。在 firefox 中使用 firebug 时,我查看
如何设置EventTarget一个事件。 var myObj = {foo: 'bar'}; var event = new Event('eventName'); event.target = my
当前版本的 JavaScript 将 EventTarget 实现为类而不是接口(interface),因此您可以使用所有预期方法创建 EventTarget 实例。 我试图复制/粘贴 EventTa
我是 Fable/Elmish/React 的新手,我正在尝试了解转换 EventTarget 的语法,以便我可以访问 .value我能找到的所有例子都使用 input [ Value model.V
使用闭包库,您可以让任何对象能够调度扩展 goog.events.EventTarget 的事件。 .这目前可以使用 Dart 库吗? 我想它看起来像这样: #import('dart:html');
我想在我的客户端程序中创建一个自定义事件发射器。我正在引用此(稀疏)文档 EventTarget 我的实现尝试 var Emitter = function Emitter() { EventTa
我试图让扩展面板仅在点击箭头时展开,但是当我尝试编译它时,此功能 private _isExpansionIndicator(target: EventTarget): boolean { c
当我运行代码时: public onResize(event: Event) { console.log(event.target.innerWidth); //--solution-
我为 WebGL 程序导出了以下 JS 类: export default class MyClass extends EventTarget { constructor(gl) { su
我正在使用 selectionStart和 selectionEnd为了获得文本选择的起点和终点。 代码:https://codesandbox.io/s/busy-gareth-mr04o 但是,我
我已经构建了一个自定义 Input呈现 HTML 的 React 组件(想想包装器)输入元素。输入值时,更改会像这样传递给父组件: const handleChange = (event: Synth
嘿,我是 Typescript 的新手,在实现 Event Target 时遇到了一些问题。 Javascript 中使用的 event.target.matches 的 typescript 等价物
我收到以下关于事件类型的错误。错误:类型“EventTarget”上不存在属性“结果”。 我的.ts文件, select4File(event) { if (event.target.file
我遇到了无法摆脱的 JavaScript 错误:Uncaught TypeError: 无法在“EventTarget”上执行“addEventListener”:作为参数 2 提供的回调不是对象。
每当用户更改其浏览器大小时,我的 Web 应用程序必须自动调整 iframe 标记的大小。因此,最终效果就像一个 google g-mail,其中 gmail 应用程序自动调整包含邮件内容的 ifra
我的 .ts 文件中有一个 Javascript,它一直显示属性“result”在类型“EventTarget”上不存在??? imageUpload() { window.onload = func
如果可能的话,我正在寻找答案,甚至是一个好主意。 通常,作为对 IE8 及更早版本的修复,会使用与此类似的解决方法: var addEvent = function(obj, e, cb) {
我在高级编译模式下遇到错误。 Uncaught TypeError: Object # has no method 'attachEvent' 经过一些 source map 魔法后,我发现这是从 g
我正在尝试(也许是徒劳的)想出一种使用发布-订阅模式的方法,同时a) 使用no 库和b ) 最小化使用它的模块中的样板代码。到目前为止,我想到的最好的是: var handle = document.
当尝试在单击后访问按钮上的数据集时,出现此^错误。 linkProvider = (ev: React.SyntheticEvent) => { console.debug('ev.target'
我是一名优秀的程序员,十分优秀!