如何模拟Event.timeStamp

时间:2012-04-01 00:10:34

标签: javascript dom dom-events dom4

Event.timeStamp

  

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

可以同时捕获new Eventdocument.createEvent以相应地设置timeStamp,但是如何拦截浏览器创建和分派的事件?

可以将一个事件监听器(捕获阶段)添加到监听“每个”事件类型的document,并将timeStamp写入接近发送时间但这将是一个丑陋的黑客。

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

2 个答案:

答案 0 :(得分:3)

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

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

显然,您必须使用您感兴趣的任何事件名称多次调用addEventListener。请注意,直接设置timeStamp无效,但defineProperty可以正常工作。我只测试过Chrome和IE9;我确信互操作会很乱,因为我们使用的是getter方法。

答案 1 :(得分:1)

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

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

只要您的时间戳依赖于此代码,您就可以了。注意,我在它的时候添加了一个'scope'参数...当在类实例中使用监听器时,这是保存'this'的一种方便方法。