网页版代码编辑器实现

接着前几天写的博客https://blog.csdn.net/woyebuzhidao321/article/details/131495855,提到了涉及vscode网页版工作区创建的api,这两天一时兴起,搞了一个网页版的代码编辑器,如果在2020年10月之前,实现一个网页版代码编辑器可能是天方夜谭,由于网页端操作本地文件的困难,很难搞得出,直到File System Access API的出现,打破了原来的瓶颈。

2020年10月 Chrome 86 重要更新

Chrome 86 在2020年10月推出了稳定版,现已全面应用于Android、Chrome OS、Linux、macOS 和 Windows等平台,我们一起来看下这次的重要更新。

若要看全部更新,请移步(https://www.chromestatus.com/features#milestone=86)。

新增稳定功能
文件系统访问

还记得Chrome 83中的本地文件系统吗,当时的试验功能,现已稳定。通过调用 showOpenFilePicker 方法,你可以唤起文件选择窗口,进而通过返回的文件句柄对文件进行读写。代码如下:

const pickerOpts = {types: [{description: "Images",accept: {"image/*": [".png", ".gif", ".jpeg", ".jpg"],},},],excludeAcceptAllOption: true,multiple: false,
};
// create a reference for our file handle
let fileHandle;async function getFile() {// open file picker, destructure the one element returned array[fileHandle] = await window.showOpenFilePicker(pickerOpts);// run code with our fileHandle
}

官方文档地址:
https://developer.mozilla.org/en-US/docs/Web/API/window/showOpenFilePicker

vscode网页版也是在此之后出现的。https://insiders.vscode.dev/

于是我照着大框实现了一个demo
Demo效果图
在这里插入图片描述
基于文件的增、删、改、查。读写速度很nice

打开文件夹

首先打开一个代码目录

$('#openFolderBtn')[0].addEventListener('click', async () => {try {// // 得到异步迭代器dirHandle = await window.showDirectoryPicker();const createTree = async () => {const root = await createTreeModel(dirHandle);fileArr = root;treeInit();}createTree();} catch (err) {console.log(err)}
})

在这里插入图片描述
这是会弹出一个文件弹窗
window.showDirectoryPicker是异步的 返回一个文件句柄,选中文件之后会出现提示
在这里插入图片描述
创建树的数据结构
在这里插入图片描述

读取文件

// 读取文件
async function reader() {if (fileHandle) {let file = await fileHandle.getFile();fileName.innerText = file.name;let reader = new FileReader();reader.onload = function (event) {let contents = escapeHtml(event.target.result);$("#textbox")[0].innerHTML = `<pre><code id="code">${contents}</code></pre>`;// hljs.highlightAll();hljs.highlightBlock($("#code")[0])};reader.readAsText(file);}
}

fileHandle是对应的文件句柄,通过调用getFile方法拿到文件,然后通过FileReader构造函数去读取文件内容并作展示

打开文件

如何单独打开一个本地文件

$('#openfile')[0].addEventListener('click', async () => {try {const openFileHandle = await window.showOpenFilePicker({types: [{accept: {"text/plain": [".txt"]}}],multiple: false});fileHandle = openFileHandle[0];reader();} catch (err) {console.log(err);}
})

选取一个文件并打开
在这里插入图片描述

如何创建一个文件夹

$("#createFolder")[0].addEventListener('click', async (e) => {const folderName = prompt('请输入文件夹名称');if (folderName) {await dirHandle.getDirectoryHandle(folderName, { create: true });console.log('文件夹创建成功');fileArrFlat = [];fileArr = await createTreeModel(dirHandle);treeInit();}
})

dirHandle是window.showDirectoryPicker返回的文件句柄,通过调用getDirectoryHandle方法创建。

创建一个文件

// 创建文件
$("#createFile")[0].addEventListener('click', async (e) => {const fileName = prompt('请输入文件名称');if (fileName) {try {if (!(await dirHandle.queryPermission()) === 'granted') {alert('文件不允许读写!');return;}const targetFile = await dirHandle.getFileHandle(fileName, { create: true });fileArrFlat = [];fileArr = await createTreeModel(dirHandle);treeInit();} catch (err) {console.log(err)}}
})

另存为文件并写入内容

// 另存为文件$("#textbox")[0].addEventListener('keydown', async (e) => {if (e.ctrlKey && e.which == 83) {e.preventDefault;console.log('文件另存为', $("#textbox")[0].innerText)try {fileHandle = await window.showSaveFilePicker({types: [{accept: {"text/plain": [".txt"]}}],multiple: false});const w$ = await fileHandle.createWritable();await w$.write($("#textbox")[0].innerText);await w$.close();} catch (err) {console.log(err);}return false;}}, false)

fileHandle文件句柄 提供了createWritable方法,对文件进行写入内容。

代码高亮部分使用的是highLight.js,这样一个最初版的网页版代码编辑器就搞定了

其兼容性
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/15187.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java语法小记】求字符串中某个字符的数量——IntStream流的使用

文章目录 引入需求代码原理解读s.chars()IntStream filter​(IntPredicate predicate)long count()补充&#xff1a;IntStream peek​(IntConsumer action) 流操作和管道 引入需求 从一段代码引入 return s.length() - (int) s.chars().filter(c -> c S).count(); 其中 (…

cmake流程控制---cmake数学计算操作和if命令

目录 cmake 数学计算操作 demo if命令 基本表达式 逻辑表达式(NOT AND OR) 比较表达式 正则表达式 demo 文件系统相关 判断是否存在的表达式 cmake 数学计算操作 有时候我们需要对cmake变量之间进行数学运算,这时候cmake提供了math()这个命令,命令格式如下: math(…

SQL-每日一题【584.寻找用户推荐人】

题目 给定表 customer &#xff0c;里面保存了所有客户信息和他们的推荐人。 写一个查询语句&#xff0c;返回一个客户列表&#xff0c;列表中客户的推荐人的编号都 不是 2。 对于上面的示例数据&#xff0c;结果为&#xff1a; 解题思路 1.题目要求查询列表中客户的推荐人的…

RTL8309M实现VLAN功能-驱动编进内核

部分硬件实现图 一、使内核支持802.1Q功能 1、使用内核kernel版本4.19.232 2、make menuconfig 配置内核 3、进入Networking support 4、进入Networking options 5、把这些都编进内核 6、点击保存退出 CONFIG_GARPy CONFIG_MRPy CONFIG_BRIDGE_VLAN_FILTERINGy CONFIG_VLAN…

Go语言程序设计(五)切片

一、切片的定义 在Go语言中,切片(Slice)是数组的一个引用,它会生成一个指向数组的指针,并通过切片长度关联到底层数组部分或者全部元素。切片还提供了一系列对数组的管理功能(append、copy)&#xff0c;可以随时动态扩充存储空间&#xff0c;并且可以被随意传递而不会导致所管理…

C++数据结构笔记(7)——队列的顺序结构实现

1.队列&#xff0c;和现实生活中的规则类似&#xff0c;先进先出 2.队尾只允许元素进入&#xff0c;队头只允许元素退出 3.用数组来实现队列的顺序存储&#xff0c;无论哪一段都可以作为队头或者队尾 SeqQueue.h头文件 #ifndef SEQQUEUE_H #define SEQQUEUE_H #include<…

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义&#xff1a; 1.2举例&#xff1a; 1.3总结&#xff1a; 二.进程信号地使用&#xff1a; 2.1信号种类&#xff1a; 2.2而操作系统向进程发送信号地方式有四种&#xff1a; 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

chrome开发调试小技巧—Replay XHR(重新请求)

一、需求 想要验证一个ajax请求&#xff0c;需要每次都需要在页面点几次才会触发或者刷新页面&#xff0c;着急调试看效果时&#xff0c;可以通过chrome的Replay XHR功能直接同参数重新请求ajax 二、实现 chrome调试工具network下找到要重新发起的ajax请求&#xff0c;右键找…

python读写excel利器:xlwings从入门到精通

python读写excel利器&#xff1a;xlwings 从入门到精通 目录 安装和使用 基础操作 操作工作簿操作工作表读取单元格写入(单元格赋值)range的操作&#xff08;range常用的api&#xff09; 写入一行或一列Excel数据(函数式&#xff09;使用range(\A1\).api.AddComment(\comments…

力扣 332. 重新安排行程

题目来源&#xff1a;https://leetcode.cn/problems/reconstruct-itinerary/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a; 这道题目有几个难点&#xff1a; 一个行程中&#xff0c;如果航班处理不好容易变成一个圈&#xff0c;成为死循环。解决&am…

ue4:Dota总结_BP_CameraPawn篇

设计wasd移动&#xff1a; 鼠标拖动视口&#xff1a; 鼠标滚轮调整远近&#xff1a; Beginplay&#xff1a; qe按键旋转&#xff1a; 变量&#xff1a;

word@制表位和列数据对齐@填空下划线制作

文章目录 refs制表位(tab stop)制表位类型 制作对其的下划线填空表单&#x1f47a;利用前导符代替下划线制作待填空下划线 制表位对其列数据模拟简单表格测试数据设置引线使用标尺设置 FAQ refs Insert or add tab stops - Microsoft SupportUsing the ruler in Word - Micros…