Advertisement
Vojkovic

iframe - child page

Jul 1st, 2025
756
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <script>
  2.   (function() {
  3.     // If not in iframe, do nothing
  4.     try {
  5.       if (window.top === window.self) return;
  6.     } catch(e) {}
  7.    
  8.     // Set to false to prevent dataLayer messages from being sent to parent
  9.     var sendDataLayerMessages = true;
  10.    
  11.     // Set the prefix that will be used in the event name, and under which all
  12.     // the dataLayer properties will be embedded
  13.     var dataLayerMessagePrefix = 'iframe';
  14.    
  15.     // Set to parent origin ("https://www.domain.com")
  16.     var parentOrigin = 'https://www.mathnasium.com/';
  17.  
  18.     // Maximum time in milliseconds to poll the parent frame for ready signal
  19.     var maxTime = 2000;
  20.    
  21.     // Don't touch anything that follows
  22.     var pollInterval = 200;
  23.     var parentReady = false;
  24.    
  25.     var postCallback = function(event) {
  26.       if (event.origin !== parentOrigin) return;
  27.       if (event.data.event !== 'clientId' && event.data !== 'parentReady') return;
  28.      
  29.       if (event.data.event === 'clientId') {
  30.         window.dataLayer.push({
  31.           event: 'clientId',
  32.           clientId: event.data.clientId
  33.         });
  34.       }
  35.      
  36.       if (event.data === 'parentReady' && !parentReady) {
  37.         window.clearInterval(poll);
  38.         if (sendDataLayerMessages) startDataLayerMessageCollection();
  39.         parentReady = true;
  40.       }
  41.     };
  42.    
  43.     var pollCallback = function() {
  44.       // If maximum time is reached, stop polling
  45.       maxTime -= pollInterval;
  46.       if (maxTime <= 0) window.clearInterval(poll);
  47.       // Send message to parent that iframe is ready to retrieve Client ID
  48.       window.top.postMessage('childReady', parentOrigin);
  49.     };
  50.    
  51.     var createMessage = function(obj) {
  52.       if (!Array.isArray(obj) && typeof obj === 'object') {
  53.         var flattenObj = JSON.parse(JSON.stringify(obj));
  54.         var message = {};
  55.         // Add metadata about the page into the message
  56.         message[dataLayerMessagePrefix] = {
  57.           pageData: {
  58.             url: document.location.href,
  59.             title: document.title
  60.           }
  61.         };
  62.         for (var prop in flattenObj) {
  63.           if (flattenObj.hasOwnProperty(prop) && prop !== 'gtm.uniqueEventId') {
  64.             if (prop === 'event') {
  65.               message.event = dataLayerMessagePrefix + '.' + flattenObj[prop];
  66.             } else {
  67.               message[dataLayerMessagePrefix][prop] = flattenObj[prop];
  68.             }
  69.           }
  70.         }
  71.         if (!message.event) message.event = dataLayerMessagePrefix + '.Message';
  72.         return message;
  73.       }
  74.       return false;
  75.     };
  76.    
  77.     var startDataLayerMessageCollection = function() {
  78.       // Send the current dataLayer content to top frame, flatten the object
  79.       window.dataLayer.forEach(function(obj) {
  80.         var message = createMessage(obj);
  81.         if (message) window.top.postMessage(message, parentOrigin);
  82.       });
  83.       // Create the push listener for future messages
  84.       var oldPush = window.dataLayer.push;
  85.       window.dataLayer.push = function() {
  86.         var states = [].slice.call(arguments, 0);
  87.         states.forEach(function(arg) {
  88.           var message = createMessage(arg);
  89.           if (message) window.top.postMessage(message, parentOrigin);
  90.         });
  91.         return oldPush.apply(window.dataLayer, states);
  92.       };
  93.     };
  94.    
  95.     // Start polling the parent page with "childReady" message
  96.     var poll = window.setInterval(pollCallback, pollInterval);
  97.    
  98.     // Start listening for messages from the parent page
  99.     window.addEventListener('message', postCallback);
  100.   })();
  101. </script>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement