Javascript 渲染大型元素集
如何使用“停止脚本编写对话框”呈现此对话框。任何解决方案都值得赞赏。提前谢谢Javascript 渲染大型元素集,javascript,jquery,Javascript,Jquery,如何使用“停止脚本编写对话框”呈现此对话框。任何解决方案都值得赞赏。提前谢谢 document.write("<ul>"); for(var i=0;i<1000000;i++){ document.write("<li>"); document.write("<div><input value='"+i+"'/></div>"); document.write("</li>");
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
document.write();
对于(var i=0;i首先,我假设这是一个理论讨论,因为任何页面设计都不应该考虑数百万个DOM元素。如果曾经认为可能有这么多元素,那么应该制定一个不同的设计,每次显示较小的数据窗口
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
要绕过无响应对话框,您必须将javascript进程分成若干部分,并分别执行每一部分,同时允许系统在各个部分之间处理其他事件。这通常是通过将工作分成若干部分,然后在setTimeout()上执行每一部分来完成的
。您可以在此处看到几个处理大型阵列的示例:
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
但是,此测试存在许多问题,因为您还必须停止使用document.write()
,因为一旦让系统在setTimeout()
操作之间处理其他事件,您就不能再使用document.write()
在解析流中插入新元素,因为文档将完成解析。相反,您必须更改为在DOM中的适当位置动态插入DOM元素
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
下面是一些代码:
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
function insertElements(num) {
var totalCntr = 0;
var chunkSize = 1000;
var parent = document.getElementById("container");
var progress = document.getElementById("progressCntr");
function doChunk() {
var chunkCntr = 0;
var fragment = document.createDocumentFragment();
while (chunkCntr < chunkSize && totalCntr < num) {
var li = document.createElement("li");
li.innerHTML = "<div><input value='" + totalCntr + "'/></div>";
fragment.appendChild(li);
++totalCntr;
++chunkCntr;
}
parent.appendChild(fragment);
progress.innerHTML = totalCntr;
if (totalCntr < num) {
setTimeout(doChunk, 0);
}
}
// start the whole thing
doChunk();
}
insertElements(100000);
函数插入元素(num){
var totalCntr=0;
var chunkSize=1000;
var parent=document.getElementById(“容器”);
var progress=document.getElementById(“progressCntr”);
函数doChunk(){
var-chunkCntr=0;
var fragment=document.createDocumentFragment();
while(chunkCntr
工作演示:
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
当前设置为100000个元素。如果您想尝试更高的值,欢迎使用(取决于系统的内存限制)
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
如果减小chunkSize
值,系统将在运行时对用户输入做出更大响应。如果增大chunkSize
值,整个端到端时间可能会更快
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
如果每个块都可以是它自己的DOM树,这样就可以在一个DOM操作中插入,那么这里的端到端时间会更快。但是,如果插入所有
元素,这是不可能的。在这里使用文档片段试图帮助解决这个问题,但最后,它仍然必须插入每个
自动插入文档,这确实会减慢此操作
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
注意:将工作分块可能会降低整体端到端性能。我没有尝试优化此代码的性能,而是想说明这一概念。首先,我假设这是一个理论讨论,因为任何页面设计都不应该考虑数百万个DOM元素。如果有的话它被认为可能有这么多的元素,然后一个不同的设计,涉及显示较小的窗口的数据在同一时间应该制定出来
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
要绕过无响应对话框,您必须将javascript进程分成若干部分,并分别执行每一部分,同时允许系统在各个部分之间处理其他事件。这通常是通过将工作分成若干部分,然后在setTimeout()上执行每一部分来完成的
。您可以在此处看到几个处理大型阵列的示例:
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
但是,此测试存在许多问题,因为您还必须停止使用document.write()
,因为一旦让系统在setTimeout()
操作之间处理其他事件,您就不能再使用document.write()
在解析流中插入新元素,因为文档将完成解析。相反,您必须更改为在DOM中的适当位置动态插入DOM元素
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
下面是一些代码:
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
function insertElements(num) {
var totalCntr = 0;
var chunkSize = 1000;
var parent = document.getElementById("container");
var progress = document.getElementById("progressCntr");
function doChunk() {
var chunkCntr = 0;
var fragment = document.createDocumentFragment();
while (chunkCntr < chunkSize && totalCntr < num) {
var li = document.createElement("li");
li.innerHTML = "<div><input value='" + totalCntr + "'/></div>";
fragment.appendChild(li);
++totalCntr;
++chunkCntr;
}
parent.appendChild(fragment);
progress.innerHTML = totalCntr;
if (totalCntr < num) {
setTimeout(doChunk, 0);
}
}
// start the whole thing
doChunk();
}
insertElements(100000);
函数插入元素(num){
var totalCntr=0;
var chunkSize=1000;
var parent=document.getElementById(“容器”);
var progress=document.getElementById(“progressCntr”);
函数doChunk(){
var-chunkCntr=0;
var fragment=document.createDocumentFragment();
while(chunkCntr
工作演示:
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
当前设置为100000个元素。如果您想尝试更高的值,欢迎使用(取决于系统的内存限制)
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
如果减小chunkSize
值,系统将在运行时对用户输入做出更大响应。如果增大chunkSize
值,整个端到端时间可能会更快
document.write("<ul>");
for(var i=0;i<1000000;i++){
document.write("<li>");
document.write("<div><input value='"+i+"'/></div>");
document.write("</li>");
}
document.write("</ul>");
如果每个块都可以是它自己的DOM树,这样就可以在一个DOM操作中插入,那么这里的端到端时间会更快。但是,如果插入所有
元素,这是不可能的。在这里使用文档片段试图帮助解决这个问题,但最终,它是错误的