javascript - Javascript一次打印输出一个而不是一次打印整个页面?
问题描述
只是玩了一下,但注意到加载页面花费的时间太长了,无论如何要让它一次打印一行而不是等到整个页面加载。
limits(){
var a = 0;
for (var i = 0; i < 1000; i++) {
for (var ii = 0; ii < 1000; ii++) {
document.getElementById('foo').innerHTML += "<p>" + a + "</p>";
a * 2;
}
}
}
现在,我如何能够更好地控制它到哪里,无论加载打印需要多长时间,甚至放慢它都可以。
解决方案
javascript 方法window.requestAnimationFrame(callback)
将在下一个动画帧上调用您的回调函数。它通常用于动画,并且可能适用于您正在做的事情。
要修改您的代码以使用requestAnimationFrame
,您必须让您的函数自己打印一个小块,并提供参考以了解要打印的块。例如,如果您将页面内容存储在一个数组中,那可能只是一个起始索引和一个长度。由于您正在打印 2 的递增幂,因此您只需传入 2 的最后一次幂以及每次运行该函数时要打印的行数。
您还需要一个退出条件——limits
如果为真,则在不请求下一帧的情况下返回。我只是对 的值设置了一个硬上限a
,但您也可以检查索引是否小于数组长度(对于我上面的页面内容数组想法)。
因为requestAnimationFrame
将函数名称作为回调传递,所以不能将参数传递给它。因此,您必须使用bind
排序将值附加到函数。然后,在函数中,您可以使用this
. config
只是一个对象,用于保存您希望函数具有的初始参数,然后绑定它,这允许您在函数中使用this.numLines
and访问它们this.a
。
然后,当您请求下一帧时,您必须limits
再次绑定这些值。如果您可以保持论点不变,您可以这样做limits.bind(this)
。但是如果你想改变它们,你可以用我写的类似的方式创建另一个对象,config
然后绑定它。
以下代码似乎是您正在寻找的大致内容的基本示例:
var foo = document.getElementById('foo');
var maxA = 1000000000000000000000000000000000;
function limits() {
for(var i=0; i<this.numLines; ++i) {
foo.innerHTML += "<p>" + this.a + "</p>";
this.a *= 2;
if(this.a > maxA) {
return;
}
}
requestAnimationFrame(limits.bind(this));
}
config = {
numLines: 3,
a: 1
};
requestAnimationFrame(limits.bind(config));
并在 JSFiddle here中实现。我还实现了一个版本,它将每一行放在页面顶部(而不是将其附加到底部),以便您可以更好地看到它的发生(您可以在此处找到)。
推荐阅读
- python - 在 Python 中使用 seaborn 制作实心轮廓
- kubernetes - Kubernetes - API Server / etcd 如何知道每个 Pod 的状态?
- reactjs - redux-form 不适用于 gatsby.js 上的登录表单
- ios - 在iOS中的两个对齐标签中调整文本大小
- security - Symfony 4:无法访问管理员角色。拒绝访问
- django - 带有窗口函数的 Django ORM 子查询
- r - 转换为事务规则时出现错误“只能使用原子组件强制列表”
- javascript - 响应式粘性汉堡导航栏
- r - 如何向数据框中添加一列,以使添加的值增加 R 中的总行数?
- python - 分解从 API 调用返回的字典列表