1( function () { 2 'use strict'; 3 4 if ( typeof CKTR === 'undefined' || ! CKTR.trackers || ! CKTR.trackers.length ) { 5 return; 6 } 7 8 var lastFired = {}; // tracker_id -> timestamp (ms) for client-side rate limit. 9 var rateMs = ( parseInt( CKTR.rateLimit, 10 ) || 0 ) * 1000; 10 11 function send( trackerId ) { 12 var now = Date.now(); 13 if ( rateMs > 0 && lastFired[ trackerId ] && ( now - lastFired[ trackerId ] ) < rateMs ) { 14 return; 15 } 16 lastFired[ trackerId ] = now; 17 18 var body = new URLSearchParams(); 19 body.append( 'action', 'cktr_record' ); 20 body.append( 'nonce', CKTR.nonce ); 21 body.append( 'tracker_id', trackerId ); 22 body.append( 'page_url', window.location.href ); 23 24 // Fire and forget; keepalive so it survives navigation. 25 fetch( CKTR.ajax, { 26 method: 'POST', 27 headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, 28 body: body.toString(), 29 keepalive: true, 30 credentials: 'same-origin' 31 } ).catch( function () {} ); 32 } 33 34 // Event delegation: works for dynamically added elements too. 35 document.addEventListener( 'click', function ( e ) { 36 for ( var i = 0; i < CKTR.trackers.length; i++ ) { 37 var t = CKTR.trackers[ i ]; 38 var selector = t.selector; 39 var target; 40 try { 41 target = e.target.closest( selector ); 42 } catch ( err ) { 43 continue; // invalid selector, skip. 44 } 45 if ( target ) { 46 send( t.id ); 47 } 48 } 49 }, true ); 50} )();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.