(()=>{var __webpack_modules__={"./src/js/utils.js":()=>{eval("const Utils = {\r\n /**\r\n * 是否移动设备\r\n */\r\n isMobile() {\r\n if (\r\n navigator.userAgent.match(/Android/i) ||\r\n navigator.userAgent.match(/webOS/i) ||\r\n navigator.userAgent.match(/iPhone/i) ||\r\n navigator.userAgent.match(/iPad/i) ||\r\n navigator.userAgent.match(/iPod/i) ||\r\n navigator.userAgent.match(/BlackBerry/i) ||\r\n navigator.userAgent.match(/Windows Phone/i)\r\n )\r\n return true\r\n return false\r\n },\r\n /**\r\n * 有缓存的方式加载js\r\n */\r\n cachedScript(url, callback) {\r\n return $.ajax(jQuery.extend({\r\n url: url,\r\n type: 'get',\r\n dataType: 'script',\r\n cache: true,\r\n success: callback\r\n }, $.isPlainObject(url) && url))\r\n },\r\n /**\r\n * 时间格式化\r\n * @param {*} time\r\n */\r\n formatDate(date, fmt = 'yyyy-MM-dd') {\r\n date = new Date(date)\r\n if (/(y+)/.test(fmt)) {\r\n fmt = fmt.replace(\r\n RegExp.$1,\r\n (date.getFullYear() + '').substr(4 - RegExp.$1.length)\r\n )\r\n }\r\n let o = {\r\n 'M+': date.getMonth() + 1,\r\n 'd+': date.getDate(),\r\n 'h+': date.getHours(),\r\n 'm+': date.getMinutes(),\r\n 's+': date.getSeconds(),\r\n }\r\n for (let k in o) {\r\n if (new RegExp(`(${k})`).test(fmt)) {\r\n let str = o[k] + ''\r\n fmt = fmt.replace(\r\n RegExp.$1,\r\n RegExp.$1.length === 1 ? str : str.padStart(2, '0')\r\n )\r\n }\r\n }\r\n return fmt\r\n },\r\n /* 获取URL中带的链接参数\r\n * @param search 链接后缀\r\n * @return {{}} 对象\r\n */\r\n getUrlParams() {\r\n var search = location.search\r\n\r\n // 判断是否为字符串类型\r\n if (typeof search !== 'string') {\r\n search = search.toString()\r\n }\r\n\r\n var paramsSplit = search.replace(/^[^\\?]*\\?/i, '').split(/&/)\r\n var params = {}\r\n\r\n // 数据为空\r\n if (paramsSplit.length < 1) {\r\n return params\r\n }\r\n\r\n if (Array.isArray(paramsSplit)) {\r\n paramsSplit.forEach(function (item) {\r\n // 数据为空, 退出方法\r\n if (!item) {\r\n return false\r\n }\r\n var itemSplit = item.split(/=/)\r\n\r\n // 判断字符串中是否有多个=\r\n if (itemSplit.length >= 2) {\r\n // 是\r\n var key = itemSplit.splice(0, 1)\r\n params[key] = itemSplit.join('=')\r\n }\r\n })\r\n }\r\n return params\r\n },\r\n /* 随机颜色 */\r\n randomColor(factor) {\r\n const colors = ['#F8D800', '#0396FF', '#EA5455', '#7367F0', '#32CCBC', '#F6416C', '#28C76F', '#9F44D3', '#F55555', '#736EFE', '#E96D71', '#DE4313', '#D939CD', '#4C83FF', '#F072B6', '#C346C2', '#5961F9', '#FD6585', '#465EFB', '#FFC600', '#FA742B', '#5151E5', '#BB4E75', '#FF52E5', '#49C628', '#00EAFF', '#F067B4', '#F067B4', '#ff9a9e', '#00f2fe', '#4facfe', '#f093fb', '#6fa3ef', '#bc99c4', '#46c47c', '#f9bb3c', '#e8583d', '#f68e5f']\r\n return colors[factor % colors.length]\r\n },\r\n /* 请求封装 */\r\n request({\r\n url = '',\r\n method = 'GET',\r\n data,\r\n headers = {},\r\n timeout = 10000,\r\n returnRaw = false,\r\n contentType,\r\n resultType = 'json'\r\n }) {\r\n return new Promise((resolve, reject) => {\r\n method = method.toUpperCase()\r\n $.ajax({\r\n url,\r\n type: method,\r\n headers: {\r\n 'API-Authorization': DreamConfig.access_key || 'dream',\r\n ...headers,\r\n },\r\n async: true,\r\n dataType: resultType,\r\n contentType,\r\n timeout,\r\n data,\r\n success(res) {\r\n if (returnRaw) {\r\n resolve(res)\r\n } else {\r\n if (res.status === 200) {\r\n resolve(res.data || '')\r\n } else {\r\n reject(res)\r\n }\r\n }\r\n },\r\n error(err) {\r\n const errMsg = err\r\n ? err.responseJSON\r\n ? err.responseJSON.title\r\n : '请求失败'\r\n : '请求失败'\r\n Qmsg.error(errMsg)\r\n reject(errMsg)\r\n },\r\n })\r\n })\r\n },\r\n /**\r\n * 初始化喜欢按钮\r\n * @param buttonSelect 喜欢按钮的选择器\r\n * @param type 喜欢的类型\r\n */\r\n initLikeButton(buttonSelect, type) {\r\n const name = encrypt('agree-' + type)\r\n let agrees = localStorage.getItem(name)\r\n agrees = agrees ? JSON.parse(decrypt(agrees)) : []\r\n $(buttonSelect).each(function () {\r\n let $this = $(this)\r\n let id = $this.attr('data-id')\r\n // 已经喜欢过了\r\n agrees.includes(id) && $this.removeClass('like')\r\n })\r\n },\r\n /**\r\n * 初始化喜欢按钮点击事件\r\n */\r\n initLikeEvent(buttonSelect, type, likeNumFunc) {\r\n let name = encrypt('agree-' + type)\r\n $('body').on('click', buttonSelect, function (e) {\r\n e.stopPropagation()\r\n let $this = $(this)\r\n let id = $this.attr('data-id')\r\n Utils.request({\r\n url: '/apis/api.halo.run/v1alpha1/trackers/upvote',\r\n method: 'POST',\r\n contentType: 'application/json;charset=UTF-8',\r\n returnRaw: true,\r\n resultType: 'text',\r\n data: JSON.stringify({\r\n group: type === 'moments' ? 'moment.halo.run' : 'content.halo.run',\r\n plural: type,\r\n name: id\r\n })\r\n })\r\n .then((_res) => {\r\n let agrees = localStorage.getItem(name)\r\n agrees = agrees ? JSON.parse(decrypt(agrees)) : []\r\n let likes = +($this.attr('data-likes') || 0) + 1\r\n agrees.push(id)\r\n $this.removeClass('like')\r\n const val = encrypt(JSON.stringify(agrees))\r\n localStorage.setItem(name, val)\r\n // $this.off('click');\r\n likeNumFunc($this).html(likes)\r\n Qmsg.success('点赞成功')\r\n })\r\n })\r\n },\r\n // /* 百度自动推送 */\r\n // baiduPush() {\r\n // let bp = document.createElement('script')\r\n // let curProtocol = window.location.protocol.split(':')[0]\r\n // if (curProtocol === 'https') {\r\n // bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'\r\n // } else {\r\n // bp.src = 'http://push.zhanzhang.baidu.com/push.js'\r\n // }\r\n // $(`script[src=\"${bp.src}\"]`).remove()\r\n // let s = document.getElementsByTagName('script')[0]\r\n // s.parentNode.insertBefore(bp, s)\r\n // },\r\n // toutiaoPush() {\r\n // let el = document.createElement('script')\r\n // el.src = 'https://lf1-cdn-tos.bytegoofy.com/goofy/ttzz/push.js?0fbcfbb1ed642c21419d5be02d56ade7d6ee5372ca221d12ba35df110760b2a830632485602430134f60bc55ca391050b680e2741bf7233a8f1da9902314a3fa'\r\n // el.id = 'ttzz'\r\n // $(`script[src=\"${el.src}\"]`).remove()\r\n // let s = document.getElementsByTagName('script')[0]\r\n // s.parentNode.insertBefore(el, s)\r\n // },\r\n /* sleep */\r\n sleep(ms = 250) {\r\n return new Promise((resolve) => setTimeout(resolve, ms))\r\n },\r\n /* 折叠代码块或者日志块 */\r\n foldBlock($container) {\r\n const oldHeight = $container.height()\r\n if ($container.is('.fold')) {\r\n $container.removeClass('fold').addClass('unfold')\r\n } else {\r\n const oldScrollTop = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset\r\n $container.addClass('fold').removeClass('unfold')\r\n // 跳转位置,保证折叠后没有过大的位置偏移\r\n $('body,html').scrollTop(oldScrollTop - oldHeight + $container.height())\r\n }\r\n },\r\n /**\r\n * 删除元素的 class,可根据前缀来删除\r\n * @param {*} el 需要删除的 dom 元素\r\n * @param {*} prefix 需要删除的 class,可以仅为前缀\r\n */\r\n removeClassByPrefix(el, prefix) {\r\n const classes = el.className.split(' ').filter(function (c) {\r\n return c.lastIndexOf(prefix, 0) !== 0\r\n })\r\n\r\n el.className = classes.join(' ').trim()\r\n },\r\n\r\n /**\r\n * 滚动到指定控件\r\n * @param element 需要被跳转到的控件\r\n * @param time 跳转时间\r\n * @param headingsOffset 控件距离页面顶部的距离\r\n * @param callback 跳转完成后执行的函数\r\n */\r\n animateScroll(element, time, headingsOffset, callback) {\r\n let rect = element.getBoundingClientRect()\r\n let currentY = window.scrollY\r\n let targetY = currentY + rect.top - headingsOffset\r\n let speed = (targetY - currentY) / time\r\n let offset = currentY > targetY ? -1 : 1\r\n let requestId\r\n function step() {\r\n currentY += speed\r\n if (currentY * offset < targetY * offset) {\r\n window.scrollTo(0, currentY)\r\n requestId = window.requestAnimationFrame(step)\r\n } else {\r\n window.scrollTo(0, targetY)\r\n window.cancelAnimationFrame(requestId)\r\n callback && callback()\r\n }\r\n }\r\n requestId = window.requestAnimationFrame(step)\r\n },\r\n}\r\n\r\nwindow.Utils = Utils\r\n\n\n//# sourceURL=webpack://halo-theme-dream2.0-plus/./src/js/utils.js?")}},__webpack_exports__={};__webpack_modules__["./src/js/utils.js"]()})();