Skip to content

常用代码片段

javascript
// 复制文本到剪切板
const copy2Clipboard = (text) => navigator.clipboard.writeText(text)
// 解析 url 参数
function parseQuery(url) {
    const q = {}
    url.replace(/([^?&=]+)=([^&]+)/g, (_, k, v) => (q[k] = v))
    return q
}

clipboard API

javascript
// 将剪切板的图片粘贴到页面上
// <div contenteditable id="editor" />
const editor = document.querySelector('#editor')
editor.on('paste', () => {
    e.preventDefault()
    const [file] = e.clipboardData.files
    const reader = new FileReader()
    reader.onload = (e) => {
        const img = document.createElement('img')
        img.src = e.target.result
        editor.appendChild(img)
    }
    reader.readAsDataURL(file)
})

Intersection Observer

替换图片
javascript
const ob = new IntersectionObserver((entries) => {
    for (const entry of entries) {
        if (entry.isIntersecting) {
            // 已经进入页面
            const img = entry.target
            img.src = img.dataset.src
            ob.unobserve(img) // 图片已经真实加载,不需要再监听该元素了
        }
    }
})
const imgs = document.querySelectorAll('img[data-src]')
imgs.forEach((img) => {
    ob.observe(img)
})
// loading 加载效果=》页面底部增加一个 loading icon,只对它进行 observe,出现了则代表触底,触发 loadingMore 即可

动画函数

typescript
function animation(
    duration: number,
    from: number,
    to: number,
    onProgress: (value: number) => void
) {
    let value = from
    const speed = (to - from) / duration
    const start = Date.now()

    function _run() {
        const passed = Date.now() - start
        if (passed >= duration) {
            value = to
            onProgress(value)
            return
        }
        value = from + passed * speed
        onProgress(value)
        requestAnimationFrame(_run)
    }

    _run()
}

分时函数封装

javascript
requestIdleCallback((idle) => {
    while (idle.timeRemaining()) {
        // do something
    }
})

流式数据获取

javascript
async function getResponse() {
    const resp = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',
        },
        body: JSON.stringify({
            content: '讲个困困和马老师打拳击的故事',
        }),
    })

    const reader = resp.body.getReader()
    // 解码器
    const textDecoder = new TextDecoder()
    while (1) {
        const { done, value } = await reader.read()
        // 解码成文字
        const str = textDecoder.decode(value)
        console.log(str)
        if (done) {
            break
        }
    }
}