等待 Skulpt Javascript 函数中的事件发生
Wait for an event to occur within a function in Javascript for Skulpt
我想将 Sk.inputfun()
更改为 Skulpt,让用户输入 <textarea>
并按 ENTER
键提交。我需要将一个函数传递给 Skulpt 以获取用户输入,但是,除了 prompt()
之外,我找不到任何方法可以做到这一点。
我能想到的唯一方法是使用 setTimeout()
延迟 return 直到事件触发回车键按钮并更改标志。
var enterPressed = false;
$("#output").keyup(function(e){
if((e.keyCode || e.which) == 13) { //Enter keycode
enterPressed = true;
}
});
然后等待我的零钱:
Sk.configure({
inputfun: function (prompt) {
function checkFlag() {
if(enterPressed) {
enterPressed = false
return $('#output').val();
} else {
window.setTimeout(checkFlag, 100);
}
}
return checkFlag();
},
inputfunTakesPrompt: true,
output: outf,
read: builtinRead
});
但是,由于一些原因,这不起作用。 a) timeout 函数不能 return 一个值,并且 b) timeout 甚至不会延迟 return 函数,它只是 return 什么都没有。
我也尝试过使用 .done()
,但无法正常工作。
我在网上找不到任何方法可以做到这一点,任何帮助将不胜感激!
您需要 return 来自 inputfun 的 Promise,然后在 return 被按下时解决它。 (如果您不熟悉 Promises,它们非常值得一看 - 它们让您使用同步逻辑编写异步代码 )。
类似这样的事情(使用您的代码作为基础):
Sk.configure({
inputfun: function () {
// the function returns a promise to give a result back later...
return new Promise(function(resolve,reject){
$("#input").on("keyup",function(e){
if (e.keyCode == 13)
{
// remove keyup handler from #output
$("#input").off("keyup");
// resolve the promise with the value of the input field
resolve($("#input").val());
}
})
})
},
output: outf,
read: builtinRead
});
我假设 ID 为 input 的输入元素正在接收标准输入。查看您的 OP,您在谈论文本区域(尽管 JQuery .val() 应该可以正常工作)。根据您所谓的文本区域 ("output"),您的意图似乎是让 stdin 和 stdout 都包含一个共享的文本区域。如果是这样,我不确定您将如何区分 stdin 生成的内容和用户(随后)输入的内容。因此上面的代码假设有一个单独的输入字段。
我有一个与您类似的用例,我为 stdin 和 stdout 提供一个集成控制台的错觉是在我的输出末尾有一个 contenteditable 的跨度 div。在 keycode == 13 上,在我解决承诺并发回用户输入的内容之前,我将文本从输入范围中取出并将其附加到输出 div.
我想将 Sk.inputfun()
更改为 Skulpt,让用户输入 <textarea>
并按 ENTER
键提交。我需要将一个函数传递给 Skulpt 以获取用户输入,但是,除了 prompt()
之外,我找不到任何方法可以做到这一点。
我能想到的唯一方法是使用 setTimeout()
延迟 return 直到事件触发回车键按钮并更改标志。
var enterPressed = false;
$("#output").keyup(function(e){
if((e.keyCode || e.which) == 13) { //Enter keycode
enterPressed = true;
}
});
然后等待我的零钱:
Sk.configure({
inputfun: function (prompt) {
function checkFlag() {
if(enterPressed) {
enterPressed = false
return $('#output').val();
} else {
window.setTimeout(checkFlag, 100);
}
}
return checkFlag();
},
inputfunTakesPrompt: true,
output: outf,
read: builtinRead
});
但是,由于一些原因,这不起作用。 a) timeout 函数不能 return 一个值,并且 b) timeout 甚至不会延迟 return 函数,它只是 return 什么都没有。
我也尝试过使用 .done()
,但无法正常工作。
我在网上找不到任何方法可以做到这一点,任何帮助将不胜感激!
您需要 return 来自 inputfun 的 Promise,然后在 return 被按下时解决它。 (如果您不熟悉 Promises,它们非常值得一看 -
类似这样的事情(使用您的代码作为基础):
Sk.configure({
inputfun: function () {
// the function returns a promise to give a result back later...
return new Promise(function(resolve,reject){
$("#input").on("keyup",function(e){
if (e.keyCode == 13)
{
// remove keyup handler from #output
$("#input").off("keyup");
// resolve the promise with the value of the input field
resolve($("#input").val());
}
})
})
},
output: outf,
read: builtinRead
});
我假设 ID 为 input 的输入元素正在接收标准输入。查看您的 OP,您在谈论文本区域(尽管 JQuery .val() 应该可以正常工作)。根据您所谓的文本区域 ("output"),您的意图似乎是让 stdin 和 stdout 都包含一个共享的文本区域。如果是这样,我不确定您将如何区分 stdin 生成的内容和用户(随后)输入的内容。因此上面的代码假设有一个单独的输入字段。
我有一个与您类似的用例,我为 stdin 和 stdout 提供一个集成控制台的错觉是在我的输出末尾有一个 contenteditable 的跨度 div。在 keycode == 13 上,在我解决承诺并发回用户输入的内容之前,我将文本从输入范围中取出并将其附加到输出 div.