我想使用stdin和stdout创建一个简单的控制台终端。基本上我有一个输入内容并检索聊天内容的函数。
如你所知,它会说root@192.168.2.1:/
之类的内容,然后我只能输入该行。当我按下回车键/提交时,它会显示另一行root@192.168.2.1:/
,让我再次输入。
如何让它只能在root@192.168.2.1:/
的最后一行和前面输入(基本上这是锁定的)?
任何更好的想法来实现这个而不是textarea ??
$('#btnSubmit').click(function() {
var terminal = $('#terminal');
var stdin = terminal.val();
console.log(stdin);
//Get stdout (FAKE FOR THE EXAMPLE)
terminal.append(stdout() + '<br>');
});
function stdout(stdin) {
return "root@192.168.2.1:/"
}
.terminal {
background-color: #000;
color: #fff
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<textarea class="terminal" rows="20" id="terminal"></textarea>
<button class="btn btn-primary" id="btnSubmit" type="button">Send</button>
答案 0 :(得分:1)
就像你说的那样,你真的只需要一行写入。你可以将该单行作为输入字段,并在输入字段的div中输出“历史记录”。
这是一个例子,只有看起来不像终端的东西才是滚动的方式,但我想这应该可以用一些额外的代码来修复。
$(function() {
$('.terminal').on('click', function(){
$('#input').focus();
});
$('#input').on('keydown',function search(e) {
if(e.keyCode == 13) {
// append your output to the history,
// here I just append the input
$('#history').append($(this).val()+'<br/>');
// you can change the path if you want
// crappy implementation here, but you get the idea
if($(this).val().substring(0, 3) === 'cd '){
$('#path').html($(this).val().substring(3)+' > ');
}
// clear the input
$('#input').val('');
}
});
});
.terminal{
background: black;
color: white;
font: courier;
padding: 10px;
height: 100px;
overflow: hidden;
}
.line{
display: table;
width: 100%;
}
.terminal span{
display:table-cell;
width:1px;
}
.terminal input{
display:table-cell;
width:100%;
border: none;
background: black;
color: white;
outline: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="terminal">
<div id="history">
</div>
<div class="line">
<span id="path">c:/ > </span>
<input type="text" id="input">
</line>
</div>
答案 1 :(得分:0)
您可以尝试插入可编辑的div。
我所做的是创建一个纯CSS解决方案。我创建了一个flex
包装器,它具有静态和可编辑的div
并排。这将确保显示的任何数字输出都不会干扰用户输入。
<强> HTML:强>
<section>
<div class="static">IP ADDRESS</div>
<div class="input" contenteditable="true"></div>
</section>
<强> CSS:强>
section {
display: flex;
flex-flow: row nowrap;
width: 500px;
height: auto;
margin: 0 auto;
background-color: lightgrey;
font-family: monospace;
}
.static {
width: auto;
padding-right: 20px;
}
.input {
flex: 1;
}