Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | /**
* @description Parsing the parameters attached to the url as objects.
* @param url
*/
export function getUrlSearchParams(url = location.href) {
const urlP = new URL(url)
return Object.fromEntries(new URLSearchParams(urlP.search))
}
/* c8 ignore start */
interface ObserveElementP {
/** @default The whole viewport */
containerE?: Element
observeE: Element | Element[]
// eslint-disable-next-line @typescript-eslint/ban-types,no-unused-vars
doSomeWhenIn?: (entry?: IntersectionObserverEntry) => void
// eslint-disable-next-line no-unused-vars
doSomeWhenOut?: (entry?: IntersectionObserverEntry) => void
/** @default "0px 0px 0px 0px" */
rootMargin?: string
}
/**
* @description 'observeE' is in 'containerE', and 'containerE' is generally scrollable. 'containerE' can intersection observe the 'observeE' , when observeE come in(or out) containerE, you can do something by using 'doSomeWhenIn'.
* @param observeElementP
* @link https://developer.mozilla.org/en-US/docs/Web/API/IntersectionObserver/IntersectionObserver
*/
export function intersectionObserverElement(observeElementP: ObserveElementP) {
const { containerE, observeE, doSomeWhenIn, doSomeWhenOut, rootMargin } = observeElementP
if (!observeE) {
console.log('ObserveElement must be Element type.')
return
}
const callBack: IntersectionObserverCallback = (entries) => {
entries.forEach((item) => {
if (item.isIntersecting) {
doSomeWhenIn && doSomeWhenIn(item)
} else {
doSomeWhenOut && doSomeWhenOut(item)
}
})
}
const Observer = new IntersectionObserver(callBack, { root: containerE, rootMargin })
if (Array.isArray(observeE)) {
observeE.forEach((e) => {
Observer.observe(e)
})
} else {
Observer.observe(observeE)
}
}
interface DownloadFileP {
file?: Blob | File
fileUrl?: string
fileName: string
}
/**
* @description Single file download. notice:You must select one between 'file' and 'fileUrl'. Notice: when you use fileUrl to download, you should has 'a common origin', otherwise the filename setting will not take effect.
* @param data
*/
export function downloadFile(data: DownloadFileP) {
const { file, fileUrl, fileName } = data
const a = document.createElement('a')
a.style.display = 'none'
a.download = fileName
if (file && fileUrl) {
throw "You must select one between 'file' and 'fileUrl' as incoming parameters"
} else if (fileUrl) {
a.href = fileUrl
} else if (file) {
a.href = URL.createObjectURL(file)
} else {
throw 'Can not find the file data.'
}
document.body.appendChild(a)
a.click()
URL.revokeObjectURL(a.href)
document.body.removeChild(a)
}
/**
* @description More responsive audio playback. And just use js code.
* @param audioUrl
*/
export function playAudio(audioUrl: string): Promise<AudioBufferSourceNode> {
return new Promise((resolve, reject) => {
const audioCtx = new AudioContext()
fetch(audioUrl)
.then((res) => res.arrayBuffer())
.then((arraybuffer) => audioCtx.decodeAudioData(arraybuffer))
.then((audioBuffer) => {
const audioBufferSourceNode = audioCtx.createBufferSource()
audioBufferSourceNode.buffer = audioBuffer
audioBufferSourceNode.connect(audioCtx.destination)
resolve(audioBufferSourceNode)
})
.catch((err) => {
reject(err)
})
})
}
/**
* @description One-click copy.
* @param text
* @param preserveFormatting
*/
export function fastCopy(text: string, preserveFormatting = false) {
const element = preserveFormatting ? 'textarea' : 'input'
const input = document.createElement(element)
input.value = text
input.setAttribute('readOnly', 'true')
document.body.appendChild(input)
input.select()
document.execCommand('copy')
document.body.removeChild(input)
}
/* c8 ignore stop */
|