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

有没有办法在浏览器javascript中模拟命令行交互?,javascript,wait,Javascript,Wait,我对这件事没有多大希望,但我得问问。出于教学目的,我希望能想出一些方法,让学生将一个简单的javascript程序加载到浏览器中,并让它以老式的命令行方式与浏览器交互,即打印一行,然后读取一行输入。如果您使用prompt(),这很好,但它创建弹出窗口的事实在美学上很烦人,今天的浏览器乐于抑制过度使用它的脚本。问题是,prompt()似乎是浏览器Javascript暂停脚本等待输入的唯一方法。如果我们避免它,这会让我们立即不得不处理实时GUI事件输入模型 我一直在寻找一种伪造它的方法——建立某种环

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

我一直在寻找一种伪造它的方法——建立某种环境,在这种环境中,Javascript方法可以等待输入,然后在给定时返回。到目前为止,我得到的最好的可能性是将它连接到一个Java小程序,但是Java小程序品牌现在有点中毒了,我怀疑人们会想安装插件。还有别的办法吗?工作线程?浏览器附加组件?一些服务器端技巧?有人有主意吗


这个问题已经问了好几年了。。。我想知道在Javascript中添加承诺和异步/等待是否会让这变得更可能


…我有点成功了。如果read-eval-print循环处于
async
函数中,并对读取输入的行使用
wait
,则确实可以在事件驱动的浏览器环境中创建老式的线性read-eval-print循环。但是我不认为你可以让主线程在没有异步函数的情况下等待输入,除非使用外推的
prompt
方法。

你想要的技术术语是REPL:aRead-Eevaluate-print-Loop。外面有很多repl

基于浏览器的最佳解决方案 使用谷歌浏览器的内置!它是一个Javascript REPL,还可以让您与网页交互。您可以在Chrome中的Windows和Unix上使用Ctrl+Shift+I,或者在Mac上使用等效命令(谷歌it!)来访问它

要加载文件并使用它,您的学生只需创建如下目录结构:

project
|--> index.html
|--> javascript.js
确保
index.html
有一个指向
javascript.js
script
标记,然后用Chrome打开
index.html
。瞧!您已经加载了一个Javascript文件,现在可以在Chrome中使用它了

这是最好的解决方案,因为你拥有DOM的全部功能,可以做REPL的事情,而且几乎没有痛苦——每个人都使用Chrome,你的学生甚至可以回家彻底地玩它

基于浏览器的替代方案 与其重新发明轮子,还可以使用

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

非基于浏览器的备选方案 如果可以放宽对基于web的解决方案的要求,那么在终端上简单地使用“内置REPL”就足够了

您可以在实验室的计算机上安装Node,并让人们以该身份使用Javascript。不会有DOM,但您肯定可以让他们编写函数和算法来解决简单问题。另外,这将是一个很好的方式,让他们认识到Javascript不再是客户端绑定的

您将在实际终端中与Javascript交互,而不是在浏览器中与模拟终端交互,这是另一个好处

如果我误解了。。。 一些问题注释听起来像是您想要一种能够从浏览器使用Javascript与终端实用程序交互的方法。如果是这样,这是不可能的

Javascript无法在命令行上计算、解析或执行任何非使用Javascript编写的操作。使用基于浏览器的解决方案,您不能期望与bash
ls
相当——这是因为浏览器无法访问底层文件系统,这是一件好事。您不能运行
sed
awk
grep
等。原因相同-浏览器无法访问Unix实用程序。当然,有一些方法可以使用Node运行Unix实用程序,但接下来您将教他们如何使用Node,而不是如何使用Unix控制台

但是,如果您想要的只是一种从浏览器到公共环境的SSH方式,那么肯定有基于浏览器的方式可以做到这一点。是一个Firefox插件(现在也被移植到Chrome上),它允许人们通过SSH连接到一个公共服务器。然后,他们可以执行
ls
vim
等操作,并在服务器上运行,结果通过管道传回浏览器屏幕。当然,在这种情况下,您必须仔细考虑安全问题,但我认为简单地向用户授予此服务器的用户权限就足够了

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

提示的替代方案 在更详细地理解OP的需求之后,我添加了这个

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

如果使用Node.js解决方案,到目前为止,最好的方法是利用这个库。我个人认为它对于嵌入w非常有用