Javascript 如何模拟Event.timeStamp
timeStamp属性必须返回其初始化为的值。创建事件时,必须将属性初始化为自1970年1月1日UTC 00:00:00以来经过的毫秒数 可以捕获Javascript 如何模拟Event.timeStamp,javascript,dom,dom-events,dom4,Javascript,Dom,Dom Events,Dom4,timeStamp属性必须返回其初始化为的值。创建事件时,必须将属性初始化为自1970年1月1日UTC 00:00:00以来经过的毫秒数 可以捕获newevent和document.createEvent来相应地设置时间戳,但是如何拦截浏览器创建和发送的事件呢 可以在文档中添加一个事件侦听器(捕获阶段),侦听“每一个”事件类型,并将时间戳写在调度时间附近,但这将是一个丑陋的攻击 有没有更好的方法来模拟事件时间戳 拦截新事件/新自定义事件和文档.createEvent是否存在任何潜在陷阱 是否有
newevent
和document.createEvent
来相应地设置时间戳,但是如何拦截浏览器创建和发送的事件呢
可以在文档中添加一个事件侦听器(捕获阶段),侦听“每一个”事件类型,并将时间戳写在调度时间附近,但这将是一个丑陋的攻击
- 有没有更好的方法来模拟
事件时间戳
- 拦截
新事件
/新自定义事件
和文档.createEvent
是否存在任何潜在陷阱李>
- 是否有其他方法以编程方式创建事件
- 将事件侦听器添加到
文档
和尽早手动设置时间戳
是否存在任何潜在问题
我找不到任何地方可以拦截由浏览器而不是用户代码生成的事件的创建。不过,你的“丑恶黑客”似乎还不错:
addEventListener("click", function (e) {
Object.defineProperty(e, "timeStamp", {
get: function () { return 4; }
});
}, true);
显然,无论您对什么事件名称感兴趣,都必须多次调用addEventListener。请注意,直接设置时间戳
无效,但defineProperty有效。我只测试了Chrome和IE9;我确信互操作会很混乱,因为我们使用的是getter方法。另一个选项是在处理程序中添加时间戳。据推测,只有您编写的代码才真正关心时间戳,因为您可以控制您编写的代码,所以您可以使用自己的“listen”helper函数。比如:
var myAddListener = function(name, fn, scope){
addEventListener(name, function(e){
if(!e.timeStamp) e.timeStamp = +new Date;
fn.apply(scope || null, arguments);
});
}
只要您的时间戳相关代码附带了这个,您就可以了。注意,当我在类实例中使用侦听器时,我添加了一个“scope”参数……这是一种保存“this”的简便方法 到底是什么问题?出于好奇,模拟事件。时间戳有什么好处?@Adel能够找出事件发生的时间。我也想更清楚地了解你为什么要这样做-我知道你想知道事件发生的时间-但目的是什么?你能为这种功能给出一个用例吗?@pomeh现代浏览器有它,一些浏览器的实现有缺陷,一些浏览器没有它。你如何确保这个事件监听器在所有其他监听器监听“点击”之前得到executer?giorgiga它在全局窗口对象上的捕获阶段,因此,在执行之前,唯一可以执行的是在窗口
上定义的其他捕获阶段事件侦听器,这是非常罕见的。您认为如何添加对时间戳
属性的检查?