分析字符串变量时,我的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()
开火。
答案 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>