Javascript requestAnimationFrame在显示确认对话框时给出了错误的时间戳(铬?)

Javascript requestAnimationFrame在显示确认对话框时给出了错误的时间戳(铬?),javascript,animation,chromium,Javascript,Animation,Chromium,我有一个简单的动画,它是使用requestAnimationFrame(出于演示目的改编自)。如果在动画之前我显示了一个确认对话框,则动画功能接收到的时间戳是错误的。第一个和第二个时间戳之间的差值等于从显示确认消息到单击“确定”按钮的时间。这种行为(bug?)在Chrome和Opera(都运行Chrome)中可见。Firefox和InternetExplorer11按预期运行。检查或选择下面的示例 const缓存={ 开始:空, 目标:空 }; 函数动画(时间戳){ 日志(时间戳); 如果(c

我有一个简单的动画,它是使用
requestAnimationFrame
(出于演示目的改编自)。如果在动画之前我显示了一个
确认
对话框,则动画功能接收到的时间戳是错误的。第一个和第二个时间戳之间的差值等于从显示
确认
消息到单击“确定”按钮的时间。这种行为(bug?)在Chrome和Opera(都运行Chrome)中可见。Firefox和InternetExplorer11按预期运行。检查或选择下面的示例

const缓存={
开始:空,
目标:空
};
函数动画(时间戳){
日志(时间戳);
如果(cache.start==null){
cache.start=时间戳;
}
var progress=timestamp-cache.start;
cache.target.style.left=Math.min(progress/10100)+“px”;
如果(进度<1000){
请求动画帧(动画);
}否则{
cache.target.style.left=0;
cache.start=null;
}
}
(功能(){
const target=document.getElementsByTagName(“div”)[0];
cache.target=target;
const cb=document.getElementsByTagName(“输入”)[0];
const btn=document.getElementsByTagName(“按钮”)[0];
btn.addEventListener(“单击”,函数(){
如果(cb.选中){
如果(确认(“只需单击“确定”即可开始动画,确定吗?”){
请求动画帧(动画);
}
}否则{
请求动画帧(动画);
}
})
})();
html,
身体{
填充:0;
保证金:0;
}
div{
宽度:50px;
高度:50px;
边框:1px纯黑;
背景颜色:黄绿色;
位置:绝对位置;
顶部:50px;
}
钮扣{
边缘顶部:20px;
}
开始
使用“确认”

我不得不说,我觉得这很有趣

在花了这么多时间之后,我可能已经为你找到了一个解决办法。你可以在这里看到

它的基本要点是,我替换了
requestAnimationFrame
提供的
performance.now()
DOMHighResTimeStamp
,它还返回一个
DOMHighResTimeStamp

const缓存={
开始:空,
目标:空,
时间:2000
};
函数动画(时间戳){
日志(时间戳);
如果(cache.start==null){
cache.start=时间戳;
}
var progress=timestamp-cache.start;
cache.target.style.left=Math.min(progress/10,cache.time/10)+“px”;
if(进度<缓存时间){
请求动画帧(动画);
}否则{
cache.target.style.left=0;
cache.start=null;
}
}
常量渲染=()=>{
requestAnimationFrame((时间戳)=>{
const performanceNow=performance.now();
制作动画(performanceNow)
});
}
(功能(){
const target=document.getElementsByTagName(“div”)[0];
cache.target=target;
const cb=document.getElementsByTagName(“输入”)[0];
const btn=document.getElementsByTagName(“按钮”)[0];
btn.addEventListener(“单击”,函数(){
如果(cb.选中){
const confirm=confirm(“只需单击“确定”即可开始动画,确定吗?”);
如果(已确认){
render();
}
}否则{
请求动画帧(动画);
}
})
})();
html,
身体{
填充:0;
保证金:0;
}
div{
宽度:50px;
高度:50px;
边框:1px纯黑;
背景颜色:黄绿色;
位置:绝对位置;
顶部:50px;
}
钮扣{
边缘顶部:20px;
}
开始
使用“确认”

一般来说,我建议您避免使用
确认
/
警告
类型的框,因为它们会阻塞线程,从而暂停计时器。@NicholasKyriakides我知道。我还记得,他们正在尝试完全移除它们。但在这个例子中,这是不相关的。在动画开始之前,线程被阻止并恢复。奇怪的是两个连续的动画帧时间戳之间的差异。做得很好!有趣的是,
performance.now()
requestAnimationFrame
的值不同。在我看来,这进一步证实了它是一个bug。@AndreiV是的,我不得不同意。你要去报告吗?祝你好运,你似乎犹豫不决?有兴趣了解报告程序的工作原理。当我有时间的时候,我必须仔细阅读。我认为这比写一个问题需要更多的时间。也就是说,我只需要找到时间。。。