无聊的时候想到用jscript模拟Console程序,结果试了一下,觉得还蛮好玩的:P
实现了一个jscript“控制台”类
在读代码前先放出三个Demo:
http://akira.bigwww.com/Silver%20Luna/Demos/ConsoleDemo.html
通过“控制台”输入两个数求和
http://akira.bigwww.com/Silver%20Luna/Demos/ConsoleDemo2.html
通过“控制台”输入一个句子,统计字符类型和数量
http://akira.bigwww.com/Silver%20Luna/Demos/ConsoleDemo3.html
一个可以通过键盘敲入命令回车执行的模拟,还支持
begin
Codes...
end
的模式 :)
下面是程序代码:
//控制台类,模拟运行在控制台上的程序,可以控制“标准输入输出流”(程序模拟)
//使用方法:在页面上包含Console.js文件,构造Console对象,定义Main()函数,在Main函数中写控制命令
//版本:1.00
//作者:Akira
//编写日期:2004-11-19
function Console(page, consoleName)
{
//静态成员
Console.KEY_ENTER = 13; //回车键
Console.KEY_RETURN = 13; //回车
Console.KEY_NEWLINE = 10; //换行
Console.KEY_TAB = 9; //TAB键
Console.KEY_BACKSPACE = 8; //退格键
Console.KEY_LEFT = 37; //左移
Console.KEY_RIGHT = 38; //右移
Console.KEY_UP = 39; //上移
Console.KEY_DOWN = 40; //下移
//初始化Page
if (page == null)
{
page = self;
}
if (page != self)
{
//do sth here...
throw new Error("参数错误:目前版本不支持为其他窗体对象初始化控制台/n请使用self参数");
}
this.page = page;
//输入输出流属性,用字符串数组模拟流
this.stream = new Object();
this.stream.stdin = new Array(); //标准输入流
this.stream.stdout = new Array(); //标准输出流
this.stream.stderr = new Array(); //标准错误流
this.stream.stdin.opened = false; //判断当前输入流是否开启,开启=允许写入
this.stream.stdin.ReadOffset = 0; //判断当前输入流偏置,Read()方法使用
this.stream.semaphores = 0; //流信号量,用来控制输出流显示,当调用输入函数时,信号量增加,
//当信号量大于stdin成员数目的时候,抛出异常阻塞标准输出流,用以模拟输入等待
Console.prototype.Signal = function()
{
if(this.stream.semaphores == this.stream.stdin.length)
{
return true;
}
if(this.stream.semaphores > this.stream.stdin.length)
{
throw new WaitForInput(); //抛出异常阻止程序往下执行,用以等待输入
}
return false;
}
this.body = page.document.body;
if (this.body == null)
{
throw new Error("控制台缺初始化失败,检查主体文档是否缺少BODY标记");
}
this.page.document.title += "——Javascript控制台";
this.page.PageLoadEventSender = this;
this.body.onload = function(){this.PageLoadEventSender.PageLoad(this.PageLoadEventSender,this.PageLoadEventSender.page.event);} //定义PageLoad事件
this.page.ResizeEventSender = this;
this.body.onresize = function(){this.ResizeEventSender.OnResize(this.ResizeEventSender,this.ResizeEventSender.page.event);}
this.ConsoleMain = page.document.getElementById(consoleName); //可以通过参数指定初始化对象TEXTAREA的名称,这样可以把控制台