2017-05-02 10 views
3

SkulptSk.inputfun()を変更して、ユーザーに<textarea>を入力させ、ENTERキーを押して送信します。私は、ユーザー入力を取得するSkulptに単一の関数を渡す必要がありますが、prompt()以外の方法はありません。私の質問は次のようなものですが、答えはありません。 Skulpt Assign Sk.inputfun() to type response into output when input() called 私がこれを行うと考えることができる唯一の方法は、イベントがEnterキーボタンをトリガーしてフラグを変更するまでsetTimeout()を使用してリターンを遅らせることでした。Skulpt用Javascriptの関数内でイベントが発生するのを待ちます

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 
}); 

しかし、このdosen't作品。 a)タイムアウト関数は値を返すことができず、b)タイムアウトは返す関数を遅らせることもなく、単に何も返さない。

私も.done()を使用しようとしましたが、動作させることができませんでした。

私はオンラインで見つけることができる方法はないようですが、どんな助けでも大歓迎です!

答えて

1

あなたのinputfunからプロミスを返す必要があります。プロンプトが返されたら解決します。 (プロミスに慣れていない場合は、よく見てみましょう。<grossSimplification>同期ロジック</grossSimplification >を使用して非同期コードを書き込むことができます)。 (ベースとして、あなたのコードを使用して)このような

何か:

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を入力要素を想定してきました。あなたのOPを見て、あなたはテキストエリアについて話していました(ただし、JQuery .val()はこれでうまくいくはずです)。あなたがあなたのテキストエリア( "出力")を呼び出したことに基づいて、あなたの意図はstdinとstdoutの両方が共有テキストエリアを含むように思えます。もしそうなら、どのようにしてstdinによって生成されたものと、ユーザによって(その後に)何が入力されたのかを区別できるようになるかどうかはわかりません。したがって、上のコードは別の入力フィールドを想定しています。

私は同じような使い方をしていましたが、stdinとstdoutの両方に統合されたコンソールの錯覚を与える方法は、出力divの末尾にcontenteditableというスパンを設定することでした。 keycode == 13で、私が約束を解決して、ユーザーが入力したものを送り返す前に、テキストを入力スパンから取り出し、出力divに追加しました。

+0

ありがとうございます!私は元のtextarea valと最終valを比較してユーザーの入力を得ようとしていましたが、あなたのソリューションははるかに良いです。 – DeltaMarine101

関連する問題