在jquery终端上按回车键后,将提示符更改为:(“),然后返回到上一个

txu3uszq  于 11个月前  发布在  jQuery
关注(0)|答案(1)|浏览(123)

我有一个JQuery终端,我试图使它类似于MacOS终端。当使用MacOS终端时,我注意到每当你按回车键时,提示符会消失一秒钟,很快就会重新出现。我试图找出如何在我的JQuery终端中做同样的事情,但就像它一样工作,但没有一个问题,我有,这里是代码到目前为止:

<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.jsdelivr.net/npm/jquery"></script>
<script src="https://cdn.jsdelivr.net/npm/jquery.terminal/js/jquery.terminal.min.js"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/jquery.terminal/css/jquery.terminal.min.css"/>
</head>
<body>
<script>
$('body').terminal({
    echo: function(...args) {
        this.echo(args.join(" "))
    }
}, {

keydown: function(e) {
    
    if(e.key === 'Enter' || e.keyCode === 13) {
         
    var checkit = this.get_prompt();
         
                setTimeout(() => {
                    this.set_prompt('')         
                }, 10);
         
                setTimeout(() => {
                    this.set_prompt(checkit)
                }, 200);
  
}   else {
             
    }
},
    greetings: '',
    checkArity: false,
    prompt: 'MyNormalPrompt>'
    
});
</script>
</body>
</html>

字符串

**问题:**正如你所看到的,如果你尝试演示,提示确实会消失,然后按我想要的方式重新出现,但如果你试图按回车太快,或按住它,提示将完全消失。
**我尝试了什么:**我看了一下这个:Detect Long Press on Enter/OK Key on a caph-list Item,它给出了如何在JavaScript中检测长回车键的信息,当在我的jquery终端上实现一些代码时,它有点帮助,但仍然不会使提示停止消失。

xoshrz7s

xoshrz7s1#

您可以使用pause/resume:

echo: function(...args) {
    term.pause();
    this.echo(args.join(" "));
    setTimeout(() => {
       this.resume();
    }, 200);
}

字符串
pause/resume与返回promise并在延迟后解析相同:

const delay = time => new Promise(resolve => setTimeout(resolve, time));

echo: async function(...args) {
    this.echo(args.join(" "))
    await delay(200);
}


我不认为有一种方法可以对所有命令全局地做到这一点。但是你可以创建一个函数来抽象它:

const timeout = 200;

const delayed = (fn) {
    return function(...args) {
        term.pause();
        fn.apply(this, args);
        setTimeout(() => {
           this.resume();
        }, timeout);
    };
};

echo: delayed(function(...args) {
    this.echo(args.join(" "));
})


您可以使用BRAC方法执行相同的操作。

const timeout = 200;

const delayed = (fn) {
    return async function(...args) {
        await fn.apply(this, args);
        await delay(timeout);
    };
};


在这种情况下,函数echo可以是functional或normal函数:

echo: delayed(async function(...args) {
    this.echo(args.join(" "));
})


你也可以延迟对象的每个方法,最好使用一个函数作为解释器,你可以自己解析命令并自己处理它。

const timeout = 200;
const delay = time => new Promise(resolve => setTimeout(resolve, time));

const delayed = obj => {
    return async function(command) {
        if (!command) {
            return;
        }
        const cmd = $.terminal.parse_command(command);
        if (obj[cmd.name]) {
            obj[cmd.name].apply(this, cmd.args);
        } else {
            this.error(`Wrong command: ${cmd.name}`);
        }
        await delay(timeout);
    }
};

const term = $('body').terminal(delayed({
    echo(...args) {
        this.echo(args.join(' '));
    }
}));

相关问题