@@ -42,6 +42,8 @@ export const isString = (val: unknown): val is string =>
4242export const isNumber = ( val : unknown ) : val is number =>
4343 typeof val === 'number' ;
4444
45+ export const isArray = ( val : unknown ) : val is unknown [ ] => Array . isArray ( val ) ;
46+
4547/** 判断两个数是否在指定误差范围内相等 */
4648export const approx = ( val : number , target : number , range = 1 ) =>
4749 Math . abs ( target - val ) <= range ;
@@ -327,7 +329,13 @@ export const needDarkMode = (hexColor: string) => {
327329 return yiq < 128 ;
328330} ;
329331
330- /** 等到传入的函数返回 true */
332+ /**
333+ * 重复执行传入的函数,直到其返回真值或超时
334+ *
335+ * @param fn - 条件判断函数
336+ * @param timeout - 超时时间(毫秒),默认为 Infinity
337+ * @param waitTime - 轮询间隔时间(毫秒),默认为 100
338+ */
331339export async function wait < T > (
332340 fn : ( ) => T | undefined | Promise < T | undefined > ,
333341) : Promise < TrueValue < T > > ;
@@ -349,18 +357,24 @@ export async function wait<T>(
349357 _timeout -= waitTime ;
350358 res = await fn ( ) ;
351359 }
352-
353360 return res ;
354361}
355362
356- /** 等到指定的 dom 出现 */
357- export async function waitDom ( selector : string ) : Promise < HTMLElement > ;
363+ /** 等到指定 selector 匹配到指定数量的 dom 元素 */
358364export async function waitDom (
359365 selector : string ,
366+ count ?: number ,
367+ ) : Promise < HTMLElement [ ] > ;
368+ export async function waitDom (
369+ selector : string ,
370+ count ?: number ,
360371 timeout ?: number ,
361- ) : Promise < HTMLElement | null > ;
362- export async function waitDom ( selector : string , timeout ?: number ) {
363- return wait ( ( ) => querySelector ( selector ) , timeout ) ;
372+ ) : Promise < HTMLElement [ ] | undefined > ;
373+ export async function waitDom ( selector : string , count = 1 , timeout ?: number ) {
374+ return wait ( ( ) => {
375+ const elements = document . querySelectorAll < HTMLElement > ( selector ) ;
376+ return elements . length >= count ? [ ...elements ] : undefined ;
377+ } , timeout ) ;
364378}
365379
366380/** 等待指定的图片元素加载完成 */
@@ -718,3 +732,12 @@ export const getImageData = (img: HTMLImageElement) => {
718732 ctx . drawImage ( img , 0 , 0 ) ;
719733 return ctx . getImageData ( 0 , 0 , width , height ) ;
720734} ;
735+
736+ // TODO: 用这个重构相关实现
737+ export const withEventStop =
738+ < T extends Event > ( handler ?: ( e : T ) => void ) =>
739+ ( e : T ) => {
740+ e . stopPropagation ( ) ;
741+ e . preventDefault ( ) ;
742+ if ( handler ) handler ( e ) ;
743+ } ;
0 commit comments