javascript - 了解事件时间戳的时间来源
问题描述
最近一些浏览器开始为他们的事件使用高分辨率 时间戳。与前一种方法的主要区别之一是此持续时间与系统纪元无关,而是与某个“时间起源”有关(大部分时间大约是加载文档的时间)。
问题是我找不到任何可靠的方法来检查浏览器是否使用高分辨率时间戳或以前的方法。
如果只比较事件时间戳是没有问题的,但是如果要比较事件时间戳和手工制作的时间戳,则需要知道他应该使用Date.now()
(相对于时代)还是precision.now()
(相对于时间起源)。
例如,虽然 safari mobile 支持性能 API,但某些版本(例如 iOS 11.1 中的版本)尚未将其事件切换为高分辨率时间戳。因此,以下代码片段会产生荒谬的巨大值,difference
因为start
结尾是高分辨率时间戳,而不是事件的时间戳。
const now = performance ? () => performance.now() : () => Date.now();
let start;
const update = e => {
if(e) e.preventDefault();
document.querySelector('#start').innerHTML = start;
document.querySelector('#event').innerHTML = e ? e.timeStamp : '';
document.querySelector('#diff').innerHTML = e ? e.timeStamp - start : '';
};
const reset = () => {
start = now();
update();
}
reset();
document.querySelector('#reset').addEventListener('click', reset);
document.querySelector('#pad').addEventListener('mousemove', update);
document.querySelector('#pad').addEventListener('touchmove', update);
#pad {
background-color: #C9DBFA;
border: 1px solid #778294;
border-radius: 10px;
width: 500px;
height: 100px;
color: #575E6C;
padding: .5em .75em;
}
#reset {
margin: 1em 0;
}
<div id="pad">
<strong>start time:</strong> <span id="start"></span>
<br/>
<strong>event time:</strong> <span id="event"></span>
<br/>
<strong>difference:</strong> <span id="diff"></span>
</div>
<button id="reset">reset</button>
解决方案
假设浏览器对所有时间戳一致地使用相同的机制,我建议简单地触发一个虚拟事件来预先进行测试:
var isPerformanceTimestamp = false;
if (performance) {
var performanceNow = performance.now();
document.addEventListener('test-performance', function(evt) {
isPerformanceTimestamp = evt.timeStamp - performanceNow < 1000; // or whatever threshold you feel comfortable with, it's at least 1530355731395 at the time of this writing ;-)
document.removeEventListener('test-performance', this);
});
var event = new Event('test-performance');
document.dispatchEvent(event);
}
推荐阅读
- c# - 如何在 Visual Studio 中运行作为 NuGet 包安装的 wkhtmltopdf(.exe)
- python - 在输入更改时更改散景数据源
- python - python中原始类型的多态调度?
- python - 当我运行我的脚本时,我在 Pygame 中获得了大约 1 FPS。我的代码中是什么导致了这种情况?
- c++ - 运行时检查失败 - 变量周围的堆栈已损坏
- python - PyCharm 能否突出显示 Python 2 特定代码以启用迁移?
- arrays - 使用 lodash 键入错误以从对象数组创建唯一数组
- azure - 通过 azure 函数导出 cosmosDB 并将文件保存在 blob 存储中
- c# - iTextSharp 从内容 PDF C# 中获取操作
- ansible - 应用于包含指令和 with_items 时忽略角色标签