{"version":3,"sources":["blog.js"],"names":["isInViewport","el","rect","getBoundingClientRect","offsetHeight","bottom","right","top","window","innerHeight","document","documentElement","clientHeight","left","innerWidth","clientWidth","throttle","func","wait","mustRun","timeout","startTime","Date","args","arguments","curTime","undefined","requestTimeout","clearRequestTimeout","clearTimeout","apply","this","setTimeout","isMobile","test","navigator","userAgent","pageScrollCheckList","pdRecommendCarousel","pdRecommendBuild","swiperTarget","swiperEl","querySelector","parentElement","swiperPageEl","swiperNextEl","swiperPrevEl","Swiper","spaceBetween","slidesPerView","slidesPerGroup","lazy","preloadImages","pagination","type","navigation","nextEl","prevEl","breakpoints","1024","1200","on","init","pdListColorRebuild","addEventListener","selector","buildFunction","push","build","fun","pageScrollAdd","anchors","querySelectorAll","forEach","call","anchor","e","preventDefault","target","currentTarget","articleTitle","innerText","title","encodeURI","hashTags","getAttribute","shareUrl","href","replace","location","windowName","windowSettings","open","opener","shareButton","hideEl","dataset","share","classList","remove","add","tabIndex","event","url","console","error","ClipboardJS","text","trigger","clearSelection","toast","blur","pageScrollThrottle","pageScrollHandler","length","i","Array","prototype","filter","item"],"mappings":"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","file":"../blog.min.js","sourcesContent":["/* ---------------------------------------- [START] isInViewport */\r\nfunction isInViewport(el) {\r\n\tvar rect = el.getBoundingClientRect();\r\n\r\n\tvar isVisible = el.offsetHeight !== 0;\r\n\r\n\treturn (\r\n\t\tisVisible &&\r\n\t\trect.bottom >= 0 &&\r\n\t\trect.right >= 0 &&\r\n\t\trect.top <= (window.innerHeight || document.documentElement.clientHeight) &&\r\n\t\trect.left <= (window.innerWidth || document.documentElement.clientWidth)\r\n\t);\r\n}\r\n/* ---------------------------------------- [END] isInViewport */\r\n\r\n/* ---------------------------------------- [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\tlet ws = 0;\r\n\tfunction 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\tws = getScrollTop();\r\n\t}\r\n\r\n\t// on(window, 'load', getWinSet);\r\n\t// on(window, 'resize', getWinSet);\r\n\t/* ----------------------------------- [END] Windows Setting */\r\n\r\n\tvar isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n\r\n\t/* ---------------------------------------- [START] 整頁 Scroll 監測 (Before) */\r\n\tvar pageScrollCheckList = []; // 紀錄物件\r\n\r\n\tvar pageScrollAdd = function (selector, buildFunction) {\r\n\t\tvar el = document.querySelector(selector);\r\n\t\tif (el === null) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tpageScrollCheckList.push({\r\n\t\t\tbuild: false,\r\n\t\t\tel: el,\r\n\t\t\tfun: buildFunction,\r\n\t\t});\r\n\t};\r\n\r\n\tvar pageScrollClean = function () {\r\n\t\tpageScrollCheckList = Array.prototype.filter.call(pageScrollCheckList, function (item) {\r\n\t\t\treturn item.build === false;\r\n\t\t});\r\n\t};\r\n\t/* ---------------------------------------- [END] 整頁 Scroll 監測 (Before) */\r\n\r\n\t/* ---------------------------------------- [START] Product Recommend | 推薦產品 */\r\n\tconst pdRecommendCarousel = '#pd-recommend-carousel'; // .swiper-container id\r\n\r\n\tfunction pdRecommendBuild() {\r\n\t\tconst swiperTarget = pdRecommendCarousel;\r\n\t\tconst swiperEl = document.querySelector(swiperTarget).parentElement;\r\n\t\tconst swiperPageEl = swiperEl.querySelector('.swiper-pagination');\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 swiper = new Swiper(swiperTarget, {\r\n\t\t\tspaceBetween: 20,\r\n\t\t\tslidesPerView: 2,\r\n\t\t\tslidesPerGroup: 2,\r\n\t\t\t// loop: true, // Loop 會有 Checkbox 重複的問題,即使刪掉也沒用\r\n\t\t\tlazy: true,\r\n\t\t\tpreloadImages: false,\r\n\t\t\t// [START] Global Pagination + Button (Prev, Next)\r\n\t\t\tpagination: {\r\n\t\t\t\tel: swiperPageEl,\r\n\t\t\t\ttype: 'fraction',\r\n\t\t\t},\r\n\t\t\tnavigation: {\r\n\t\t\t\tnextEl: swiperNextEl,\r\n\t\t\t\tprevEl: swiperPrevEl,\r\n\t\t\t},\r\n\t\t\t// [END] Global Pagination + Button (Prev, Next)\r\n\t\t\tbreakpoints: {\r\n\t\t\t\t1024: {\r\n\t\t\t\t\tslidesPerView: 3,\r\n\t\t\t\t\tslidesPerGroup: 3,\r\n\t\t\t\t},\r\n\t\t\t\t1200: {\r\n\t\t\t\t\tslidesPerView: 4,\r\n\t\t\t\t\tslidesPerGroup: 4,\r\n\t\t\t\t},\r\n\t\t\t},\r\n\t\t\ton: {\r\n\t\t\t\tinit () {\r\n\t\t\t\t\t// 重新設定顏色位置 (原本的Function 在 all)\r\n\t\t\t\t\twindow.pdListColorRebuild && pdListColorRebuild();\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\twindow.addEventListener('load', function () {\r\n\t\tif (document.querySelector(pdRecommendCarousel) !== null) {\r\n\t\t\tpageScrollAdd(pdRecommendCarousel, pdRecommendBuild);\r\n\t\t}\r\n\t});\r\n\t/* ---------------------------------------- [END] Product Recommend | 推薦產品 */\r\n\r\n\t/* ---------------------------------------- [START] Share to SNS */\r\n\tvar anchors = document.querySelectorAll('.sharer');\r\n\t[].forEach.call(anchors, function (anchor) {\r\n\t\tanchor.addEventListener(\r\n\t\t\t'click',\r\n\t\t\tfunction (e) {\r\n\t\t\t\te.preventDefault();\r\n\r\n\t\t\t\tvar target = e.currentTarget;\r\n\r\n\t\t\t\t// Get title\r\n\t\t\t\tvar articleTitle = document.querySelector('#article-title')\r\n\t\t\t\t\t? document.querySelector('#article-title').innerText\r\n\t\t\t\t\t: document.title;\r\n\r\n\t\t\t\t// change title to encode\r\n\t\t\t\tarticleTitle = encodeURI(articleTitle);\r\n\r\n\t\t\t\tvar hashTags = target.getAttribute('data-hashtags') || ''\r\n\r\n\t\t\t\t// grab the base sharing URL\r\n\t\t\t\tvar url = target.href;\r\n\r\n\t\t\t\t// Change \"{articleUrl}\" to page url\r\n\t\t\t\tvar shareUrl = url\r\n\t\t\t\t\t.replace(/CarticleUrlC/gm, window.location.href)\r\n\t\t\t\t\t.replace(/CarticleTitleC/gm, articleTitle)\r\n\t\t\t\t\t.replace(/ChashtagsC/gm, hashTags);\r\n\r\n\t\t\t\t// grab the name we want to give the window (parameter 2 on window.open)\r\n\t\t\t\t// MDN: 新視窗的名稱。該字元串可以用來作為超連結 或表單
元素的目標屬性值。字元串中不能含有空白字元。注意:strWindowName 並不是新視窗的標題。\r\n\t\t\t\tvar windowName = target.getAttribute('data-windowName') || 'Share';\r\n\t\t\t\twindowName.replace(/\\s/g, ''); // 移除空白\r\n\r\n\t\t\t\t// Grab parameter 3 for window.oprn (window settings)\r\n\t\t\t\tvar windowSettings =\r\n\t\t\t\t\ttarget.getAttribute('data-settings') ||\r\n\t\t\t\t\t'menubar=no,toolbar=no,resizable=no,scrollbars=yes,height=700,width=550';\r\n\r\n\t\t\t\t// call window.open\r\n\t\t\t\tvar otherWindow = window.open(shareUrl, windowName, windowSettings);\r\n\t\t\t\totherWindow.opener = null;\r\n\t\t\t\t// otherWindow.location = shareUrl;\r\n\t\t\t},\r\n\t\t\tfalse\r\n\t\t);\r\n\t});\r\n\t/* ---------------------------------------- [END] Share to SNS */\r\n\r\n\t/* ---------------------------------------- [START] Navigator Share */\r\n\t/* 條件:一定要是HTTPS環境下才可以使用\r\n\t * Ref: https://w3c.github.io/web-share/\r\n\t */\r\n\tvar shareButton = document.querySelectorAll('.js-navigator-share');\r\n\t// var isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\r\n\t[].forEach.call(shareButton, function (el) {\r\n\t\t\t// 要隱藏的項目(相同功能物件)\r\n\t\tconst hideEl = (el.dataset && el.dataset['hideEl']) ? document.querySelector(el.dataset['hideEl']) : null; // 要隱藏的項目\r\n\t\t\r\n\t\tif (!isMobile || !navigator.share) {\r\n\t\t\t// 將非 Mobile 裝置、不支援 navigator share 擋下\r\n\t\t\tel.classList.add('hide'); // Hide Class\r\n\t\t\tel.tabIndex = -1;\r\n\r\n\t\t\t// 要隱藏的項目(相同功能物件)\r\n\t\t\thideEl && hideEl.classList.remove('hide');\r\n\t\t} else {\r\n\t\t\tel.classList.remove('hide');\r\n\t\t\t\r\n\t\t\t// 要隱藏的項目(相同功能物件)\r\n\t\t\thideEl && hideEl.classList.add('hide');\r\n\t\t}\r\n\r\n\t\tel.addEventListener('click', function (event) {\r\n\t\t\tif (navigator.share) {\r\n\t\t\t\tnavigator\r\n\t\t\t\t\t.share({\r\n\t\t\t\t\t\ttitle: document.title,\r\n\t\t\t\t\t\turl: location.href,\r\n\t\t\t\t\t})\r\n\t\t\t\t\t.catch(console.error);\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n\t/* ---------------------------------------- [END] Navigator Share */\r\n\r\n\t/* ---------------------------------------- [START] Copy link */\r\n\t/* clipboard.js — Copy to clipboard without Flash\r\n\t * https://clipboardjs.com/\r\n\t */\r\n\r\n\t// 訊息由Toastr取代\r\n\t// var successMsg;\r\n\t// var clipTimer = null;\r\n\r\n\t/* 複製成功訊息 */\r\n\t// function addCopySuccess(text) {\r\n\t// \tif (successMsg === undefined) {\r\n\t// \t\tsuccessMsg = document.createElement('div');\r\n\t// \t\tsuccessMsg.className = 'copysuctip';\r\n\t// \t\t// successMsg.innerText = '複製成功';\r\n\t// \t\tsuccessMsg.setAttribute('aria-live', 'assertive');\r\n\t// \t}\r\n\t// \tsuccessMsg.innerText = text || '複製成功';\r\n\t// \tdocument.body.appendChild(successMsg);\r\n\r\n\t// \t// Remove\r\n\t// \tclearTimeout(clipTimer);\r\n\t// \tclipTimer = null;\r\n\t// \tclipTimer = setTimeout(function () {\r\n\t// \t\tsuccessMsg.remove();\r\n\t// \t\tclipTimer = null;\r\n\t// \t}, 3000);\r\n\t// }\r\n\r\n\tfunction buildClipboardJS() {\r\n\t\tif (window.ClipboardJS !== undefined) {\r\n\t\t\tvar clipboard = new ClipboardJS('.js-copy-link', {\r\n\t\t\t\ttext: function (trigger) {\r\n\t\t\t\t\tvar text = window.location.href;\r\n\t\t\t\t\treturn text;\r\n\t\t\t\t},\r\n\t\t\t});\r\n\r\n\t\t\tclipboard.on('success', function (e) {\r\n\t\t\t\te.clearSelection();\r\n\t\t\t\ttoast('success', e.trigger.getAttribute('data-success'));\r\n\t\t\t\te.trigger.blur();\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\twindow.addEventListener('load', buildClipboardJS);\r\n\t/* ---------------------------------------- [END] Copy link */\r\n\r\n\t/* ---------------------------------------- [START] 整頁 Scroll 監測 (After) */\r\n\tvar pageScrollThrottle = null;\r\n\r\n\tvar pageScrollHandler = function () {\r\n\t\tif (pageScrollCheckList.length === 0) {\r\n\t\t\treturn false;\r\n\t\t} // 因為改成 Page Global 執行,所以不會停止\r\n\r\n\t\tfor (var i = 0; i < pageScrollCheckList.length; i++) {\r\n\t\t\tif (isInViewport(pageScrollCheckList[i].el)) {\r\n\t\t\t\tpageScrollCheckList[i].fun();\r\n\t\t\t\tpageScrollCheckList[i].build = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tpageScrollClean();\r\n\t\t// if (pageScrollCheckList.length === 0) {\r\n\t\t// \toff(window, 'scroll', pageScrollThrottle);\r\n\t\t// }\r\n\t};\r\n\r\n\twindow.addEventListener('load', function () {\r\n\t\tpageScrollThrottle = throttle(pageScrollHandler, 50, 500); // 節流作用\r\n\t\twindow.addEventListener('scroll', pageScrollThrottle);\r\n\t\tpageScrollHandler();\r\n\t});\r\n\t/* ---------------------------------------- [END] 整頁 Scroll 監測 (After) */\r\n})(window, document);\r\n"],"sourceRoot":"../../src/"}