原文地址: http://www.cnblogs.com/liaoyu/p/js-terminal.html

周末闲着想试试用 JavaScript 模拟命令行交互的功能,希望达到的几个功能点如下:

  1. 基本字符的输入
  2. 光标移动
  3. JS解析命令及相应的异常处理并输出结果
  4. 记住命令历史可通过上下方向键切换
  5. 几个快捷键,比如 Ctrl+L 清屏

实现相关

库依赖: jQueryunderscore.js

初始化的 DOM 结构如下:

<div id="panel-shell">
<div class="output-view">
Welcome to js-terminal, Type "help" for more information.
</div><br /> <div class="shell-view">
<span class="prompt">$</span>&nbsp;<span class="input"><span class="left"></span><span class="cursor blink">&nbsp;</span><span class="right"></span></span>
</div>
</div>

命令输入区由 left cursor right 三个span组成, 注意,这三个span之间不能留有间隙,不然浏览器在显示的时候它们也会有间距。

获取字符输入时使用 keypress 事件:

  1. keydown: 当用户按下键盘上的任意键时触发
  2. keypress: 当用户按下键盘上的字符键时触发
$(document).keypress(function(e) {
if (e.which === 32) { // space
$left.append('&nbsp;');
} else if(e.which !== 13) { // enter
$left.append(String.fromCharCode(e.which));
}
});

注意: jQuery 对获取按下的键对应的ASCII码进行了封装,早期的IE只支持 event.keyCode ,而W3C的标准是 event.which ,所以现在标准的做法也是使用 event.which ,keydown事件获取的keyCode值不区别大小写,例如输入a和A都是65。最后将获取的ASCII值转换成字符使用 String.fromCharCode ,它是一个静态方法。

解析命令时,直接使用 eval, 囧

try {
val_ouput = eval(cmd);
} catch (e) {
val_ouput = '\'' + cmd + '\': command not found';
}

命令执行完毕后,使用 underscore.js 的模版引擎输出结果,模版如下:

var template_output = _.template('<div class="output-view"><span class="prompt"><%= separate %></span>&nbsp;<span class="output<%= error %>"><%= value %></span></div>');
$shell.before(template_output({separate:'&gt;', value:val_ouput, error: err_class}) + '<br />');

将历史命令保存到一个数组里,每次敲回国时将新命令加入到历史记录里,可通过上下方向键进行切换。

使用快捷键 Ctrl+L 进行清屏:

if (e.which === 76 && e.ctrlKey) {   // Ctrl + L
e.preventDefault(); $shell.siblings().remove();
}

最后,来一张效果图 (黑色背景是我的最爱了)

在线演示

参考链接

其实已经存在功能相当完善的JS命令终端库

https://github.com/jcubic/jquery.terminal

https://github.com/sdether/josh.js

JavaScript实现命令行交互的更多相关文章

  1. libvirt 命令行交互工具之virsh

    libvirt是当前主流VM最低层库.IBM PowerVM也不例外,libvirt是深入玩虚拟化必须玩转的东西; 简单测试玩玩libvirt 的virsh命令行交互工具, 你我都知libvirt大体 ...

  2. [转] Java 命令行交互-JCommander

    [From] https://github.com/Sayi/sayi.github.com/issues/32 我喜欢简单,什么是简单?正如若干字符组成的命令行. 有时候我们用Java开发了一个小工 ...

  3. 使用 CliWrap 让C#中的命令行交互举重若轻

    在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliW ...

  4. 前端技术之:如何创建一个NodeJs命令行交互项目

    方法一:通过原生的NodeJs API,方法如下:   #!/usr/bin/env node # test.js var argv = process.argv; console.log(argv) ...

  5. flask+script命令行交互工具

    Project name :Flask_Plan templates:templates static:static 首先说,我们flask比django方便的地方是所有的模块都可以自己选,你不喜欢s ...

  6. Nodejs 命令行交互神奇 yargs

    传送门: # example https://github.com/yargs/yargs/blob/master/docs/examples.md # 官网 http://yargs.js.org/ ...

  7. 设置python 命令行交互程序自己主动补齐

    1. 新建Python环境变量配置文件: vim ~/.pystartup # Add auto-completion and a stored history file of commands to ...

  8. 如何用nodejs 开发一个命令行交互工具

    参考地址1 参考地址2 一.npm package.json bin 1.package.json { "name": "test", "versio ...

  9. python 怎么和命令行交互

    http://www.cyberciti.biz/faq/python-run-external-command-and-get-output/ http://stackoverflow.com/qu ...

随机推荐

  1. CDN的原理及对SEO的影响

    http://www.williamlong.info/archives/4059.html CDN的概念最早于1995年由美国麻省理工大学提出,是一套能够实现用户就近访问的网络解决方案.具体方法是: ...

  2. 第十六篇、MBprogressHUD的使用和获取当前的控制器

    简介: 在开发应用的时候,为了更好的增加用户的体验,常常在客户端向服务端请求数据的时候,在适当的地方加上非模态HUD,让用户可以可以知道当前的进度,稍作等待. MBProgressHUD 第三方框架G ...

  3. 第27条:使用“class-continuation分类”隐藏实现细节

    Objective-C动态消息系统(参见第11条)的工作方式决定了其不可能实现真正的私有方法或私有实例变量. 匿名分类的特点: 与普通的分类不同,它必须定义在其所接续的那个类的实现文件里. 唯一能声明 ...

  4. ZOJ 2392 The Counting Problem(模拟)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1368 题目大意:计算从S到T中所有的数,其中0,1,2,3,4,5, ...

  5. OpenJudge/Poj 1458 Common Subsequence

    1.链接地址: http://poj.org/problem?id=1458 http://bailian.openjudge.cn/practice/1458/ 2.题目: Common Subse ...

  6. Win7 钩子 超时 失效

    这段时间在程序中,使用了全局钩子,但是在测试时发现,会偶尔失效. 在网上搜索到了这两篇文章: VC底层钩子程序在Win7/Vista下无效 Hooking problem in Windows 7 这 ...

  7. aspx页面状态管理(查询字符串Request与Application)

    1,Request:可以方便的将信息从一个页面传递到另一个页面,通过url传递,不安全,数据量小,只能通过http-get提交的才可以 2,Application对象:()本质上是Hash表)所有访问 ...

  8. linux shell命令的常用快捷键

    一些shell的常用快捷键.   Ctrl + a 切换到命令行开始  Ctrl + e 切换到命令行末尾  Ctrl + l 清除屏幕内容  Ctrl + u 清除剪切光标之前的内容  Ctrl + ...

  9. uCGUI字符串显示过程分析和uCGUI字库的组建

    为什么要分析字符串的显示过程? 学习uCGUI主要是学习如何使用的,为何要深究到源码的层次呢? 就分析字符串显示过程的原因来说,是因为移植汉字字库的需要.uCGUI并么有合适的汉字字库,而且完整的汉字 ...

  10. windows下常用快捷键

    windows下常用快捷键: 显示桌面: win徽标+D 打开资源管理器: win徽标+E 打开任务管理器: Ctrl+Alt+delete 任务切换: Alt+Tab 应用程序中窗口之间的切换: C ...