1function initHomeHeroCarousel() { 2 const heroCarouselProgressBar = document.querySelector('.home-hero__carousel-progress-bar'); 3 const heroCarouselControls = document.querySelector('.home-hero__carousel-controls'); 4 const firstSlide = document.querySelector('.home-hero__carousel-item:nth-child(1)'); 5 const firstVideoItem = firstSlide?.querySelector('.home-hero__carousel-item--video'); 6 const heroCarouselItemsVideo = document?.querySelectorAll('.home-hero__carousel-item--video'); 7 8 let heroCarousel; 9 let currentSlideIndex; 10 let timeoutVideoCover = null; 11 let TIMEOUT_TIME = 1000; 12 13 14 // * carousel video çåºæ¬è¨å® 15 const setupCarouselVideoItems = () => { 16 if (heroCarouselItemsVideo.length > 0) { 17 let hasHiddenControls = false; 18 19 heroCarouselItemsVideo.forEach((videoItem) => { 20 const parent = videoItem.parentElement; 21 const sLink = parent?.querySelector('.home-hero__carousel-item--video-dialog'); 22 const isVideoLoaded = videoItem.getAttribute('data-video-loaded'); 23 const isVisible = videoItem.offsetParent !== null; 24 25 // + 妿影çå°æªè¼å ¥ï¼æ«å carouselï¼ä¸¦ä¸ä¸è½ click control (å éå°å¯è¦çå½±ç) 26 if (!isVideoLoaded && isVisible) { 27 heroCarousel.Components.Autoplay.pause(); 28 heroCarouselControls.style.display = 'none'; 29 hasHiddenControls = true; 30 31 // ç¬¬ä¸æ¬¡è¼å ¥æåå¾ 32 document.addEventListener(`s-vid-loaded:${videoItem.id}`, () => { 33 // æ¨è¨è¼å ¥å®æ 34 videoItem.setAttribute('data-video-loaded', 'true'); 35 36 // å¦æå½±çæ¯ç¬¬ä¸å¼µ slideï¼å°±è¦è®ç«å³ææ¾ 37 if (heroCarousel.index === 0) { 38 videoReplay(videoItem, true); 39 } 40 41 // æ¢å¾© control 黿 42 heroCarouselControls.style.display = 'flex'; 43 }); 44 } 45 46 // + é±èçå½±çä¹éè¦ç£è½è¼å ¥äºä»¶ (åæè¢å¹å¯¬åº¦æå¯è½è®çºå¯è¦) 47 if (!isVideoLoaded && !isVisible) { 48 document.addEventListener(`s-vid-loaded:${videoItem.id}`, () => { 49 videoItem.setAttribute('data-video-loaded', 'true'); 50 }); 51 } 52 53 // + ç£è½å½±çç control è®å 54 document.addEventListener(`s-media-control-play-callback:mc-${videoItem.id}`, (e) => { 55 let playState = e.detail.playState; 56 57 // å½±çæ«å -> carrousel æ«å 58 if (playState === 'play') { 59 heroCarousel.Components.Autoplay.pause(); 60 } 61 62 // å½±çææ¾ -> carrousel ææ¾ 63 if (playState === 'pause') { 64 heroCarousel.Components.Autoplay.play(); 65 } 66 }); 67 68 // + ç£è½ s-link ç dialog æéèééï¼ä¸¦åæ¥æ§å¶ å½±ç/carousel ææ¾èæ«å 69 if (sLink) { 70 // ç²å dialog id 71 const dialogId = sLink.getAttribute('dialog'); 72 // ç²å video cover 73 const videoCover = parent?.querySelector('.home-hero__carousel-item--video-cover'); 74 75 // dialog æéæï¼æ«åå½±çè carousel 76 document.addEventListener(`s-dialog-open-callback:${dialogId}`, () => { 77 heroCarousel.Components.Autoplay.pause(); 78 document.dispatchEvent(new CustomEvent(`s-vid-pause:${videoItem.id}`)); 79 80 // videoCover å timeoutVideoCover å卿ï¼å°±æ¸ é¤ timeout 81 // (dialog ééçæåï¼åè®å®ç´æ¥ææ¾) 82 if (videoCover && timeoutVideoCover) { 83 clearTimeout(timeoutVideoCover); 84 timeoutVideoCover = null; 85 } 86 }); 87 88 // dialog ééæï¼ææ¾å½±çè carousel 89 document.addEventListener(`s-dialog-close-callback:${dialogId}`, () => { 90 // ææ¾å½±ç & carousel 91 heroCarousel.Components.Autoplay.play(); 92 document.dispatchEvent(new CustomEvent(`s-vid-play:${videoItem.id}`)); 93 94 // 確ä¿éé dialog å¾ï¼é±è cover 95 if (videoCover) videoCover.classList.add('hide'); 96 }); 97 }; 98 }); 99 } 100 } 101 102 // * 確èªè©² slide æ¯å¦æå¯è¦ç s-video (æ¯æ´åä¸ slide æå¤å video çæ å¢)
103 const isSlideHasVideo = (index) => { 104 const slide = heroCarousel.Components.Elements.slides[index]; 105 const videoItems = slide?.querySelectorAll('.home-hero__carousel-item--video'); 106 if (!videoItems || videoItems.length === 0) return null; 107 if (videoItems.length === 1) return videoItems[0]; 108 return Array.from(videoItems).find(v => v.offsetParent !== null) || null; 109 } 110 111 // * video Replay (éé ææ¾) 112 const videoReplay = (videoItem, isFirstPlay = false) => { 113 const parent = videoItem.parentElement; 114 const sLink = parent?.querySelector('.home-hero__carousel-item--video-dialog'); 115 const videoCover = parent?.querySelector('.home-hero__carousel-item--video-cover'); 116 117 // 妿æ video coverï¼å 顯示å°é¢åææ¾ 118 if(videoCover) { 119 // 妿æ sLink ç話ï¼å è®å®ç¡æ³é»æ 120 if (sLink) sLink.style.pointerEvents = 'none'; 121 122 // å½±ç & carouesel æ«åææ¾ 123 document.dispatchEvent(new CustomEvent(`s-vid-pause:${videoItem.id}`)); 124 heroCarousel.Components.Autoplay.pause(); 125 126 // 顯示å°é¢ 127 videoCover.classList.remove('hide'); 128 129 // timmer for é±èå°é¢ & æ¢å¾© sLink 黿 & ææ¾å½±ç & carouesel 130 timeoutVideoCover = setTimeout(() => { 131 // é±èå°é¢ & æ¢å¾© sLink 黿 132 videoCover.classList.add('hide'); 133 if (sLink) sLink.style.pointerEvents = 'auto'; 134 135 // å½±ç & carouesel ææ¾ 136 document.dispatchEvent(new CustomEvent(`s-vid-replay:${videoItem.id}`)); 137 heroCarousel.Components.Autoplay.play(); 138 }, TIMEOUT_TIME); 139 140 return; 141 } 142 143 // æ²æ coverï¼ç´æ¥éé ææ¾ 144 document.dispatchEvent(new CustomEvent(`s-vid-replay:${videoItem.id}`)); 145 heroCarousel.Components.Autoplay.play(); 146 // æ¢å¾© sLink 黿 (妿æ¯ç¬¬ä¸æ¬¡è¼å ¥ï¼è¦è®å®çå 1s ä¸ç¶ææ s-link çå·è¡é åº bug) 147 if (sLink) { 148 isFirstPlay ? 149 setTimeout(() => sLink.style.pointerEvents = 'auto', 1000) 150 : sLink.style.pointerEvents = 'auto'; 151 } 152 }; 153 154 // * hero carousel 155 const heroCarouselActive = () => { 156 heroCarousel = new Splide('.home-hero__carousel', { 157 type: 'fade', 158 rewind: true, 159 speed: 1500, 160 interval: 6000, 161 drag: true, 162 arrows: false, 163 autoplay: true, 164 resetProgress: false, 165 pauseOnHover: false, // hover ææ¯å¦æ«å autoplay 166 pauseOnFocus: false, // focus ææ¯å¦æ«å autoplay 167 classes: { 168 page: 'splide__pagination__page home-hero__carousel-page', 169 }, 170 }); 171 172 // + ç£è½ slide åæäºä»¶ 173 heroCarousel.on('active', (slide) => { 174 // 檢æ¥ç¶å slide æ¯å¦æå½±çåå ç´ 175 const videoItem = isSlideHasVideo(slide.index); 176 177 // å¦ææ²æå½±çåå ç´ ï¼ç¹¼çº autoplay 178 if (!videoItem) { 179 heroCarousel.Components.Autoplay.play(); 180 } 181 182 // 妿ä¸ä¸å¼µæå½±çåå ç´ ï¼å control "æ«å" 忥èç 183 if (currentSlideIndex !== undefined) { 184 // 檢æ¥ä¸ä¸å¼µ slide æ¯å¦æå½±çåå ç´ 185 const previousVideoItem = isSlideHasVideo(currentSlideIndex); 186 187 // æå½±çç話ï¼è®å®æ«å 188 if (previousVideoItem) { 189 // console.log(previousVideoItem); 190 document.dispatchEvent(new CustomEvent(`s-vid-pause:${previousVideoItem.id}`)); 191 } 192 } 193 194 // 妿æå½±çåå ç´ ï¼è®å½±ç replay 195 if (videoItem) { 196 // åå¾å½±çæ¯å¦å·²è¼å ¥ 197 const isVideoLoaded = videoItem.getAttribute('data-video-loaded'); 198 199 // è¥å·²è¼å ¥ï¼å½±çç´æ¥éé ææ¾ 200 if (isVideoLoaded) { 201 videoReplay(videoItem); 202 } 203 } 204 205 // æ´æ° currentSlideIndex 206 currentSlideIndex = slide.index; 207 }); 208 209 // + ç£è½ autoplay ææ¾ 210 heroCarousel.on('autoplay:play', () => { 211 // 檢æ¥ç¶å slide æ¯å¦æå½±çåå ç´ 212 const videoItem = isSlideHasVideo(heroCarousel.index); 213 214 // 妿æå½±çåå ç´ ï¼å control "ææ¾" 忥èç 215 if (videoItem) { 216 document.dispatchEvent( new CustomEvent(`s-vid-play:${videoItem.id}`)); 217 } 218 }); 219 220 // + ç£è½ autoplay æ«å 221 heroCarousel.on('autoplay:pause', () => { 222 // 檢æ¥ç¶å slide æ¯å¦æå½±çåå ç´ 223 const videoItem = isSlideHasVideo(heroCarousel.index); 224
225 // 妿æå½±çåå ç´ ï¼å control "æ«å" 忥èç 226 if (videoItem) { 227 document.dispatchEvent( new CustomEvent(`s-vid-pause:${videoItem.id}`)); 228 } 229 }); 230 231 // + ç£è½ autoplay é²åº¦äºä»¶ 232 heroCarousel.on('autoplay:playing', (rate) => { 233 heroCarouselProgressBar.style.transform = `translateX(${(rate - 1) * 100}%)`; 234 }); 235 236 heroCarousel.mount(); 237 }; 238 239 // * èç 第ä¸å item æ¯ video çæ å½¢ 240 const handleIfFirstSlideHasVideo = () => { 241 if (firstVideoItem) { 242 const activePage = document.querySelector('.home-hero__carousel-page.is-active'); 243 244 // å æ«åå¾è§¸ç¼ç¶å slide ç click äºä»¶ 245 // è® splide è½æå° data-splide-interval (for data-splide-interval bug) 246 heroCarousel.Components.Autoplay.pause(); 247 if (activePage) activePage.click(); 248 } 249 } 250 251 heroCarouselActive(); 252 setupCarouselVideoItems(); 253 handleIfFirstSlideHasVideo(); 254}
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.