@@ -626,7 +626,10 @@ function getValidDomList(queryList) {
626626 * - 按需启动观察服务以节省资源,任务全部完成时自动停止。
627627 */
628628const gDomObserver = ( ( ) => {
629- let _observer = null , _rafId = null ;
629+ let _observer = null , _rafId = null , _debug = false ;
630+ const _log = ( ...a ) => _debug && console . log ( "[gDomObserver]" , ...a ) ;
631+ const _warn = ( ...a ) => _debug && console . warn ( "[gDomObserver]" , ...a ) ;
632+ const _error = ( ...a ) => _debug && console . error ( "[gDomObserver]" , ...a ) ;
630633 const _pendingMap = new Map ( ) ;
631634 class Task {
632635 constructor ( deadline , resolve , reject ) {
@@ -643,7 +646,7 @@ const gDomObserver = (() => {
643646 cancelAnimationFrame ( _rafId ) ;
644647 _rafId = null ;
645648 }
646- console . log ( "DouyuEX gDomObserver: 所有任务完成,停止观察实例" ) ;
649+ _log ( "DouyuEX gDomObserver: 所有任务完成,停止观察实例" ) ;
647650 }
648651 }
649652 function _parseTimeout ( timeout ) {
@@ -666,11 +669,11 @@ const gDomObserver = (() => {
666669 const element = _rawQuery ( selector ) ;
667670 for ( const task of group . tasks ) {
668671 if ( current >= task . deadline ) {
669- console . warn ( "DouyuEX gDomObserver: 计时到达上限,终止等待任务" , selector ) ;
672+ _warn ( "DouyuEX gDomObserver: 计时到达上限,终止等待任务" , selector ) ;
670673 task . reject ( new Error ( `DouyuEX waitForElement: Timeout - "${ selector } "` ) ) ;
671674 group . tasks . delete ( task ) ;
672675 } else if ( element ) {
673- console . log ( "DouyuEX gDomObserver: 目标元素出现,完成等待任务" , element ) ;
676+ _log ( "DouyuEX gDomObserver: 目标元素出现,完成等待任务" , element ) ;
674677 task . resolve ( element ) ;
675678 group . tasks . delete ( task ) ;
676679 }
@@ -707,26 +710,26 @@ const gDomObserver = (() => {
707710 */
708711 waitForElement ( selector , timeout = null , signal = null ) {
709712 if ( signal && signal . aborted ) {
710- console . warn ( "DouyuEX gDomObserver: 信号已中止,拒绝创建任务" , selector ) ;
713+ _warn ( "DouyuEX gDomObserver: 信号已中止,拒绝创建任务" , selector ) ;
711714 return Promise . reject ( signal . reason || new DOMException ( "Aborted" , "AbortError" ) ) ;
712715 }
713716 const selectorTrimmed = typeof selector === "string" ? selector . trim ( ) : "" ;
714717 let element ;
715718 try {
716719 element = _rawQuery ( selectorTrimmed , false , true ) ;
717720 } catch ( err ) {
718- console . error ( "DouyuEX gDomObserver: 非法的选择器,拒绝创建任务" , selector , err ) ;
721+ _error ( "DouyuEX gDomObserver: 非法的选择器,拒绝创建任务" , selector , err ) ;
719722 return Promise . reject ( new Error ( `DouyuEX waitForElement: Invalid selector - "${ selector } ", ${ err . message } ` ) ) ;
720723 }
721724 const existing = _pendingMap . get ( selectorTrimmed ) ;
722725 if ( element ) {
723726 if ( existing ) {
724- console . log ( "DouyuEX gDomObserver: 目标元素存在,完成已有任务" , element ) ;
727+ _log ( "DouyuEX gDomObserver: 目标元素存在,完成已有任务" , element ) ;
725728 for ( const task of existing . tasks ) task . resolve ( element ) ;
726729 _pendingMap . delete ( selectorTrimmed ) ;
727730 _disconnect ( ) ;
728731 } else {
729- console . log ( "DouyuEX gDomObserver: 目标元素存在,直接返回结果" , element ) ;
732+ _log ( "DouyuEX gDomObserver: 目标元素存在,直接返回结果" , element ) ;
730733 }
731734 return Promise . resolve ( element ) ;
732735 }
@@ -741,7 +744,7 @@ const gDomObserver = (() => {
741744 const task = new Task ( deadline , resolveFn , rejectFn ) ;
742745 if ( signal ) {
743746 signal . addEventListener ( "abort" , ( ) => {
744- console . warn ( "DouyuEX gDomObserver: 收到外部信号,终止等待任务" , selectorTrimmed ) ;
747+ _warn ( "DouyuEX gDomObserver: 收到外部信号,终止等待任务" , selectorTrimmed ) ;
745748 task . reject ( signal . reason || new DOMException ( "Aborted" , "AbortError" ) ) ;
746749 const group = _pendingMap . get ( selectorTrimmed ) ;
747750 if ( ! group ) return ;
@@ -751,17 +754,17 @@ const gDomObserver = (() => {
751754 } , { once : true } ) ;
752755 }
753756 if ( existing ) {
754- console . log ( "DouyuEX gDomObserver: 等待元素相同,添加新的任务" , selectorTrimmed , deadlineLabel ) ;
757+ _log ( "DouyuEX gDomObserver: 等待元素相同,添加新的任务" , selectorTrimmed , deadlineLabel ) ;
755758 existing . tasks . add ( task ) ;
756759 } else {
757760 _pendingMap . set ( selectorTrimmed , { tasks : new Set ( [ task ] ) } ) ;
758761 if ( ! _observer ) {
759762 const root = document . body || document . documentElement || document ;
760763 _observer = new MutationObserver ( _checkElements ) ;
761764 _observer . observe ( root , { childList : true , subtree : true } ) ;
762- console . log ( "DouyuEX gDomObserver: 启动观察实例,创建首个任务" , selectorTrimmed , deadlineLabel ) ;
765+ _log ( "DouyuEX gDomObserver: 启动观察实例,创建首个任务" , selectorTrimmed , deadlineLabel ) ;
763766 } else {
764- console . log ( "DouyuEX gDomObserver: 复用观察实例,加入任务队列" , selectorTrimmed , deadlineLabel ) ;
767+ _log ( "DouyuEX gDomObserver: 复用观察实例,加入任务队列" , selectorTrimmed , deadlineLabel ) ;
765768 }
766769 }
767770 return promise ;
@@ -786,18 +789,18 @@ const gDomObserver = (() => {
786789 */
787790 raceForElement ( selectors , timeout = null ) {
788791 if ( ! Array . isArray ( selectors ) || selectors . length === 0 ) {
789- console . error ( "DouyuEX gDomObserver: 无效的选择器,竞速任务中止" ) ;
792+ _error ( "DouyuEX gDomObserver: 无效的选择器,竞速任务中止" ) ;
790793 return Promise . reject ( new Error ( `DouyuEX raceForElement: Empty array of selectors - ${ selectors } ` ) ) ;
791794 }
792795 const controller = new AbortController ( ) , parsedTimeout = _parseTimeout ( timeout ) ;
793796 let finished = false , rejectedCount = 0 , timeoutId = null ;
794- console . log ( "DouyuEX gDomObserver: 启动竞速任务,等待元素列表" , selectors ) ;
797+ _log ( "DouyuEX gDomObserver: 启动竞速任务,等待元素列表" , selectors ) ;
795798 return new Promise ( ( resolve , reject ) => {
796799 if ( parsedTimeout != null ) {
797800 timeoutId = setTimeout ( ( ) => {
798801 if ( finished ) return ;
799802 finished = true ;
800- console . warn ( "DouyuEX gDomObserver: 超过最大时长,竞速任务失败" ) ;
803+ _warn ( "DouyuEX gDomObserver: 超过最大时长,竞速任务失败" ) ;
801804 const timeoutError = new Error ( `DouyuEX raceForElement: No elements appeared within the timeout - ${ selectors } ` ) ;
802805 controller . abort ( timeoutError ) ;
803806 reject ( timeoutError ) ;
@@ -808,21 +811,34 @@ const gDomObserver = (() => {
808811 if ( finished ) return ;
809812 finished = true ;
810813 clearTimeout ( timeoutId ) ;
811- console . log ( "DouyuEX gDomObserver: 竞速任务完成,首先出现元素" , selector , element ) ;
814+ _log ( "DouyuEX gDomObserver: 竞速任务完成,首先出现元素" , selector , element ) ;
812815 controller . abort ( ) ;
813816 resolve ( { selector, element } ) ;
814817 } ) . catch ( err => {
815818 if ( finished ) return ;
816819 if ( ++ rejectedCount === selectors . length ) {
817820 finished = true ;
818821 clearTimeout ( timeoutId ) ;
819- console . warn ( "DouyuEX gDomObserver: 无效的选择器,竞速任务失败" , err ) ;
822+ _warn ( "DouyuEX gDomObserver: 无效的选择器,竞速任务失败" , err ) ;
820823 reject ( new Error ( `DouyuEX raceForElement: All selectors are invalid - ${ selectors } ` ) ) ;
821824 }
822825 } ) ;
823826 }
824827 } ) ;
825828 } ,
829+ /*
830+ * 设置调试日志的开关状态:
831+ * @description
832+ * - 默认关闭,所有内部日志(log / warn / error)均不输出;
833+ * - 开启后,内部运行状态、任务创建、元素匹配、超时及中止等事件均会输出至控制台;
834+ * - 可在任意时刻调用,实时生效,不影响已有的等待任务。
835+ * @param {any } enabled - 是否开启调试日志,传入任意真值开启,假值关闭
836+ * @returns {void }
837+ * @example
838+ * gDomObserver.setDebug(true); // 开启,输出所有内部日志
839+ * gDomObserver.setDebug(false); // 关闭,静默运行(默认)
840+ */
841+ setDebug ( enabled ) { _debug = ! ! enabled ; } ,
826842 } ;
827843} ) ( ) ;
828844
0 commit comments