同步javascript:设置输入值后如何继续执行脚本?
Synchronous javascript: How to continue script after input value is set?
我有这个javascript:
function getImage(input)
{
status++;
var base64 = $('#edit').croppie('result', {
type: 'base64',
size: 'viewport',
format: 'jpeg',
}).then(function(base64){
$('#input').val(base64); // THIS SHOULD BE SYNCHRONOUS
status--; // THIS SHOULD ONLY RUN AFTER THE #INPUT HAS ALREADY AN ASSIGNED VALUE ON THE PREVIOUS LINE
});
}
只有在上一行的 $('#input').val(base64);
安全完成后,我才需要执行带有 status--;
的行。
有什么简单的解决方法吗?
是什么让您认为不是? UI 可能还没有更新,因为 JS 在浏览器 UI 线程上运行,因此,UI 线程被阻塞,而 JS 仍然是 运行,但输入确实内部有正确的值。
document.getElementById("thebutton").addEventListener("click", () => {
var before = $("#theinput").val();
$("#theinput").val(13);
var after = $("#theinput").val();
alert("ok");
console.log(`before: '${before}' after: '${after}'`)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="theinput">
<button id="thebutton">click me</button>
因此,如果您真的只想在 UI 更新后继续,您需要为浏览器 return 设置一个超时(甚至可以为零)UI线程,它将更新UI,然后从事件循环中获取下一个js。
document.getElementById("thebutton").addEventListener("click", () => {
var before = $("#theinput").val();
$("#theinput").val(13);
var after = $("#theinput").val();
console.log(`before: '${before}' after: '${after}'`)
setTimeout(() => { alert("ok");}, 0);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="theinput">
<button id="thebutton">click me</button>
我有这个javascript:
function getImage(input)
{
status++;
var base64 = $('#edit').croppie('result', {
type: 'base64',
size: 'viewport',
format: 'jpeg',
}).then(function(base64){
$('#input').val(base64); // THIS SHOULD BE SYNCHRONOUS
status--; // THIS SHOULD ONLY RUN AFTER THE #INPUT HAS ALREADY AN ASSIGNED VALUE ON THE PREVIOUS LINE
});
}
只有在上一行的 $('#input').val(base64);
安全完成后,我才需要执行带有 status--;
的行。
有什么简单的解决方法吗?
是什么让您认为不是? UI 可能还没有更新,因为 JS 在浏览器 UI 线程上运行,因此,UI 线程被阻塞,而 JS 仍然是 运行,但输入确实内部有正确的值。
document.getElementById("thebutton").addEventListener("click", () => {
var before = $("#theinput").val();
$("#theinput").val(13);
var after = $("#theinput").val();
alert("ok");
console.log(`before: '${before}' after: '${after}'`)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="theinput">
<button id="thebutton">click me</button>
因此,如果您真的只想在 UI 更新后继续,您需要为浏览器 return 设置一个超时(甚至可以为零)UI线程,它将更新UI,然后从事件循环中获取下一个js。
document.getElementById("thebutton").addEventListener("click", () => {
var before = $("#theinput").val();
$("#theinput").val(13);
var after = $("#theinput").val();
console.log(`before: '${before}' after: '${after}'`)
setTimeout(() => { alert("ok");}, 0);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input id="theinput">
<button id="thebutton">click me</button>