@@ -25,14 +25,14 @@ const firstInteraction = new Promise<void>(resolve => {
2525} )
2626
2727const visible = async ( tagName : string ) : Promise < void > => {
28- const makeViewportMonitor = ( itemsToMonitor : Element [ ] ) => {
29- return new Promise < void > ( signalComplete => {
30- const viewMonitor = new IntersectionObserver (
31- viewEvents => {
32- for ( const viewEvent of viewEvents ) {
33- if ( viewEvent . isIntersecting ) {
34- signalComplete ( )
35- viewMonitor . disconnect ( )
28+ const observeIntersection = ( elements : Element [ ] ) => {
29+ return new Promise < void > ( resolve => {
30+ const observer = new IntersectionObserver (
31+ entries => {
32+ for ( const entry of entries ) {
33+ if ( entry . isIntersecting ) {
34+ resolve ( )
35+ observer . disconnect ( )
3636 return
3737 }
3838 }
@@ -46,45 +46,44 @@ const visible = async (tagName: string): Promise<void> => {
4646 threshold : 0.01
4747 }
4848 )
49- for ( const monitoredItem of itemsToMonitor ) {
50- viewMonitor . observe ( monitoredItem )
49+ for ( const element of elements ) {
50+ observer . observe ( element )
5151 }
5252 } )
5353 }
5454
55- const makeElementHunter = ( ) => {
56- return new Promise < Element [ ] > ( deliverCapturedElements => {
57- const domHunter = new MutationObserver ( capturedChanges => {
58- for ( const capturedChange of capturedChanges ) {
59- const capturedNodes = Array . from ( capturedChange . addedNodes )
60- for ( const capturedNode of capturedNodes ) {
61- if ( ! ( capturedNode instanceof Element ) ) continue
62-
63- const directHit = capturedNode . matches ( tagName ) ? capturedNode : null
64- const nestedHit = capturedNode . querySelector ( tagName )
65- const successfulHit = directHit || nestedHit
66-
67- if ( successfulHit ) {
68- domHunter . disconnect ( )
69- deliverCapturedElements ( Array . from ( document . querySelectorAll ( tagName ) ) )
55+ const waitForElement = ( ) => {
56+ return new Promise < Element [ ] > ( resolve => {
57+ const observer = new MutationObserver ( mutations => {
58+ for ( const mutation of mutations ) {
59+ const addedNodes = Array . from ( mutation . addedNodes )
60+ for ( const node of addedNodes ) {
61+ if ( ! ( node instanceof Element ) ) continue
62+
63+ const isMatch = node . matches ( tagName )
64+ const descendant = node . querySelector ( tagName )
65+
66+ if ( isMatch || descendant ) {
67+ observer . disconnect ( )
68+ resolve ( Array . from ( document . querySelectorAll ( tagName ) ) )
7069 return
7170 }
7271 }
7372 }
7473 } )
7574
76- domHunter . observe ( document . documentElement , { childList : true , subtree : true } )
75+ observer . observe ( document . documentElement , { childList : true , subtree : true } )
7776 } )
7877 }
7978
80- const immediateFinds = Array . from ( document . querySelectorAll ( tagName ) )
79+ const existingElements = Array . from ( document . querySelectorAll ( tagName ) )
8180
82- if ( immediateFinds . length > 0 ) {
83- return makeViewportMonitor ( immediateFinds )
81+ if ( existingElements . length > 0 ) {
82+ return observeIntersection ( existingElements )
8483 }
8584
86- const delayedFinds = await makeElementHunter ( )
87- return makeViewportMonitor ( delayedFinds )
85+ const foundElements = await waitForElement ( )
86+ return observeIntersection ( foundElements )
8887}
8988
9089const strategies : Record < string , Strategy > = {
0 commit comments