3

给定一个事件的属性,该属性将以浏览器为前缀,我想创建一个 polyfill 使其看起来没有前缀。

例如,接口FooEvent有一个属性webkitBar,我想让它看起来就像bar这样,处理程序可以写成onFoo = function(e) { console.log(e.bar); }

我最初的笨拙猜测是在原型中注入一些东西FooEvent.prototype.getBar = function() { return this.webkitBar; }。但是,我不确定如何。

4

3 回答 3

4

仅限 ES5(和 IE8)

Object.defineProperty(FooEvent.prototype, "bar", {
  get: function () {
    return this.webkitBar;
  },
  configurable: true
});

请注意扩展主机对象。(FooEvent是一个宿主对象) 具有未知的副作用,并且是一大袋未定义的行为。

我推荐静态包装器

var eventUtil = {
  getBar: function (ev) {
    return ev.webkitBar;
  }
}

function handler (e) {
  var bar = eventUtil.getBar(e);
}
于 2011-11-15T04:32:57.080 回答
1

您可以向事件注册一个“第一个”处理程序来进行转换:

function adaptsBar(e) {
  e.bar = e.webkitBar;
}
于 2011-11-15T04:33:08.920 回答
0

这是帮助您入门的好资源。

http://addyosmani.com/blog/writing-polyfills/

于 2011-11-15T05:05:29.990 回答