import { VueModule } from '../common-types' /** * `document.querySelector` * @param selector 选择器 */ export function dq(selector: string): Element | null /** * 在指定元素上进行`querySelector` * @param selector 元素 * @param scopedSelector 选择器 */ export function dq(element: Element, scopedSelector: string): Element | null export function dq(selectorOrElement: Element | string, scopedSelector?: string): Element | null { if (!scopedSelector) { return document.querySelector(selectorOrElement as string) } return (selectorOrElement as Element).querySelector(scopedSelector) } /** * `document.querySelectorAll` (返回转换过的真数组) * @param selector 选择器 */ export function dqa(selector: string): Element[] /** * 在指定元素上进行`querySelectorAll` (返回转换过的真数组) * @param selector 元素 * @param scopedSelector 选择器 */ export function dqa(element: Element, scopedSelector: string): Element[] export function dqa(selectorOrElement: Element | string, scopedSelector?: string): Element[] { if (!scopedSelector) { return Array.from(document.querySelectorAll(selectorOrElement as string)) } return Array.from((selectorOrElement as Element).querySelectorAll(scopedSelector)) } /** 空函数 */ export const none = () => { // Do nothing } /** * 等待一定时间 * @param time 延迟的毫秒数 */ export const delay = (time = 0) => new Promise(r => setTimeout(() => r(), time)) /** 测试字符串是否包含子串或匹配正则 * @param str 字符串 * @param pattern 子串或正则表达式 */ export const matchPattern = (str: string, pattern: string | RegExp) => { if (typeof pattern === 'string') { return str.includes(pattern) } return pattern.test(str) } /** 以`document.URL`作为被测字符串, 移除URL查询参数并调用`matchPattern` */ export const matchUrlPattern = (pattern: string | RegExp) => ( matchPattern(document.URL.replace(window.location.search, ''), pattern) ) /** 创建Vue组件的实例 * @param module Vue组件模块对象 * @param target 组件的挂载目标元素, 省略时不挂载直接返回 */ export const mountVueComponent = (module: VueModule, target?: Element | string) => { const instance = new Vue('default' in module ? module.default : module) // const instance = new Vue({ render: h => h('default' in module ? module.default : module) }) return instance.$mount(target) as Vue & T } /** 是否处于其他网站的内嵌播放器中 */ export const isEmbeddedPlayer = () => window.location.host === 'player.bilibili.com' || document.URL.startsWith('https://www.bilibili.com/html/player.html') /** 是否处于`