【发布时间】:2015-07-28 17:08:28
【问题描述】:
我的 JS 在 x 域 iframe 中交付,因此无法访问顶部窗口来确定元素位置。我读到的另一个用于确定元素是否在屏幕上的选项是“浏览器优化”,我相信它会在 iframe 中运行一些帧速率测试,并假设如果帧速率很慢,那是因为浏览器知道它不在屏幕上,因此没有优先处理它。
在 60fps 时,浏览器应尝试每 16.6666666667 毫秒以 1 帧为屏幕内容制作动画。每次帧速率低于 16.6666666667fps 时,我都会使用日志设置这个小提琴,但是当框在屏幕上或屏幕外滚动时似乎没有明显的区别:
var lastTime = 0;
var box = document.getElementById('box');
var slowIsGt = 16.6666666667;
function loop(time) {
var delay = time - lastTime;
var fps = 1000/delay;
//console.log(delay + ' ms, ' + fps);
if(delay>slowIsGt){
console.log('RENDERING SLOWER THAN ' + slowIsGt + ' ' +delay + ' ms, ' + fps);
}
updateAnimation();
requestAnimationFrame(loop);
lastTime = time;
}
function updateAnimation(){
if(box.style['text-shadow'] === '1px 1px 1px'){
box.style['text-shadow'] = '0 0 0';
}else{
box.style['text-shadow'] = '1px 1px 1px';
}
}
document.getElementById('startBtn').addEventListener('click', function(){
requestAnimationFrame(loop);
});
现场演示:https://jsfiddle.net/4xhpL4cw/1/
以前有没有人尝试过这样的事情?我看不出我如何得到一个可衡量的结果来清楚地说它是在屏幕上还是在屏幕外。这也会受到最终用户计算机 CPU 的巨大影响。网上资源很少,但这可能是我发现的最有用的东西:http://www.contextis.com/documents/2/Browser_Timing_Attacks.pdf
【问题讨论】:
-
这个错误似乎与页面可见性 API 属性有关,这些属性(在当前 Chrome 中)正确地没有执行 requestAnimationFrame 回调,但它们仅与切换的选项卡/窗口最小化有关。我正在寻找一种方法来利用浏览器自己对视口中内容的内部知识。处于活动选项卡/未最小化的顶部窗口中的 iframe 将报告页面可见性内容为可见/可见,无论它们是否在视口中。
标签: javascript performance iframe cross-domain requestanimationframe