在JavaScript中使用带字符串的开关

时间:2010-11-23 07:56:35

标签: javascript string textarea switch-statement

分析字符串变量时,我的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()看到案件是“说”或“移动”。

我第一次尝试“说mudkipz”或“四处走动”时,一切都按照我想要的方式运作,但在我输入的所有内容之后,thinkFail()开火。

7 个答案:

答案 0 :(得分:2)

由于命令提示符上方出现了一个新行,并且split数组不包含[0]值上的引用第一个单词,因此您的代码不会执行。不知道为什么,即使你正在清除输入值。

由于您在此输入中只需要一行,因此建议您使用<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/

希望这有帮助!

答案 1 :(得分:1)

一个问题是您没有使用var语句来定义变量。这意味着它们变成了“隐式全局变量”,并通过不同的调用保持不变。

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

要进一步诊断问题,您可以使用浏览器中的调试工具插入断点,然后逐步监控sInput的值并找出问题。

答案 2 :(得分:0)

这是因为重置input框值为空后,按下的键(回车)被添加。这会导致aInput[0]以CR开头(您在alert()消息中看不到。

您可以通过在分割之前修剪sInput的左侧来轻松解决此问题:

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

或者,您可以在按下keydown时从功能中明确返回false取消<CR>事件,并将HTML更改为:

onkeydown="return thinkInput(event);"

答案 3 :(得分:0)

你有没有尝试过这些?

最后

document.interface.input.value = ""; 

它应该是一个空字符串,如null +“hello”&gt; “nullhello”

或在开始时

document.interface.output.value = sInput; 

如果每次重置输出值,它实际上是否有助于添加字符串?

答案 4 :(得分:0)

也许我错过了一些东西......当我正在查看/测试这段代码时,每次触发keydown事件时它都会运行,并且因为你正在清除输入字段,所以我们只处理单个字符。

如果我输入“say”,那么代码将以“s”执行,然后 “a”,然后是“y”。

如果您想扫描textarea中的那些字段,我建议您提取document.interface.output.value的值并将该值与您的案例进行比较。

希望这有帮助。

编辑:您可以发布移动方法,textOut方法和thinkFail方法吗?从我可以判断是否有任何异常被击中然后就是这种情况不起作用。我创建了一个jsfiddle,它可以正常工作。

答案 5 :(得分:0)

在开关前放置此行 ....

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

switch (aInput[0])
{

...

或者您可以使用文本输入,而不是textarea。

答案 6 :(得分:0)

我知道已经有一段时间了,但是我还是要提供一个答案。

您的代码无效的原因是第一次尝试后输入的Textarea不为空。在代码运行后,仍会将换行符添加到textarea中,下次按Enter键时,它将是输入中的第一个字符。

如果您将onKeyDown更改为onKeyUp或为onKeyUp添加新的eventHandler以清空输入,那么您应该没问题。

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

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