惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
月光博客
月光博客
MyScale Blog
MyScale Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
爱范儿
爱范儿
P
Proofpoint News Feed
人人都是产品经理
人人都是产品经理
Last Week in AI
Last Week in AI
罗磊的独立博客
G
Google Developers Blog
Y
Y Combinator Blog
博客园 - 【当耐特】
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
V
Visual Studio Blog
美团技术团队
宝玉的分享
宝玉的分享
Jina AI
Jina AI
小众软件
小众软件
T
Tailwind CSS Blog
A
About on SuperTechFans

mephisto.cc

修复rime-ice无法弹出候选框的问题 开机滚动字体显示优化 个人网站安全防护 树莓派上部署Vaultwarden 使用goaccess实时分析Caddy日志 个人网站监控 Hugo全站AVIF记 Linux下尝试使用Godot开发小游戏 Arch linux dae 透明代理 Airflow接管galler-dl下载任务 如何使用gallery-dl批量下载图像 Arch核显下如何愉快玩Dota2和CS2 Arch/labwc 环境网络相关设置 Rime添加dota2词库 Arch 重装记录 Supertuxkart iOS版终于发布了 打造自己的流媒体音乐服务 剪切板管理工具clipcat推荐 MangoHud性能监控 微信小程序开发记 Rofi试用 解决Arch下VSCode无法输入中文的问题 独立窗口管理器下无法录屏问题处理 上海市二手房成交数据监控 OpenLDAP监控 Arch linux如何顺畅连接蓝牙设备 使用Git和Ansible管理配置文件 Arch Linux SSL VPN 客户端配置 简单获取celery任务实时结果 Arch linux下iNode客户端的安装和使用方法
一种Xterm.js的全屏方案
2023-04-13 · via mephisto.cc

Xterms.js是一个TypeScript编写的前端组件,能在浏览器中带给你全方位终端体验, VS Code的终端功能就是使用的它实现,感觉就和真的终端一样。

既然是在浏览器中运行,页面中一般包含其它元素,过多的元素会占用有限屏幕空间,分散用户注意力。在部分场景下,有全屏展示的需求,本文介绍一种兜底的全屏实现方案,供读者参考。你能搜到这个文章,一定是折腾了很久的,我写这个文章的时候,在vue3的组件中,因为一些离奇的未知原因,调试很久才成功。

基础环境准备就不啰嗦了,内容简单,看看官方文档即可。

下面只是个vue示例,仅供参考:

 1<template>
 2    <div v-if="loading">loading...</div>
 3    <div v-if="error">failed to fetch</div>
 4    <div>
 5        <div id="terminal"></div>
 6    </div>
 7</template>
 8
 9// ... 此处省略
10import { Terminal } from 'xterm'
11import { FitAddon } from 'xterm-addon-fit';
12import "xterm/css/xterm.css";
13// ... 此处省略

核心逻辑

 1const term = new Terminal({
 2    cursorBlink: true,
 3    // 各种配置省略,网上一堆示例。
 4});
 5
 6term.loadAddon(fitAddon)
 7function fitTerminal() {
 8    fitAddon.fit();
 9    term.scrollToBottom();
10}
11
12term.open(document.getElementById('terminal'));
13fitTerminal();
14
15window.addEventListener('resize', fitTerminal);
16
17// 1. 按F11全屏
18document.addEventListener('keydown', (e) => {
19    if (e.key === 'F11') {
20        toggleFullscreen();
21    }
22});
23
24// 2. 点击按钮全屏, 供读者参考
25// document.getElementById("fullbtn").addEventListener("click", toggleFullscreen)
26
27// chatGPT的功劳,够底层,不服不行,兜底的底气来自这里。
28function toggleFullscreen() {
29    const doc = window.document;
30    const docEl = doc.documentElement;
31
32    const requestFullScreen =
33        docEl.requestFullscreen || docEl.mozRequestFullScreen || docEl.webkitRequestFullScreen || docEl.msRequestFullscreen;
34    const cancelFullScreen =
35        doc.exitFullscreen || doc.mozCancelFullScreen || doc.webkitExitFullscreen || doc.msExitFullscreen;
36
37    if (!doc.fullscreenElement && !doc.mozFullScreenElement && !doc.webkitFullscreenElement && !doc.msFullscreenElement) {
38        requestFullScreen.call(docEl);
39    } else {
40        cancelFullScreen.call(doc);
41    }
42}

该示例中,使用了 Terminal 类创建了一个终端对象,并将其渲染到页面上的某个元素中。在页面初次加载时,调用了 fitTerminal 函数,将终端对象自适应父元素的大小,并将滚动条调整到底部。随后,使用 addEventListener 监听了 resize 事件,使得终端可以随着父元素大小的变化而自适应调整。此外,还监听了 keydown 事件,当用户按下 F11 键时切换全屏(也可以点击按键全屏,绑定到一个全屏按钮图标上,参考代码注释2)。

toggleFullscreen 函数中,使用了 W3C 标准的 requestFullscreenexitFullscreen API 来实现全屏切换。这部分是ChatGPT帮忙实现的,不得不佩服,连W3C标准都搬出来了,从这方面来看人脑是永远赶不上了,毕竟容量有限。