2024-05-07 12:31:42 +08:00

1 line
9.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(()=>{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"]()})();