Использование переключателя со строками в JavaScript - PullRequest
14 голосов
/ 23 ноября 2010

Мой 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() я вижу, что дело либо "сказать", либо "двигаться".

В первый раз, когда я пытаюсь «сказать мудкипз» или «двигаться», все работает так, как я хочу, но после этого все, что я печатаю, thinkFail() срабатывает.

Ответы [ 7 ]

2 голосов
/ 25 марта 2014

Ваш код не выполняется из-за новой строки, которая появляется над командной строкой, а разделенный массив не содержит первого слова ссылки на значение [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 голос
/ 23 ноября 2010

Одна проблема заключается в том, что вы не используете оператор var для определения своих переменных. Это означает, что они становятся «неявными глобалами» и проходят через ваши разные звонки.

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

Чтобы дополнительно диагностировать проблему, вы можете использовать средства отладки в своем браузере, чтобы вставить точку останова и выполнить шаг для отслеживания значения sInput и найти проблему.

0 голосов
/ 07 марта 2014

Я знаю, что прошло много времени с тех пор, как об этом спросили, но я все равно должен дать ответ.

Причина, по которой ваш код не работает, заключается в том, что текстовое поле ввода не пусто после первой попытки. Разрыв строки по-прежнему добавляется в текстовую область после запуска кода, и при следующем нажатии клавиши ввода это первый символ ввода.

Если вы измените onKeyDown на onKeyUp или добавите новый eventHandler для onKeyUp, чтобы очистить ввод, у вас все будет в порядке.

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

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

0 голосов
/ 21 февраля 2014

Поставьте эту строку перед переключателем ....

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

switch (aInput[0])
{

....

Или вы можете использовать для ввода текста вместо textarea.

0 голосов
/ 24 декабря 2013

Может быть, я что-то упускаю ... когда я смотрю / тестирую этот код, он запускается каждый раз, когда срабатывает событие нажатия клавиши, и поскольку вы очищаете поле ввода, мы работаем только с одиночными символами.

Если бы я набрал «say», то код был бы выполнен с «s», тогда «а», затем «у».

Если вы хотите отсканировать текстовое поле на наличие этих слов, я бы порекомендовал извлечь значение document.interface.output.value и сравнить это значение с вашим регистром.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ: Можете ли вы опубликовать свой метод перемещения, метод textOut и метод thinkFail? Из того, что я могу сказать, если какое-то исключение достигнуто, то это когда случай не работает. Я создал jsfiddle , где он отлично работает.

0 голосов
/ 18 января 2013

Вы пробовали что-нибудь из этого?

в конце

document.interface.input.value = ""; 

Это действительно должна быть пустая строка, так как null + "hello"> "nullhello"

или в начале

document.interface.output.value = sInput; 

Действительно ли это служит целью добавления строки, если вы каждый раз сбрасываете выходное значение?

0 голосов
/ 18 января 2013

Это происходит потому, что после сброса значения поля input на пустое, добавляется нажатая клавиша (ввод). Это заставляет aInput[0] начинаться с CR (чего вы не увидите в сообщении alert().

Вы можете легко исправить это, обрезав левую сторону sInput, прежде чем разделить его:

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

Кроме того, вы можете отменить событие keydown, возвращая false явно из функции при нажатии <CR> и изменив HTML на:

onkeydown="return thinkInput(event);"
...