更改表单中的值会导致延迟
Changing Values in a Form Causes Lag
我想每秒更改一次 a 的值,但是当我使用此代码时:
let btn = document.createElement("button");
function sleep (time) { // number of ms
return new Promise((resolve) => setTimeout(resolve, time));
}
btn.innerHTML = "Save", btn.onclick = function() {
var value = 0;
while (true){
sleep(1000).then(() => {if (value == 1){
document.getElementById("input").setAttribute('value', '1');
value += 1;
} else if (value == 2){
document.getElementById("input").setAttribute('value', '2');
value += 1;
} else if (value == 3){
document.getElementById("input").setAttribute('value', '3');
value += 1;
} else if (value == 4){
document.getElementById("input").setAttribute('value', '4');
value += 1;
} else if (value == 5){
document.getElementById("input").setAttribute('value', '5');
value += 1;
} else if (value == 6){
document.getElementById("input").setAttribute('value', '6');
value += 1;
} else if (value == 7){
document.getElementById("input").setAttribute('value', '7');
value += 1;
} else if (value == 8){
document.getElementById("input").setAttribute('value', '8');
value += 1;
} else if (value == 9){
document.getElementById("input").setAttribute('value', '9');
value += 1;
} else if (value == 0){
document.getElementById("input").setAttribute('value', '0');
value = 0;
}});
}
}, document.body.appendChild(btn);
选项卡完全锁定,我不得不重新加载它。我也尝试过使用 document.getElementById("input").value = "value";
,但这会导致同样的事情发生。有谁知道如何解决这个问题(表格没有名称)?
问题是你有一个经典的“忙循环”,它在执行 Javascript 代码时锁定浏览器,而不给浏览器机会做任何其他事情,比如更新 UI 或响应用户操作。
你的 while true
循环,里面没有 break
语句,只是永远 运行s。每次它 运行 时,你都会在那里放一个 Promise - sleep(1000).then(...)
的结果,但是那个 Promise 的解析永远不会有机会被观察到。 .then
不会在一秒钟后自动发生,无论发生了什么 - 它只会在浏览器事件循环将它安排到 运行 时发生,这在这里永远不会发生,因为你有永不结束的同步(阻塞)代码,但必须先 运行。
如果您希望效果每秒达到 运行,请不要使用循环,只需使用 setInterval
而不是 setTimeout
。您甚至不想在这里使用 Promises,因为 Promises 只能解析一次,而 setInterval
运行 它的处理程序不断。所以你只需要这样的东西:
btn.onclick = function() {
var value = 0;
setInterval(function() {/* what you had in the .then goes here */}, 1000);
};
我想每秒更改一次 a 的值,但是当我使用此代码时:
let btn = document.createElement("button");
function sleep (time) { // number of ms
return new Promise((resolve) => setTimeout(resolve, time));
}
btn.innerHTML = "Save", btn.onclick = function() {
var value = 0;
while (true){
sleep(1000).then(() => {if (value == 1){
document.getElementById("input").setAttribute('value', '1');
value += 1;
} else if (value == 2){
document.getElementById("input").setAttribute('value', '2');
value += 1;
} else if (value == 3){
document.getElementById("input").setAttribute('value', '3');
value += 1;
} else if (value == 4){
document.getElementById("input").setAttribute('value', '4');
value += 1;
} else if (value == 5){
document.getElementById("input").setAttribute('value', '5');
value += 1;
} else if (value == 6){
document.getElementById("input").setAttribute('value', '6');
value += 1;
} else if (value == 7){
document.getElementById("input").setAttribute('value', '7');
value += 1;
} else if (value == 8){
document.getElementById("input").setAttribute('value', '8');
value += 1;
} else if (value == 9){
document.getElementById("input").setAttribute('value', '9');
value += 1;
} else if (value == 0){
document.getElementById("input").setAttribute('value', '0');
value = 0;
}});
}
}, document.body.appendChild(btn);
选项卡完全锁定,我不得不重新加载它。我也尝试过使用 document.getElementById("input").value = "value";
,但这会导致同样的事情发生。有谁知道如何解决这个问题(表格没有名称)?
问题是你有一个经典的“忙循环”,它在执行 Javascript 代码时锁定浏览器,而不给浏览器机会做任何其他事情,比如更新 UI 或响应用户操作。
你的 while true
循环,里面没有 break
语句,只是永远 运行s。每次它 运行 时,你都会在那里放一个 Promise - sleep(1000).then(...)
的结果,但是那个 Promise 的解析永远不会有机会被观察到。 .then
不会在一秒钟后自动发生,无论发生了什么 - 它只会在浏览器事件循环将它安排到 运行 时发生,这在这里永远不会发生,因为你有永不结束的同步(阻塞)代码,但必须先 运行。
如果您希望效果每秒达到 运行,请不要使用循环,只需使用 setInterval
而不是 setTimeout
。您甚至不想在这里使用 Promises,因为 Promises 只能解析一次,而 setInterval
运行 它的处理程序不断。所以你只需要这样的东西:
btn.onclick = function() {
var value = 0;
setInterval(function() {/* what you had in the .then goes here */}, 1000);
};