1console.log("datalayer_tracking script has been loaded"); 2 3function objectsEqual(obj1, obj2) { 4 const keys1 = Object.keys(obj1); 5 const keys2 = Object.keys(obj2); 6 7 if (keys1.length !== keys2.length) { 8 return false; 9 } 10 11 for (let i = 0; i < keys1.length; i++) { 12 const key = keys1[i]; 13 if (!obj2.hasOwnProperty(key)) { 14 return false; 15 } 16 } 17 18 return true; 19} 20 21/** 22 * @param elementOrSelector {string | Element} 23 * @param data {{event:string}} 24 */ 25function trackEvent(data) { 26 /** 27 * Check https://forte-digital.atlassian.net/wiki/spaces/MBN/pages/4292477215/Event+Tracking for event documentation */ 28 29 const defaultKeys = ["system_loc", "event_url"]; 30 31 const validEvents = { 32 email_contact: ["contact_name", "contact_title", ...defaultKeys], 33 page_switch_asia_fl: ["target_url", ...defaultKeys], 34 click_social_media_icon: ["social_platform_name", ...defaultKeys], 35 sidelink: ["sidelink_name", "target_url", ...defaultKeys], 36 video: [ 37 "video_title", 38 "video_status", 39 "video_percent", 40 "video_provider", 41 "video_url", 42 ...defaultKeys, 43 ], 44 }; 45 46 const validEventKeys = Object.keys(validEvents); 47 48 // const element = 49 // typeof elementOrSelector === "string" 50 // ? document.querySelector(elementOrSelector) 51 // : elementOrSelector; 52 53 // if (!element) { 54 // console.error(`trackEvent: elementOrSelector '${elementOrSelector}' is invalid`); 55 // return; 56 // } 57 if (!data) { 58 console.error("trackEvent: data is missing"); 59 return; 60 } 61 62 const { event } = data; 63 64 if (!validEventKeys.includes(event)) { 65 console.error(`trackEvent: '${event}' is not a valid event`); 66 return; 67 } 68 69 const eventDataKeys = { ...data }; 70 delete eventDataKeys.event; 71 72 const validDataKeys = validEvents[event].reduce((prev, cur) => ({ [cur]: cur, ...prev }), {}); 73 74 if (!objectsEqual(eventDataKeys, validDataKeys)) { 75 console.warn("trackEvent: data is not matching", { 76 //element, 77 expectedDataKeys: validEvents[event], 78 receivedDataKeys: Object.keys(eventDataKeys), 79 }); 80 } 81 82 window.dataLayer = window.dataLayer || []; 83 dataLayer.push(data); 84 console.log("trackEvent: pushed data", { dataLayer, data }); 85 86 // console.log(`trackEvent: registered`, { elementSelector: elementOrSelector, data, element }); 87 88 // const TRACKED_EVENT = "tracked_event"; 89 90 // if (element.getAttribute(TRACKED_EVENT) === event) { 91 // console.warn(`trackEvent: already tracking event '${event}' on element, skipping`, { 92 // element, 93 // }); 94 // return; 95 // } 96 97 // element.addEventListener("click", () => { 98 // window.dataLayer = window.dataLayer || []; 99 // dataLayer.push(data); 100 // console.log("trackEvent: click detected, pushed data", { dataLayer, element, data }); 101 // }); 102 103 // element.setAttribute(TRACKED_EVENT, event); 104}
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.