用HTML制作一个简单的终端

时间:2018-01-23 09:39:04

标签: javascript jquery html css twitter-bootstrap

我想使用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>

2 个答案:

答案 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)+'&nbsp;>&nbsp;');
      }
      
      // 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:/&nbsp;>&nbsp;</span>
    <input type="text" id="input">
  </line>
</div>

答案 1 :(得分:0)

您可以尝试插入可编辑的div。

JSFiddle Terminal Example

我所做的是创建一个纯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;
}