1class PopupPowerPro 2{ 3 constructor() { 4 this.init(); 5 this.registerHooks(); 6 this.hookControlPopupAppearance(); 7 8 document.addEventListener('popuppower-init', (event) => { 9 if (document.querySelector('.poppower-layout-confirm')) { 10 this.initConfirmDialog(window.popupPower); 11 } 12 }); 13 } 14 15 init() { 16 let html = document.getElementsByTagName('html').item(0); 17 this.viewPortHeight = window.innerHeight; 18 this.totalBodyHeight = Math.max( document.body.scrollHeight, document.body.offsetHeight, 19 html.clientHeight, html.scrollHeight, html.offsetHeight ); 20 } 21 22 initConfirmDialog(popupPower) { 23 popupPower.popup.querySelector('.popuppower-confirm > button').addEventListener('click', (event) => { 24 popupPower.closePopup(); 25 }); 26 } 27 28 static canUserScroll() { 29 let popupPowerPro = new PopupPowerPro(); 30 return popupPowerPro.viewPortHeight < popupPowerPro.totalBodyHeight; 31 } 32 33 registerHooks() { 34 document.slavleePopupPowerHooks = { 35 controlPopupAppearance: this.hookControlPopupAppearance, 36 closePopup: this.hookClosePopup 37 }; 38 } 39 40 hookControlPopupAppearance(popupPower) { 41 if (typeof popupPower == 'undefined') { 42 return; 43 } 44 45 let cookie = popupPower.getCookie(); 46 47 let showPopup = !cookie; 48 let showCount = cookie ? cookie.showCount : 0; 49 50 if (popupPower.settings.behaviourAppearance == 'always') { 51 showPopup = true; 52 }else if(popupPower.settings.behaviourAppearance == 'once' && showCount == 0) { 53 showPopup = true; 54 }else if(popupPower.settings.behaviourAppearance == 'xtimes' && showCount < popupPower.settings.xtimes) { 55 showPopup = true; 56 } 57 58 if (showPopup) { 59 switch(popupPower.settings.appearanceTrigger) { 60 case 'onscroll': 61 // check if user can scroll 62 if (PopupPowerPro.canUserScroll()) { 63 document.addEventListener('scroll', (event) => { 64 setTimeout(() => { 65 popupPower.showPopup(); 66 }, popupPower.settings.delay); 67 }); 68 }else { 69 // if user can't scroll, then show 70 // process like DOM loaded 71 setTimeout(() => { 72 popupPower.showPopup(); 73 }, popupPower.settings.delay); 74 } 75 break; 76 case 'inviewport': 77 if (!this.observerInViewport) { 78 this.observerInViewport = new IntersectionObserver((entries) => { 79 entries.forEach(entry => { 80 if (entry.intersectionRatio > 0) { 81 setTimeout(() => { 82 popupPower.showPopup(); 83 }, popupPower.settings.delay); 84 } 85 }); 86 }); 87 } 88 89 if (popupPower.settings.contentElement) { 90 let target = document.getElementById('c' + popupPower.settings.contentElement); 91 92 if (target) { 93 this.observerInViewport.observe(target); 94 } 95 } 96 break; 97 case 'exitintent': 98 const mouseListener = e => { 99 // Nur auslösen, wenn: 100 // - Maus den oberen Rand verlässt (clientY <= 0) 101 // - Kein anderes Element betreten wird (relatedTarget == null) 102 if (e.clientY <= 0 && !e.relatedTarget && !e.toElement) { 103 setTimeout(() => { 104 popupPower.showPopup(); 105 }, popupPower.settings.delay); 106 document.removeEventListener("mouseout", mouseListener); 107 } 108 } 109 document.addEventListener("mouseout", mouseListener); 110 break; 111 default: 112 setTimeout(() => { 113 popupPower.showPopup(); 114 }, popupPower.settings.delay); 115 break; 116 } 117 } 118 119 if (popupPower.settings.behaviourAppearance == 'always') { 120 popupPower.deleteCookie(); 121 } 122 } 123 124 hookClosePopup(popupPower) { 125 if (popupPower.settings.behaviourAppearance == 'once' || popupPower.settings.behaviourAppearance == 'xtimes') { 126 let showCount = 0; 127 let cookie = popupPower.getCookie(); 128 129 if (cookie && cookie.showCount) { 130 showCount = cookie.showCount+1; 131 }else { 132 showCount = 1; 133 } 134 135 popupPower.saveCookie({ 136 behaviourAppearance: popupPower.settings.behaviourAppearance, 137 showCount: showCount 138 }); 139 }else if(popupPower.settings.behaviourAppearance == 'always') { 140 // remove cookie, if always 141 popupPower.deleteCookie(); 142 } 143 144 popupPower.popup.remove(); 145 } 146} 147 148export default new PopupPowerPro();
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.