我想更改Skulpt的Sk.inputfun()
,让用户输入<textarea>
并点击ENTER
密钥进行提交。我需要将单个函数传递给Skulpt以获取用户输入,但是,除了prompt()
之外,我找不到任何方法来执行此操作。
我能想到的唯一方法是使用setTimeout()
延迟返回,直到事件触发了回车键按钮并更改了标志。
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)超时功能不能返回一个值,并且b)超时甚至不会延迟返回功能,它只是不返回任何内容。
我也尝试过使用.done()
,但无法使用它。
似乎没有任何办法可以在网上找到,任何帮助都会非常感激!
答案 0 :(得分:1)
您需要从inputfun返回一个Promise,然后在按下return时解析它。 (如果你不熟悉Promises,那么它们非常值得一看 - &lt; grossSimplification&gt;它们允许你使用同步逻辑&lt; / grossSimplification&gt;编写异步代码。)。
像这样(使用你的代码作为基础):
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的输入元素正在接收stdin。看看你的OP,你在谈论textarea(虽然JQuery .val()应该可以正常工作)。根据你所谓的textarea(“输出”),似乎你的意图是stdin和stdout都涉及一个共享的textarea。如果是这样,我不确定你将如何区分stdin生成的内容和用户输入的内容(后续)。因此,上面的代码假设一个单独的输入字段。
我有一个类似的用例,我给出了stdin和stdout的集成控制台幻觉的方式是在输出div的末尾有一个contenteditable的范围。在keycode == 13之前,在我解决了承诺并发回用户输入的内容之前,我将文本从输入范围中取出并将其附加到输出div。