Недавно некоторые браузеры начали использовать Высокое разрешение отметки времени для своих событий . Одно из основных отличий от предыдущего подхода заключается в том, что эта длительность относится не к эпохе системы, а к некоторому «источнику времени» (большую часть времени примерно в момент загрузки документа).
Проблема в том, что я не могу найти какой-либо надежный способ проверить, использует ли браузер метки времени высокого разрешения или предыдущий подход.
Это не проблема, если сравнивать только временные метки события, но если кто-то хочет сравнить временные метки события с ручными метками времени, нужно знать, должен ли он использовать 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>
Снимок экрана с iPad (iOS 11.1):