13

Event.timeStamp

timeStamp 属性必须返回它被初始化的值。创建事件时,必须将属性初始化为自 1970 年 1 月 1 日 00:00:00 UTC 以来经过的毫秒数。

可以捕获两者new Eventdocument.createEvent相应地设置时间戳,但是如何拦截浏览器创建和调度的事件?

可以将一个事件侦听器(捕获阶段)添加到document侦听“每个”事件类型的事件侦听器中,并将 timeStamp 编写为接近调度时间,但这将是一个丑陋的 hack。

  • 有没有更好的模仿方式Event.timeStamp
  • new Event拦截/new CustomEventdocument.createEvent.是否有任何潜在的陷阱?
  • 是否有其他方式以编程方式创建事件?
  • 尽早添加事件侦听器document并手动设置是否有任何潜在问题?timeStamp
4

2 回答 2

4

我找不到任何地方来拦截由浏览器而不是用户代码生成的事件的创建。不过,您的“丑陋的黑客”似乎可以正常工作:

addEventListener("click", function (e) {
    Object.defineProperty(e, "timeStamp", {
        get: function () { return 4; }
    });
}, true);

显然,您必须使用您感兴趣的任何事件名称多次调用 addEventListener。请注意,timeStamp直接设置没有效果,但 defineProperty 有效。我只测试了 Chrome 和 IE9;我确信互操作会一团糟,因为我们使用的是 getter 方法。

于 2012-04-20T07:07:23.833 回答
1

另一种选择是在处理程序中添加时间戳。据推测,只有您编写的代码真正关心时间戳,并且由于您可以控制您编写的代码,因此您可以使用自己的“监听”辅助函数。就像是:

var myAddListener = function(name, fn, scope){
    addEventListener(name, function(e){
        if(!e.timeStamp) e.timeStamp = +new Date;
        fn.apply(scope || null, arguments);
    });
}

只要附加了与时间戳相关的代码,就可以了。请注意,我在使用时添加了一个“范围”参数……这是在类实例中使用侦听器时保留“this”的一种方便方法。

于 2012-05-23T07:35:19.230 回答