1

これがシナリオです。その場で生成される JavaScript コードがいくつかあります。そこで、prompt()ユーザー入力を読み取るための入力ボックスを開く を使用する代わりに、カスタム要素を作成しました。通常の入力ボックスを使用するのではなく、カスタム入力ボックスのスタイルを設定できるためです。

したがって、カスタム入力ボックスを表示する関数は、次のようなものです。show_input()

そして、オンザフライで生成されたこのコードは、最後に を使用して実行されeval()ます。したがって、コードでは、その関数を呼び出した後show_input()、プログラムはユーザーが値を入力してボタン (カスタムメイドの入力フォームのボタン) を押すまで待機することになっています。また、生成されたコードには、この関数への複数の呼び出しがあります。

これに対する解決策を見つける方法がわかりません。つまりprompt()、コードの実行全体を停止するのと同じように動作させることです。

私が試したのは、カスタム入力ボックスで、ユーザーが値を入力してボタンを押したときに設定されるブール値フラグを使用することです。そのため、myshow_input()が呼び出されると、カスタム入力ボックスが表示され、このブール値フラグが設定されている場合にのみ停止する無限ループに入ります。しかし、これにより Web ページがフリーズし、応答しなくなります。だから、それは素晴らしい解決策ではありません。

関数がどのようにprompt()機能するかを模倣する方法はありますか。つまり、ユーザーがボタンを押すまでページ全体を一時停止しますか?

setTimeout()私の場合、 function は良い選択ではありません。その理由は、生成されたコードが次のようになるためです。

statement1;
statement2;

show_input(); //call the function to show my custom inputbox

statement3;

show_input();

statement4;
statement5;
// etc...

そのため、 の後statement2、関数呼び出しは、ユーザーに値を入力してボタンを押すように求めるカスタム入力ボックスを表示するためのものです。このボタンを押した後にのみ、に移動する必要がありますstatement3。それまでは、ユーザーがカスタム入力ボックスのボタンを押すのを待つ必要があります。

jQuery を使用しており、ボタンにクリック イベントが追加されています。

実行時に生成された上記のコードは、eval()

どんなアイデアでも大歓迎です。ありがとうございました

4

4 に答える 4

2

DOM からの入力を待機しているスクリプトの実行を「ブロック」する方法がないため、javascript の実行モデルでは、達成しようとしていることが許可されません。ループ試行で指摘したように、ページはスクリプトの実行が終了するまで凍結され、その後でのみ通常のイベント処理が再開されます。

したがって、代わりに、ユーザー入力の後に実行するステートメントを含むコールバック関数を作成し、入力システムにそれを呼び出させます。例:

// statement 1 and 2 here

var callback = function(value) {
    // statement 3 here
}

show_input(callback);

次に、show_input 内で、値を取得する関数にユーザー確認をバインドし、その値を使用して指定されたコールバック関数を呼び出します。例(簡潔にするためにjquery構文を使用していますが、それを使用するために厳密に必要というわけではありません):

function show_input(callback) {
   // create the input form
   $(confirm_button).click(function() {
      callback($(input).value());
   });

もちろん、これは必要に応じて任意のレベルにネストできます。ネストする場合、(新しいものを作成するのではなく) 既存のウィジェットを再利用する場合は、新しいものをバインドする前に以前のコールバック イベントがアンバインドされるように注意する必要があります。必要に応じて、イベント ハンドラーへの参照を保持して削除することもできます。ただし、ほとんどの場合、すべてのイベントのバインドを解除するだけで十分です。

フィドルの例を参照してください: http://jsfiddle.net/YTcy8/

于 2013-03-07T13:15:03.677 に答える
1

あなたのシナリオに従うのは難しいと思いましたが、あなたが直面している問題は、ユーザーの操作を生成されたコードにバインドすることだと思います。あなたが直面している問題をもう少し明確にするために、次のことはうまくいきますか? そうでない場合、なぜですか?

$('#thebutton').on('click', statement3);

ここでは、全体を抽象化するフィドルを示します。拡張または修正したい場合は、フォーク ボタンを使用して独自の変更を作成します。

于 2013-03-07T13:05:14.230 に答える
1

入力ボックスのボタンでクリック イベントを検出する必要があります。ユーザーが入力を入力したかどうかを検出する関数をトリガーするために使用できますonclick。入力が入力された場合は、必要なことを続けます。オーバーレイボックスを使用して、入力とボタンを配置することもできます

于 2013-03-07T13:07:02.850 に答える
0

ユーザー入力のためにスクリプトの実行を停止しなければならなかった同様の状況があり、ほぼ 2 3 か月間検索しても解決策が見つかりませんでした。その後、それは不可能なので断念しました。

しかし、私たちがとったアプローチは次のとおりでした

statement 1
statement 2
showInput(function() { 
    statement3;
    showInput( function() {
               statement4;
               statement5;
             })   
       })

これ以外にあなたの問題に対する解決策はありません。これ以外の解決策を見つけた場合は、同じものを提供してください。同じ状況でブロックされている人をたくさん見つけました

于 2013-03-07T13:16:14.370 に答える