0

我正在编写一个非常简单的终端仿真器(ish)应用程序,并且正在尝试构建将up-arrow上一个命令加载到输入中的功能。到目前为止,我已经很接近了,但是我在数学中遗漏了一些东西,并且它无法正常工作...

command_history = {};
command_counter = -1;
history_counter = -1;

$('#term-command').keydown(function(e){
    code = (e.keyCode ? e.keyCode : e.which);
    // Enter key - fire command
    if(code == 13){
        var command = $(this).val();
        command_history[command_counter++] = command;
        history_counter = command_counter;
        alert('Run Command: '+command); 
        $(this).val('').focus(); 
    // Up arrow - traverse history
    }else if(code == 38){
        if(history_counter>=0){
            $(this).val(command_history[history_counter--]);
        }
    }
});

...#term-command我的输入在哪里。

4

3 回答 3

1

我认为您尝试访问 -1 的数组索引的问题

command_history[command_counter++] = command;

command_counter = -1 首先尝试将其初始化为 0 或使用预增量(++command_counter)(如果它存在于 javascript 中)。还将 command_history 声明为数组。我会做的改变:

command_counter = 0;

command_history = [];

命令历史是一个数组 -

于 2012-09-21T13:16:01.337 回答
1

我会说问题是您将其定义command_history为 object{}而不是 array [],因为您将它用作数组。

另外,我认为你想预先减少--history_counter

看到这个工作小提琴:

http://jsfiddle.net/5DZxs/1/

所以你的javascript看起来像:

command_history = []; //<-- Change here
command_counter = -1;
history_counter = -1;

$('#term-command').keydown(function(e){
    code = (e.keyCode ? e.keyCode : e.which);
    // Enter key - fire command
    if(code == 13){
        var command = $(this).val();
        command_history[command_counter++] = command;
        history_counter = command_counter;
        alert('Run Command: '+command); 
        $(this).val('').focus(); 
    // Up arrow - traverse history
    }else if(code == 38){
        if(history_counter>=0){
            $(this).val(command_history[--history_counter]); //<-- Change here
        }
    }
});​
于 2012-09-21T13:16:24.387 回答
0

变更声明

command_history[command_counter++] = command;

command_history[++command_counter] = command;

并将您的 command_history 变量设置为数组command_history = [];

它会解决你的问题

于 2012-09-21T13:17:11.790 回答