{"version":3,"sources":["product-list-compare.js"],"names":["throttle","func","wait","mustRun","timeout","startTime","Date","args","arguments","curTime","undefined","window","requestTimeout","clearRequestTimeout","clearTimeout","apply","this","setTimeout","document","html","documentElement","ww","innerWidth","wh","innerHeight","getWinSet","addEventListener","isMobile","deviceDetect","test","navigator","userAgent","classList","add","remove","match","on","querySelectorAll","forEach","item","blur","compareMenu","querySelector","compareClassOpen","compareClassCollapse","compareClassOpenHtml","compareStorageKey","open","swiper","compareMenuClose","docEnableScroll","localStorage","setItem","compareMenuInit","compareMenuCloseEl","compareMenuToggleEl","compareStorage","getItem","el","docDisableScroll","update","scrollBreakpoint","matchMedia","scrollBreakpointChecker","matches","addListener","compareMenuSwiperBuild","swiperTarget","swiperEl","parentElement","swiperNextEl","swiperPrevEl","compareMenuBreakpoint","compareMenuBreakpointChecker","Swiper","spaceBetween","slidesPerView","slidesPerGroup","autoHeight","lazy","preloadImages","navigation","nextEl","prevEl","breakpoints","1200","init","sw","destroy","footer","compareClassCollapseHtml","compareMenuScroll","getBoundingClientRect","top","compareClear"],"mappings":"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","file":"../product-list-compare.min.js","sourcesContent":["/* ---------------------------------------- [START] 簡單的節流函數 */\r\n// https://www.cnblogs.com/coco1s/p/5499469.html\r\nfunction throttle(func, wait, mustRun) {\r\n\tvar timeout;\r\n\tvar startTime = new Date();\r\n\r\n\treturn function () {\r\n\t\tvar context = this;\r\n\t\tvar args = arguments;\r\n\t\tvar curTime = new Date();\r\n\r\n\t\tif (timeout !== undefined) {\r\n\t\t\tif (window.requestTimeout !== undefined) clearRequestTimeout(timeout);\r\n\t\t\telse clearTimeout(timeout);\r\n\t\t}\r\n\t\t// 如果達到了規定的觸發時間間隔,觸發 handler\r\n\t\tif (curTime - startTime >= mustRun) {\r\n\t\t\tfunc.apply(context, args);\r\n\t\t\tstartTime = curTime;\r\n\t\t\t// 沒達到觸發間隔,重新設定定時器\r\n\t\t} else {\r\n\t\t\tif (window.requestTimeout !== undefined) timeout = requestTimeout(func, wait);\r\n\t\t\telse timeout = setTimeout(func, wait);\r\n\t\t}\r\n\t};\r\n}\r\n/* ---------------------------------------- [END] 簡單的節流函數 */\r\n\r\n(function(window, document) {\r\n\t/* ----------------------------------- [START] Windows Setting */\r\n\tconst html = document.documentElement;\r\n\t// const body = document.body || document.querySelector('body');\r\n\tlet ww = window.innerWidth;\r\n\tlet wh = window.innerHeight;\r\n\t// let ws = 0;\r\n\t// function getScrollTop(target = window) {\r\n\t// \treturn (target.pageYOffset || html.scrollTop) - (html.clientTop || 0);\r\n\t// }\r\n\tfunction getWinSet() {\r\n\t\tww = window.innerWidth;\r\n\t\twh = window.innerHeight;\r\n\t\t// ws = getScrollTop();\r\n\t}\r\n\twindow.addEventListener('load', getWinSet);\r\n\twindow.addEventListener('resize', throttle(getWinSet, 50, 100));\r\n\t/* ----------------------------------- [END] Windows Setting */\r\n\r\n\t/* ----------------------------------- [START] 取得裝置判斷 */\r\n\t// 取得裝置判斷\r\n\tvar isMobile = false;\r\n\tvar isTablet = false;\r\n\tvar isPhone = false;\r\n\tvar deviceDetect = function () {\r\n\t\t// IsPhone\r\n\t\tisPhone = ww <= 640;\r\n\r\n\t\t// IsMobile\r\n\t\t// 防止測試時一直用開發者工具Resize出現Bug\r\n\t\tisMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n\t\tif (isMobile) html.classList.add('is-mobile');\r\n\t\telse html.classList.remove('is-mobile');\r\n\r\n\t\t// IsTablet\r\n\t\tif (navigator.userAgent.match(/Android/i)) {\r\n\t\t\tif (!navigator.userAgent.match(/Mobile/i)) {\r\n\t\t\t\tisTablet = true;\r\n\t\t\t}\r\n\t\t} else if (navigator.userAgent.match(/BlackBerry|iPad|Opera Mini|IEMobile/i)) {\r\n\t\t\tisTablet = true;\r\n\t\t}\r\n\t};\r\n\tdeviceDetect();\r\n\ton(window, 'resize', throttle(deviceDetect, 50, 100));\r\n\t/* ----------------------------------- [END] 取得裝置判斷 */\r\n\r\n\t/* ---------------------------------------- [START] Click Blur */\r\n\tconst checkboxs = document.querySelectorAll('.js-compare-checkbox');\r\n\tcheckboxs.forEach((item) => {\r\n\t\titem.addEventListener('click', function() {\r\n\t\t\titem.blur();\r\n\t\t});\r\n\t});\r\n\t/* ---------------------------------------- [END] Click Blur */\r\n\r\n\t/* ---------------------------------------- [START] 選單 - 展開收合 */\r\n\tconst compareMenu = document.querySelector('#compare-menu');\r\n\tconst compareClassOpen = 'is-open';\r\n\tconst compareClassCollapse = 'is-collapse';\r\n\tconst compareClassOpenHtml = 'compare-open';\r\n\r\n\tconst compareStorageKey = 'compareMenuOpen'; // 記錄使用者紀錄\r\n\r\n\tlet open = window.innerWidth >= 1024; // (預設)狀態\r\n\tlet swiper = null;\r\n\r\n\tfunction compareMenuOpen() {\r\n\t\t// 關閉Scroll\r\n\t\tif (isMobile && ww < 1024) {\r\n\t\t\twindow.docDisableScroll && docDisableScroll();\r\n\t\t}\r\n\r\n\t\topen = true;\r\n\t\tcompareMenu.classList.add(compareClassOpen);\r\n\t\thtml.classList.add(compareClassOpenHtml);\r\n\r\n\t\tif (swiper) {\r\n\t\t\tswiper.update();\r\n\t\t}\r\n\r\n\t\tlocalStorage.setItem(compareStorageKey, 'true');\r\n\t}\r\n\r\n\tfunction compareMenuClose() {\r\n\t\tif (isMobile && ww < 1024) {\r\n\t\t\twindow.docEnableScroll && docEnableScroll();\r\n\t\t}\r\n\r\n\t\topen = false;\r\n\t\tcompareMenu.classList.remove(compareClassOpen);\r\n\t\thtml.classList.remove(compareClassOpenHtml);\r\n\r\n\t\tlocalStorage.setItem(compareStorageKey, 'false');\r\n\t}\r\n\r\n\tfunction compareMenuInit() {\r\n\t\tconst compareMenuCloseEl = compareMenu.querySelectorAll('[data-close]');\r\n\t\tconst compareMenuToggleEl = compareMenu.querySelectorAll('[data-toggle-menu]');\r\n\r\n\t\t// 檢測是否曾經有操作過比較介面\r\n\t\tconst compareStorage = localStorage.getItem(compareStorageKey);\r\n\t\tif ((compareStorage === null && open) || compareStorage === 'true') {\r\n\t\t\tcompareMenu.classList.add('is-open');\r\n\t\t}\r\n\r\n\t\tif (compareStorage !== null) {\r\n\t\t\topen = compareStorage === 'true';\r\n\t\t}\r\n\r\n\t\tcompareMenuToggleEl.forEach((el) => {\r\n\t\t\tel.addEventListener('click', function() {\r\n\t\t\t\tif (!open) {\r\n\t\t\t\t\tcompareMenuOpen();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tcompareMenuClose();\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t});\r\n\t\r\n\t\tcompareMenuCloseEl.forEach((el) => {\r\n\t\t\tel.addEventListener('click', compareMenuClose);\r\n\t\t});\r\n\t}\r\n\t/* ---------------------------------------- [END] 選單 - 展開收合 */\r\n\r\n\t/* ---------------------------------------- [START] Scroll Enabled */\r\n\t// 因為開關會鎖 ScrollBar ,如果使用者 Resize 1024+ 就會造成無法 Scroll 問題\r\n\tconst scrollBreakpoint = window.matchMedia('(min-width: 1024px)');\r\n\tconst scrollBreakpointChecker = function() {\r\n\t\tif (scrollBreakpoint.matches) {\r\n\t\t\t// Large\r\n\t\t\twindow.docEnableScroll && docEnableScroll();\r\n\t\t} else if (open) {\r\n\t\t\twindow.docDisableScroll && docDisableScroll();\r\n\t\t}\r\n\t}\r\n\twindow.addEventListener('load', function() {\r\n\t\tscrollBreakpointChecker();\r\n\t\tscrollBreakpoint.addListener(scrollBreakpointChecker);\r\n\t});\r\n\t/* ---------------------------------------- [END] Scroll Enabled */\r\n\r\n\t/* ---------------------------------------- [START] 選單 */\r\n\tconst pdCompareCarousel = '#pd-compare-carousel'; // .swiper-container id\r\n\r\n\tfunction compareMenuSwiperBuild() {\r\n\t\tconst swiperTarget = pdCompareCarousel;\r\n\t\tconst swiperEl = document.querySelector(swiperTarget).parentElement;\r\n\t\tconst swiperNextEl = swiperEl.querySelector('.swiper-button-next');\r\n\t\tconst swiperPrevEl = swiperEl.querySelector('.swiper-button-prev');\r\n\r\n\t\tconst buildSwiper = function () {\r\n\t\t\tswiper = new Swiper(swiperTarget, {\r\n\t\t\t\tspaceBetween: 20,\r\n\t\t\t\tslidesPerView: 2,\r\n\t\t\t\tslidesPerGroup: 2,\r\n\t\t\t\tautoHeight: true,\r\n\t\t\t\tlazy: true,\r\n\t\t\t\tpreloadImages: false,\r\n\t\t\t\tnavigation: {\r\n\t\t\t\t\tnextEl: swiperNextEl,\r\n\t\t\t\t\tprevEl: swiperPrevEl,\r\n\t\t\t\t},\r\n\t\t\t\tbreakpoints: {\r\n\t\t\t\t\t1200: {\r\n\t\t\t\t\t\tslidesPerView: 3,\r\n\t\t\t\t\t\tslidesPerGroup: 3,\r\n\t\t\t\t\t}\r\n\t\t\t\t},\r\n\t\t\t\ton: {\r\n\t\t\t\t\tinit (sw) {\r\n\t\t\t\t\t\t// 一定要先update,不然剛進入頁面沒辦法移除\r\n\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\tsw.update();\r\n\t\t\t\t\t\t}, 100);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tconst compareMenuBreakpoint = window.matchMedia('(min-width: 1024px)');\r\n\t\tconst compareMenuBreakpointChecker = function() {\r\n\t\t\tif (compareMenuBreakpoint.matches) {\r\n\t\t\t\t// Large\r\n\t\t\t\tbuildSwiper();\r\n\t\t\t} else {\r\n\t\t\t\t// Small + Medium\r\n\t\t\t\tif (swiper !== undefined && swiper !== null) {\r\n\t\t\t\t\tswiper.destroy(true, true);\r\n\t\t\t\t\tswiper = null;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Start\r\n\t\tcompareMenuBreakpoint.addListener(compareMenuBreakpointChecker);\r\n\t\tcompareMenuBreakpointChecker();\r\n\t}\r\n\t/* ---------------------------------------- [END] 選單 */\r\n\r\n\t/* ---------------------------------------- [START] Scroll */\r\n\tconst footer = document.querySelector('#footer');\r\n\tconst compareClassCollapseHtml = 'compare-collapse';\r\n\r\n\tfunction compareMenuScroll() {\r\n\t\tif (wh > footer.getBoundingClientRect().top) {\r\n\t\t\t// 滑動到 Footer 位置 => 固定\r\n\t\t\tcompareMenu.classList.add(compareClassCollapse);\r\n\t\t\thtml.classList.add(compareClassCollapseHtml);\r\n\t\t} else {\r\n\t\t\tcompareMenu.classList.remove(compareClassCollapse);\r\n\t\t\thtml.classList.remove(compareClassCollapseHtml);\r\n\t\t}\r\n\t}\r\n\t/* ---------------------------------------- [END] Scroll */\r\n\r\n\t/* ---------------------------------------- [START] 額外項目 */\r\n\t// 避免手機板鎖住\r\n\tconst compareClear = document.querySelector('#compare-menu-clear'); // 全部清除\r\n\tif (compareClear) {\r\n\t\tcompareClear.addEventListener('click', function() {\r\n\t\t\tif (isMobile && ww < 1024) {\r\n\t\t\t\twindow.docEnableScroll && docEnableScroll();\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\t/* ---------------------------------------- [END] 額外項目 */\r\n\r\n\twindow.addEventListener('load', function() {\r\n\t\tif (compareMenu) {\r\n\t\t\t// Window setting\r\n\t\t\tgetWinSet();\r\n\t\t\twindow.addEventListener('resize', getWinSet);\r\n\r\n\t\t\t// Init\r\n\t\t\tcompareMenuInit();\r\n\t\t\tcompareMenuSwiperBuild();\r\n\r\n\t\t\t// Scroll Handler\r\n\t\t\tcompareMenuScroll();\r\n\t\t\twindow.addEventListener('scroll', compareMenuScroll);\r\n\r\n\t\t\t// 數量計算\r\n\t\t\t//- ※為了要讓後端可以更動,將JS移動到頁面 inline script 中\r\n\t\t\t// compareMenuCountInit();\r\n\t\t}\r\n\t});\r\n\r\n})(window, document);\r\n\r\n\r\n\r\n// /* ---------------------------------------- [START] 讀取+更換數量 */\r\n// //- ※為了要讓後端可以更動,將JS移動到頁面 inline script 中\r\n// (function(window, document) {\r\n// \tconst html = document.documentElement; // \r\n// \tconst checkboxs = document.querySelectorAll('.js-compare-checkbox'); // 比較checkbox\r\n// \tconst compareMenu = document.querySelector('#compare-menu'); // 比較選單\r\n// \tlet compareArr = []; // 比較陣列\r\n// \tlet compareList = null; // 紀錄