JavaScript实现命令行交互
原文地址: http://www.cnblogs.com/liaoyu/p/js-terminal.html
周末闲着想试试用 JavaScript 模拟命令行交互的功能,希望达到的几个功能点如下:
- 基本字符的输入
- 光标移动
- JS解析命令及相应的异常处理并输出结果
- 记住命令历史可通过上下方向键切换
- 几个快捷键,比如
Ctrl+L清屏
实现相关
库依赖: jQuery 、 underscore.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> <span class="input"><span class="left"></span><span class="cursor blink"> </span><span class="right"></span></span>
</div>
</div>
命令输入区由 left cursor right 三个span组成, 注意,这三个span之间不能留有间隙,不然浏览器在显示的时候它们也会有间距。
获取字符输入时使用 keypress 事件:
- keydown: 当用户按下键盘上的任意键时触发
- keypress: 当用户按下键盘上的字符键时触发
$(document).keypress(function(e) {
if (e.which === 32) { // space
$left.append(' ');
} 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> <span class="output<%= error %>"><%= value %></span></div>');
$shell.before(template_output({separate:'>', 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实现命令行交互的更多相关文章
- libvirt 命令行交互工具之virsh
libvirt是当前主流VM最低层库.IBM PowerVM也不例外,libvirt是深入玩虚拟化必须玩转的东西; 简单测试玩玩libvirt 的virsh命令行交互工具, 你我都知libvirt大体 ...
- [转] Java 命令行交互-JCommander
[From] https://github.com/Sayi/sayi.github.com/issues/32 我喜欢简单,什么是简单?正如若干字符组成的命令行. 有时候我们用Java开发了一个小工 ...
- 使用 CliWrap 让C#中的命令行交互举重若轻
在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliW ...
- 前端技术之:如何创建一个NodeJs命令行交互项目
方法一:通过原生的NodeJs API,方法如下: #!/usr/bin/env node # test.js var argv = process.argv; console.log(argv) ...
- flask+script命令行交互工具
Project name :Flask_Plan templates:templates static:static 首先说,我们flask比django方便的地方是所有的模块都可以自己选,你不喜欢s ...
- Nodejs 命令行交互神奇 yargs
传送门: # example https://github.com/yargs/yargs/blob/master/docs/examples.md # 官网 http://yargs.js.org/ ...
- 设置python 命令行交互程序自己主动补齐
1. 新建Python环境变量配置文件: vim ~/.pystartup # Add auto-completion and a stored history file of commands to ...
- 如何用nodejs 开发一个命令行交互工具
参考地址1 参考地址2 一.npm package.json bin 1.package.json { "name": "test", "versio ...
- python 怎么和命令行交互
http://www.cyberciti.biz/faq/python-run-external-command-and-get-output/ http://stackoverflow.com/qu ...
随机推荐
- Android之Http网络编程(二)
上一篇文章简单的介绍了Android中http的两种通信方式,并且分别用获取百度网页做了实例.但是在实际应用中,更多的是客户端通过请求的参数来实现在服务端的具体操作,并最终返回数据给客户端.因为我们不 ...
- ###《High-level event recognition in unconstrained videos》
Author: Yu-Gang Jiang, Shih-Fu Chang 事件检测的目标就是自动识别给定视频序列中的感兴趣事件.进行视频事件检测通常很困难,特别是在网络中非限制的视频.在非限制情况下, ...
- iOS Core Animation学习总结(2)--实现自定义图层
一. 创建图层继承于CALayer,并在子类实现drawInContext方法 @interface CTLayer : CALayer @end @implementation CTLayer -( ...
- Java语言----三种循环语句的区别
------- android培训.java培训.期待与您交流! ---------- 第一种:for循环 循环结构for语句的格式: for(初始化表达式;条件表达式;循环后的操作表达式 ...
- linux下搭建nginx+php(FastCGI)+mysql运行环境
一.安装环境 1.CentOS5.5 2.php5.4 3.MySQL5.5.19 二.安装程序依赖库和开发环境 为了省事把所需要的库文件全都安装上,可以使用rpm包安装,也可以用yum命令安装, 1 ...
- 使用json方式实现省市两级下拉级联菜单[原创]
本文为博主原创,转载请注明. 首先看一下实现后的效果图: 当然,要完成这个实验,mysql必须与数据库连接,这里选用navicat for mysql这款软件,它与mysql的契合度是很高的,配置环境 ...
- Web前端新人之CSS样式选择器
最近在学习css样式.那么我就想先整理一下css样式的选择器 规则结构: 每个规则都有两个基本部分:选择器和声明块.声明块由一个或者多个声明组成,每个声明则是一个属性—值对(property-valu ...
- Windows Phone 8 开发初体验
Windows Phone 8 是当前除了Android.IPhone之外,第3大智能手机运行平台.作为微软技术的忠实fans,一直关注和跟进微软技术的最新进展.这里就给大家简单介绍一下,如何进行Wi ...
- SerializableMaplist传递数据
package com.xjx.data; import java.io.Serializable; import java.util.List; import java.util.Map; /** ...
- 面试题(C#基础)
1>构造器Constructor不能被继承,因此不能重写Overriding,但可以被重载Overloading. 2>string[] ss=Enum.GetNames(typeof(C ...