@@ -194,44 +194,64 @@ function reportClickEvent(event) {
194
194
} , JSON . stringify ( req ) ) ;
195
195
} ;
196
196
197
- function addClickHandlers ( bannersIds ) {
198
- setTimeout ( function ( ) {
199
- bannersIds . forEach ( function ( bannerId ) {
200
- let doc = document . getElementById ( bannerId ) ;
201
- if ( doc ) {
202
- let iframe = doc . getElementsByTagName ( 'iframe' ) [ 0 ] ;
203
- if ( iframe ) {
204
- iframe . contentDocument . addEventListener ( 'click' , reportClickEvent ) ;
205
- }
206
- }
207
- } ) ;
208
- } , 1500 ) ;
197
+ function addClickHandler ( bannerId ) {
198
+ pinHandlerToHTMLElement ( bannerId , dataLoaderForHandler , addClickListener ) ;
209
199
} ;
210
200
211
- function displayedImpressionHandler ( bannersIds ) {
212
- setTimeout ( function ( ) {
213
- bannersIds . forEach ( ( bannerId ) => {
214
- let doc = document . getElementById ( bannerId ) ;
215
- if ( doc ) {
216
- let iframe = doc . getElementsByTagName ( 'iframe' ) [ 0 ] ;
217
- if ( iframe ) {
218
- let displayedImpressionImg = iframe . contentDocument . getElementsByTagName ( 'img' ) . length > 0 ;
219
- if ( displayedImpressionImg ) {
220
- let timestamp = new Date ( ) . toISOString ( ) ;
221
- let requestId = generateUUID ( ) ;
222
- let impression = {
223
- timestamp,
224
- 'request_id' : requestId ,
225
- } ;
226
- if ( rivrAnalytics . context . queue ) {
227
- rivrAnalytics . context . queue . push ( impression ) ;
228
- }
229
- }
230
- }
201
+ function addDisplayedImpHandler ( bannerId ) {
202
+ pinHandlerToHTMLElement ( bannerId , dataLoaderForHandler , impHandler ) ;
203
+ } ;
204
+
205
+ function pinHandlerToHTMLElement ( elementId , dataLoaderForHandler , specializedHandler ) {
206
+ function waitForElement ( ) {
207
+ let element = document . getElementById ( elementId ) ;
208
+ if ( ! element ) {
209
+ window . requestAnimationFrame ( waitForElement ) ;
210
+ } else {
211
+ dataLoaderForHandler ( element , specializedHandler ) ;
212
+ }
213
+ }
214
+ waitForElement ( ) ;
215
+ }
216
+
217
+ function dataLoaderForHandler ( element , specializedHandler ) {
218
+ function waitForElement ( ) {
219
+ let iframe = element . getElementsByTagName ( 'iframe' ) [ 0 ] ;
220
+ if ( ! iframe ) {
221
+ window . requestAnimationFrame ( waitForElement ) ;
222
+ } else {
223
+ let displayedImpression = iframe . contentDocument . getElementsByTagName ( 'img' ) . length > 0 ;
224
+ if ( ! displayedImpression ) {
225
+ window . requestAnimationFrame ( waitForElement ) ;
226
+ } else {
227
+ specializedHandler ( iframe ) ;
231
228
}
232
- } ) ;
233
- sendImpressions ( ) ;
234
- } , 3000 ) ;
229
+ }
230
+ }
231
+ waitForElement ( ) ;
232
+ } ;
233
+
234
+ function addClickListener ( iframe ) {
235
+ iframe . contentDocument . addEventListener ( 'click' , reportClickEvent ) ;
236
+ }
237
+
238
+ function impHandler ( iframe ) {
239
+ let timestamp = new Date ( ) . toISOString ( ) ;
240
+ let requestId = generateUUID ( ) ;
241
+ let impression = {
242
+ timestamp,
243
+ 'request_id' : requestId ,
244
+ } ;
245
+ if ( rivrAnalytics . context . queue ) {
246
+ rivrAnalytics . context . queue . push ( impression ) ;
247
+ }
248
+ }
249
+
250
+ function addHandlers ( bannersIds ) {
251
+ bannersIds . forEach ( ( bannerId ) => {
252
+ addClickHandler ( bannerId ) ;
253
+ addDisplayedImpHandler ( bannerId ) ;
254
+ } )
235
255
} ;
236
256
237
257
function fulfillAuctionObject ( ) {
@@ -353,8 +373,7 @@ rivrAnalytics.enableAnalytics = (config) => {
353
373
clientURL : window . location . href ,
354
374
queue : new ExpiringQueue ( sendImpressions , sendAuction , config . options . queueTimeout || DEFAULT_QUEUE_TIMEOUT )
355
375
} ;
356
- addClickHandlers ( config . options . bannersIds ) ;
357
- displayedImpressionHandler ( config . options . bannersIds ) ;
376
+ addHandlers ( config . options . bannersIds ) ;
358
377
logInfo ( 'Rivr Analytics enabled with config' , rivrAnalytics . context ) ;
359
378
rivrAnalytics . originEnableAnalytics ( config ) ;
360
379
} ;
0 commit comments