有没有办法在浏览器中使用Javascript / JQuery 模拟一个Bash shell?我想在我们的网站上有一个演示,它使用我们的新数据库系统从Bash shell模拟某人。最好看起来有人在shell命令中输入,输出会像典型的Bash shell一样逐行列出。我一直没有找到任何东西,所以我应该如何实现它 - 使用什么JQuery插件来使我的工作更轻松。
答案 0 :(得分:2)
看看Asciinema:
Asciinema是一种免费的开源解决方案,用于记录终端会话并在网络上分享。
答案 1 :(得分:1)
如果它仅用于演示目的,那么从头开始编码就不那么困难了。设置页面使其看起来像命令行界面
HTML:
<div id='window'></div>
<div id='command-line'>
[user@computer folder]$ <input type='text' id='command-input/>'
</div>
CSS:
body{
background-color:black;
color:green;
}
#window{
position:absolute;
top:0;
left:0;
width:100%:
height:95%;
}
#command-line{
position:absolute;
top:95%;
left:0;
width:100%;
height:5%;
}
然后在JavaScript / jQuery中实现虚假操作,这些操作将在客户端加载页面时启动。例如
function appendOutput(message){
var window = $('#window');
window.append("<div>"+message+"</div>");
}
这似乎是来自服务器的响应,或者例如
function typeMessage(message){
var input = $('#command-input');
for(var i=0; i<message.length; i++){
setTimeout(function(){
var formerValue = input.val();
input.val(formerValue + message[i]);
});
}
}
输入命令等。我确定你可以玩这个以使它看起来更好,而且功能还没有经过测试 - 它只是为了帮助你获得一个可能的解决方案的想法。希望它有所帮助!
答案 2 :(得分:1)
我根据example made by Kos制作了解决方案,您可以看到完整正常的演示here。
<强> HTML 强>
<script src="//cdnjs.cloudflare.com/ajax/libs/q.js/1.0.0/q.js"></script>
<div id="wnd"></div>
<div id="log"></div>
<textarea rows="11" cols="50">
% cat example.c
#include <stdio.h>
int main()
{
printf("Goodbye Cruel World!\n");
return 0;
}
% make example.c -o example
% ./example
Goodbye Cruel World!
</textarea>
<强> CSS 强>
body {
background: black;
}
#wnd {
background: #232;
border-radius: .2em;
white-space: pre-wrap;
padding: .5em;
font-family: "Consolas", "Ubuntu Mono", "Monaco", monospace;
color: white;
}
.prompt {
color: #99aaee;
}
.cmd {
color: #9e9e9C;
}
<强> JQuery的强>
var prompt;
function setPrompt(usr, domain)
{
prompt = usr + '@' + domain + ' %';
}
function addOutput(s) {
$('<div>').text(s).appendTo(wnd);
return Q.delay(100);
// return addPrompt();
}
function addInput(s) {
var l = $('.prompt:last');
var e = $('<span>').addClass('cmd').appendTo(l);
return addLettersRecursive(e, s);
}
function addPrompt() {
var l = $('<div>').text(prompt).addClass('prompt').appendTo(wnd);
return Q.delay(900);
}
function addLettersRecursive(container, s) {
container.append(s.charAt(0)); // dangerous :(
var row_complete = Q.defer();
Q.delay(100).then(function() {
if (s.length <= 1) {
row_complete.resolve();
}
addLettersRecursive(container, s.substr(1)).then(function() {
row_complete.resolve();
})
});
return row_complete.promise;
}
$( document ).ready(function() {
$('textarea').hide();
setPrompt('inge', 'sparkledb.net');
var lines = $('textarea').val().split('\n');
var promise = new Q();
promise = promise.then(function()
{
lines.forEach( function(item) {
if (item[0] == '%')
{
promise = promise.then(function()
{ return addPrompt(); })
promise = promise.then(function()
{ return addInput(item.substr(1)); })
}
else
{
promise = promise.then(function()
{ return addOutput(item); })
}
})
})
promise.done();
});