web-dev-qa-db-ja.com

JavaScriptで文字列を使用してスイッチを使用する

文字列変数を分析するときに、switchステートメントが正しく機能していません。

出力と入力は両方とも_<textarea>_です。

[〜#〜] html [〜#〜]

_<form name="interface">
  <textarea name="output" rows="20" cols="100"></textarea><br>
  <textarea name="input" rows="1" cols="100" onKeyDown="thinkInput(event);"></textarea>
</form>
_

JavaScript

_function thinkInput(e)
{
    if (e.keyCode == 13)
    {
        sInput = document.interface.input.value;
        document.interface.output.value += sInput;
        aInput = sInput.split(" ");

        switch (aInput[0])
        {
            case "say":
                textOut("You say \""+sInput.substring(aInput[0].length + 1)+"\"");
                break;
            case "move":
                move(aInput[1]);
                break;
            default:
                thinkFail();
                break;
        }
        document.interface.input.value = null;
        alert(aInput[0]);
    }
}
_

最後のalert()で、ケースが「say」または「move」のいずれかであることがわかります。

初めて「mudkipzと言う」または「移動する」ことを試みると、すべてが希望どおりに機能しますが、その後、入力したすべてのthinkFail()が起動します。

14
MF Ramen

コマンドプロンプトの上に新しい行が表示され、分割配列に参照の最初のWord on [0]値が含まれていないため、コードが実行されていません。入力の値をクリアしているのに、理由がわかりません。

この入力に必要なのは1行だけなので、Enterで新しい行が取得されないように<input type="text" onKeyDown="thinkInput(event);"/>を使用することをお勧めします。

JavaScript

this.thinkInput = function (e)
{   
    ...

    if (e.keyCode == 13)
    {   
        /* Prevent submitting form on Enter */ 
        e.preventDefault();

        var command, commands;

        command = cmd.value;
        commands = command.split(' ');
        /* Clear input field */
        cmd.value = '';

        /* commands[0] will always have reference
           to the first Word in textfield */
        switch (commands[0])
        {
            ...
        }
    }
}

これが私があなたのコードから一緒に投げた小さなフィドルです: http://jsfiddle.net/npx86/1/

お役に立てれば!

2
Matej Svajger

1つの問題は、変数を定義するためにvarステートメントを使用していないことです。これは、それらが「暗黙のグローバル」になり、さまざまな呼び出しを通じて保持されることを意味します。

var sInput = document.interface.input.value;
var aInput = sInput.split(" ");
document.interface.output.value += sInput;

問題をさらに診断するには、ブラウザーのデバッガーツールを使用してブレークポイントを挿入し、ステップスルーしてsInputの値を監視し、問題を特定します。

1
rbhro

この行をスイッチの前に置いてください..。

aInput = sInput.split(" ");
aInput[0] = aInput[0].replace(/\s/gi, "");

switch (aInput[0])
{

..。

または、textareaの代わりにテキスト入力に使用できます。

0
user3281733

何かが足りないのかもしれません...このコードを探したりテストしたりすると、キーダウンイベントがトリガーされるたびに実行されます。入力フィールドをクリアしているため、1文字のみを処理しています。

「say」と入力すると、コードは「s」、「a」、「y」の順に実行されます。

これらの単語のテキスト領域をスキャンする場合に実行したいことは、document.interface.output.valueの値を取得し、その値をケースと比較することをお勧めします。

お役に立てれば。

EDIT:moveメソッド、textOutメソッド、thinkFailメソッドを投稿できますか?例外が発生したかどうかを知ることができるのは、ケースが機能しない場合です。 jsfiddle で正常に動作する場所を作成しました。

0
Android334

これらのいずれかを試しましたか?

最後に

document.interface.input.value = ""; 

Null + "hello"> "nullhello"のように、実際には空の文字列である必要があります

または最初に

document.interface.output.value = sInput; 

毎回出力値をリセットする場合、実際には文字列を追加する目的がありますか?

0
widged

これは、afterinputボックスの値を空にリセットすると、押されたキー(Enter)が追加されるために発生します。これにより、_aInput[0]_はCRで始まります(これはalert()メッセージには表示されません。

分割する前にsInputの左側をトリミングすることで、これを簡単に修正できます。

_aInput = sInput.replace(/^\s+/,'').split(" ");
_

または、_<CR>_が押されたときに関数から明示的にkeydownを返し、HTMLを次のように変更することで、falseイベントをキャンセルできます。

_onkeydown="return thinkInput(event);"
_
0
Ja͢ck

質問されてからしばらく経ちましたが、とにかく答えなければなりません。

コードが機能しない理由は、最初の試行後に入力Textareaが空ではないためです。改行は、コードの実行後もテキスト領域に追加され、次にEnterキーを押すと、入力の最初の文字になります。

OnKeyDownをonKeyUpに変更するか、onKeyUpの新しいeventHandlerを追加して入力を空にする場合は、問題ないはずです。

<textarea name="input" rows="3" cols="100" onKeyUp="thinkInput(event);"></textarea>

http://jsfiddle.net/borglinm/ntj3t/1/

0
Mathias