我正在编写一个带有 ssh 终端(xterm.js)的小型网络应用程序和一些代码块卡。用户可以通过单击命令按钮或只需输入或粘贴来在终端中执行命令。
我一开始使用的是onData,这个API允许我输入或粘贴,但无法激活特定事件,例如Ctrl + d断开连接。
onKey 看起来不错。我编写了下面的代码来附加关键事件,复制效果很好,但粘贴效果不佳。
term.attachCustomKeyEventHandler(function (e) {
// Ctrl + Shift + C
if (e.ctrlKey && e.shiftKey && (e.keyCode == 3)) {
var copySucceeded = document.execCommand('copy');
console.log('copy succeeded', copySucceeded);
return false;
}
if (e.ctrlKey && e.shiftKey && e.keyCode == 'v') {
var pasteSucceeded = document.execCommand('paste');
console.log('paste succeeded', pasteSucceeded);
return false;
}
});
这是我的问题:onKey 和 onData 都监听键盘事件。当同时使用这两个功能时,终端写入两次。无论如何,它只在粘贴时监听 onData。
term.onKey(function (ev) {
const char = ev;
console.log(ev)
if(ev.key.charCodeAt(0)===4){
//term.dispose();
socket.disconnect();
}
socket.emit('key', ev.key);
});
term.onData(function(data){
console.log(data);
socket.emit('data',data);
});
如果您使用
onKey
,那么您可以简单地将“粘贴”事件处理程序添加到支持终端的文本区域,而不是使用 onData
进行粘贴事件。类似的东西
term.textarea.addEventListener("paste", on_paste)
其中
term
保存您当前的终端实例。