有没有办法在浏览器javascript中模拟命令行交互?

时间:2016-04-24 19:40:39

标签: javascript wait

我对这个没有太大的希望,但我不得不问。我希望,出于教学目的,想出一些方法,学生可以将一个简单的javascript程序加载到浏览器中,并让它以老式的命令行方式与它们交互,在那里打印一行然后读取一行输入。如果你使用prompt(),这可以正常工作,但是它创建弹出窗口的事实在美学方面很烦人,今天的浏览器乐于自愿扼杀过度使用它的脚本。问题是,prompt()似乎是浏览器Javascript实际暂停脚本等待输入的唯一方式。如果我们避免它,那就会立即引发我们不得不处理实时GUI事件输入模型。

我一直在寻找伪造它的方法 - 设置某种环境,在这种环境中,Javascript方法可以等待输入,然后在给出时返回。我到目前为止最好的可能性是将它连接到Java applet,但java applet品牌现在有点中毒,我怀疑人们会想要安装插件。还有另一种方式吗?工人线程?浏览器插件?一些服务器端的技巧?有没有人有想法?

这个问题现在已经存在了很久......我想知道是否添加了promises和异步/等待Javascript使得现在更有可能了吗?

......我有点工作了。如果read-eval-print循环在async函数中并且使用await作为读取输入的行,那么您确实可以在事件驱动中创建一个老式的线性读取 - 评估 - 打印循环浏览器环境。但我不认为你可以让主线程在没有异步函数的情况下等待输入,除非使用了格式prompt方法。

1 个答案:

答案 0 :(得分:3)

您想要的技术术语是REPL: R ead- E 评估 - P rint- L < /强>接力。那里有很多REPL。

基于浏览器的最佳解决方案

使用谷歌浏览器的内置console!这是一个Javascript REPL,可以 让您与网页进行交互。您可以使用Chrome上的Windows和Unix上的Ctrl + Shift + I或Mac上的等效命令(Google it!)来访问它。

enter image description here

要加载文件并使用它,您的学生需要做的就是创建一个这样的目录结构:

project
|--> index.html
|--> javascript.js

确保index.html的{​​{1}}标记指向script,然后使用Chrome打开javascript.js。瞧!您已经加载了Javascript文件,现在可以在Chrome中使用它。

这是最好的解决方案,因为你获得了DOM的全部功能,可以做REPL的东西,并且几乎无痛 - 每个人使用Chrome,你的学生甚至可以回家并乱用它完全。

基于浏览器的替代方案

您也可以使用Repl.it而不是重新发明轮子。

这是一个基于浏览器的Javascript REPL网站,支持插入任意Javascript程序,并与其内容进行交互。这是你可能最接近满足你的要求 - 它将无法与DOM交互(显然),但它不仅仅是工作。

enter image description here

非基于浏览器的替代

如果可以放宽对基于Web的解决方案的要求,只需在终端上使用Node.js'内置REPL就足够了。

您可以在实验室的计算机上安装Node,并让人们以该容量使用Javascript。没有DOM,但你当然可以让他们编写函数和算法来解决简单的问题。另外,这是向他们介绍Javascript不再受客户端约束这一事实的好方法。

您将在实际终端中与Javascript进行交互,而不是在浏览器中进行模拟,这是另一个简洁的奖励。

如果我误解了......

有些问题的评论听起来像是想要一种能够使用浏览器中的Javascript与终端实用程序进行交互的方法。如果是这种情况,则不可能

Javascript有 no 方法可以在命令行上评估,解析或执行任何操作不是使用Javascript编写的。你不能指望使用基于浏览器的解决方案等同于bash index.html - 这是因为浏览器无法访问你的底层文件系统,这是一件好事。出于同样的原因,您无法运行lssedawk等 - Unix实用程序无法访问到浏览器。当然,有很多方法可以使用Node运行Unix实用程序,但是接下来你将教他们如何使用Node,而不是如何使用Unix控制台。

但是,如果你想要的只是一种从浏览器SSH到公共环境的方法,那么肯定有基于浏览器的方法。 FireSSH是一个Firefox插件(现在也移植到Chrome),可以让人们通过SSH进入公共服务器。然后,他们可以执行grepls等操作,并将其运行到服务器中,并将结果传回浏览器屏幕。当然,在这种情况下你必须仔细考虑安全性,但我认为仅仅为这个服务器授予用户权限应该足够了。

请注意,FireSSH不使用Javascript来解析或执行任何操作 - 它所做的只是将您键入的命令转发给服务器,让服务器远程执行这些命令,然后将结果传回屏幕。

提示的替代方法

我在更详细地了解了OP的要求之后添加了这个

这是一个被问到before的问题。我喜欢图书馆解决方案,而在2013年,iocream.js就是为这种浏览器功能而开发的。您可以将其嵌入页面中,并使用vim函数指定值。

如果使用Node.js解决方案,到目前为止最好的方法是使用prompt库。我个人觉得它在Node.js应用程序中嵌入非常有用。

SpiderMonkey是Mozilla基于C ++的Javascript引擎,支持名为jin的函数。不幸的是,似乎没有主流的浏览器实现。