s

查漏补缺3

多个标签页之前的通信

method1: 

在页面中打开pagex: window.open('./pageX.html', '__blank'),但是有只想做到第一次打开新页面,而后每次通信都是 与同一个pageX 通信 ,而不是每次都打开一个新页面

其实第二个参数  就可以取个名字 window.open('./pageX.html', 'pageA',), 这样子就可以实现第一次打开,后面执行就只会刷新这个页面。

method2:

使用广播的形式:

前提是:

1 同源标签页  也就是 前面的域名一致 localhost:xxxx

2.公用同一个广播频道、通道pageB

tabPage1:

const channel = new BroadcastChannel('pageB');

click() {

channel.postMessage('')  // 发送广播消息

}

tabPage2(receive):

const channel = new BroadcastChannel('pageB');

channel.addEventListener('message', (e) => {

let recMessage = e.data  // 绑定监听消息事件, 接收到的消息在e.data中!!!

})

并发任务的控制!!![待续]

function  timeout (time) {

return new Promise((resolve, reject) => {

setTimeout(() => {

  reject()

}, time)

})

}

 

现代浏览器访问用户本地文件夹!!!

【这里需要补充一个知识点,就是涉及到IO操作,都是异步的】

目前现代浏览器可以使用  showDirectoryPicker();  这个api 来弹出选择用户本地文件夹的功能, 会提示用户需要访问一些信息,同意后浏览器就可以获取到本地文件夹的信息了

showDirectoryPicker 这个方法返回的是一个promise 对象, 也就是这个操作是异步的。

 

let handle = await showDirectoryPicker() ;//  得到一个句柄  错误处理就先忽略。

handle.children = []

let  iterator = handle.entries();  // 得到一个 异步接迭代器 ,就可以使用for of 循环拿到文件和子文件夹 文件

for await (const info of iterator) {

  //  然后就可以判断是文件还是子文件  info.kind  == ‘file’ || 'directory'

  如果是子文件 就直接 放入 handle.children

  如果 是子文件夹, 那么递归继续判断。

}

 

如果是文件, 比如 html  如何得到文件内容?

如果是文件: 

可以使用let f = await file.getFile(); 这个方法得到文件内容, 返回结果就和上传按钮的File对象是一样的数据类型了。

const reader = new FileReader()

reader.readAsXXX 等方法 

这里就使用  reader.readASText(f, 'utf-8');

reader.onload = (e) => {console.log(e.target.result)}

至于如果是代码  ,高亮代码 可以使用 highlight.js  这个库实现

 


 


 


 

ts 中 never 类型的一个作用

 

如果后续修改 method 的类型, 系统就一下可以提示到这里需要添加分支。

 


 


 


 

 

 

 

 

 

 

posted @ 2023-09-21 15:43  努力不搬砖的iori  阅读(8)  评论(0编辑  收藏  举报