runAsync
使用 web worker 在一个单独的线程中执行函数,能够允许执行不阻塞 UI 渲染的耗时函数
使用 blob 形式的 url 来创建
worker
,worker
的内容应该是函数的系列化版本,然后立即返回函数的返回值返回值是一个
promise
,它监听了worker
的onmessage
andonerror
两个事件,返回从主线程发送过来的数据或者是抛出一个错误1
2
3
4
5
6
7
8
9
10
11
12
13
14
15const runAsync = fn => {
const worker = new Worker(
URL.createObjectURL(new Blob([`postMessage((${fn})());`]), {
type: 'application/javascript; charset=utf-8'
})
);
return new Promise((res, rej) => {
worker.onmessage = ({ data }) => {
res(data), worker.terminate();
};
worker.onerror = err => {
rej(err), worker.terminate();
};
});
};
example
1 | const longRunningFunction = () => { |
然后由于代码是在不同的上下文执行的,因此所有的变量以及函数声明都要在内部定义,
比如下面这个是不行滴。
1 | let outsideVariable = 50; |
Copy to Clipboard
- 创建一个
textarea
或者input
元素添加到document
中,让它的值等于要我们想要复制到粘贴板上的值 - 使用
HTMLInputElement.select()
选择 刚刚创建的元素的内容 - 调用
Document.execCommand('copy')
复制刚刚选中的内容 - 将刚刚创建的元素移除
1 | const copy = val=>{ |
但是在执行这个方法的时候,在插入以及移除元素的时候可能会发生闪烁,一个常见的解决方案就是把创建的这个元素放置在不可见区域,看一下改造后的方法
1 | const copyToClipboard = str => { |
修改 url 来重载页面
使用 h5 的 history
1 | const nextURL = 'https://my-website.com/page_b'; |
history api 只允许访问同源网站,所以你不能导航到域名完全不一样的网站
location
location api 是比较旧的东西了,它需要重载页面才可以改变浏览器记录
获取当前 url
1 | const getBaseUrl = url =>{ |
EXAMPLES
1 | getBaseURL('http://url.com/page?name=Adam&surname=Smith'); |