/* 其他函数 */ /** * [getSearchParams description] 获取URL的查询参数 * @return {Object} 查询参数对象 */ function getSearchParams() { return Object.fromEntries(new URLSearchParams(window.location.search)); } /** * [genStarScore description] 生成星级评分 * @param rate {Number} 评分数据,0.5为单位 * @return {String} 星级评分字符串 */ function genStarScore(rate) { return "★★★★★☆☆☆☆☆".slice(5 - rate, 10 - rate); } /** * [copyTextToClipboard description] 将文本复制到剪贴板,来自:https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript * @param text {String} 需要复制的文本 * @return {Null} 无返回 */ function copyTextToClipboard(text) { var textArea = document.createElement("textarea"); // Place in top-left corner of screen regardless of scroll position. textArea.style.position = 'fixed'; textArea.style.top = 0; textArea.style.left = 0; // Ensure it has a small width and height. Setting to 1px / 1em // doesn't work as this gives a negative w/h on some browsers. textArea.style.width = '2em'; textArea.style.height = '2em'; // We don't need padding, reducing the size if it does flash render. textArea.style.padding = 0; // Clean up any borders. textArea.style.border = 'none'; textArea.style.outline = 'none'; textArea.style.boxShadow = 'none'; // Avoid flash of white box if rendered for any reason. textArea.style.background = 'transparent'; textArea.value = text; document.body.appendChild(textArea); textArea.select(); try { var successful = document.execCommand('copy'); var msg = successful ? 'successful' : 'unsuccessful'; console.log('Copying text command was ' + msg); } catch (err) { console.log('Oops, unable to copy'); } document.body.removeChild(textArea); } /** * [getJsDir description] 获取js所在路径 * @param src {String} html中的script代码 * @return {String} js所在路径 */ function getJsDir (src) { var script = null; if (src) { script = [].filter.call(document.scripts, function (v) { return v.src.indexOf(src) !== -1; })[0]; } else { script = document.scripts[document.scripts.length - 1]; } return script ? script.src.substr(0, script.src.lastIndexOf('/')) : script; } /** * [getRequestParams description] url中query解析 * @param paras {Null} 参数可以为空,此时返回请求参数Map本身 * {String} 参数可以为请求key,以便返回querystring中key对应的value * @return {Object/String} 根据参数不同,要返回不同的结果,object或者字符串 */ function getRequestParams(paras) { const url = window.location.search; const paraString = url.substring(1).split("&"); const paraObj = {}; for (var i = 0, len = paraString.length; i < len; i++) { const j = paraString[i]; if (j) { paraObj[j.substring(0, j.indexOf("=")).toLowerCase()] = j.substring(j.indexOf("=") + 1, j.length); } } if (!paras) return paraObj; const returnValue = paraObj[paras.toLowerCase()]; return returnValue ? returnValue.trim() : ""; } /** * [getJsDir description] 获取文本框光标位置 * @param obj {Object} 需要获取光标位置的 input | textarea dom对象 * @return {Number} 返回光标所在索引 */ function getInputIndex(obj) { var result = 0; // 非IE系,支持 obj.selectionStart if (obj.selectionStart !== undefined) { result = obj.selectionStart; // IE } else { try { var rng; // TEXTAREA if (obj.tagName === "textarea") { rng = event.srcElement.createTextRange(); rng.moveToPoint(event.x, event.y); // Text } else { rng = document.selection.createRange(); } rng.moveStart("character", -event.srcElement.value.length); result = rng.text.length; } catch (e) {} } return result; } /** * [setCookie description] 设置 Cookie 值 * @param name {String} Cookie的name属性 * @param value {String} Cookie的value属性 * @param hours {Number} 过期时间,单位为小时 * @return {Null} 无返回 */ function setCookie(name, value, hours) { var d = new Date(), offset = 8, utc = d.getTime() + (d.getTimezoneOffset() * 60000), nd = utc + (3600000 * offset), exp = new Date(nd); exp.setTime(exp.getTime() + hours * 60 * 60 * 1000); document.cookie = name + "=" + decodeURIComponent(value) + ";path=/;expires=" + exp.toGMTString() + ";"; } /** * [getCookie description] 获取 Cookie 值 * @param name {String} Cookie的name属性 * @return {String} Cookie的value值 */ function getCookie(name) { var arr = document.cookie.match(new RegExp("(^| )" + name + "=([^;]*)(;|$)")); if (arr !== null) return encodeURIComponent(arr[2]); return null; } /** * [loadStyle description] 加载 CSS 文件 * @param url {String} css文件所在url * @return {Null} 无返回 */ function loadStyle(url) { try { document.createStyleSheet(url) } catch (e) { var cssLink = document.createElement('link'); cssLink.rel = 'stylesheet'; cssLink.type = 'text/css'; cssLink.href = url; var head = document.getElementsByTagName('head')[0]; head.appendChild(cssLink) } } /** * [loadStyle description] 加载 JS 文件 * @param src {String} js文件所在地址 * @return {Null} 无返回 */ function loadScript(src) { var scriptNode = document.createElement("script"); scriptNode.type = "text/javascript"; scriptNode.src = src; var head = document.getElementsByTagName('head')[0]; head.appendChild(scriptNode); } /** * [getType description] 判断具体类型 * @param any {Object} 需要判断的值 * @return {String} 类型 */ function getType(any) { var typeArray = Object.prototype.toString.call(any).split(" "); return typeArray[1].slice(0, this.length-1); } /** * [getUrlState description] 检查URL链接是否有效 * @param URL {String} 需要检查的URL链接 * @return {Boolean} 检查结果 */ function getUrlState(URL){ var xmlhttp = new ActiveXObject("microsoft.xmlhttp"); xmlhttp.Open("GET",URL, false); try{ xmlhttp.Send(); }catch(e){ }finally{ var result = xmlhttp.responseText; if(result){ if(xmlhttp.Status===200){ return true; }else{ return false; } }else{ return false; } } } /** * [getType description] 获取当前路径 * @return {String} 当前路径 */ function getCurrentPath(){ var currentPageUrl = ""; if (typeof this.href === "undefined") { currentPageUrl = document.location.toString().toLowerCase(); }else { currentPageUrl = this.href.toString().toLowerCase(); } } /** * [debounce description] 函数防抖动 * @param func {Function} 实际要执行的函数 * @param delay {Number} 执行间隔,单位是毫秒(ms) * @param immediate {String} 是否第一次立即执行 * @return {Function} 返回一个“防抖动”函数 */ function debounce(func, delay, immediate) { var timer = null; return function() { const context = this; const args = arguments; if (timer) clearTimeout(timer); if (immediate) { // 根据距离上次触发操作的时间是否到达delay来决定是否要现在执行函数 const doNow = !timer; // 每一次都重新设置timer,就是要保证每一次执行的至少delay秒后才可以执行 timer = setTimeout(function() { timer = null; }, delay); // 立即执行 if (doNow) { func.apply(context, args); } } else { timer = setTimeout(function() { func.apply(context, args); }, delay); } }; } /** * [throttle description] 函数节流 * @param func {Function} 实际要执行的函数 * @param threshhold {Number} 执行间隔,单位是毫秒(ms) * @param immediate {String} 是否第一次立即执行 * @return {Function} 返回一个“节流”函数 */ function throttle(func, threshhold, immediate) { // 记录是否可执行 var isRun = true; // 定时器 var timer; immediate = immediate || true; // 默认间隔为 200ms threshhold || (threshhold = 200); // 返回的函数,每过 threshhold 毫秒就执行一次 fn 函数 return function() { // 保存函数调用时的上下文和参数,传递给 fn const context = this; const args = arguments; // 第一次执行 if (immediate && typeof timer === 'undefined') { func(); } if (!isRun) return; isRun = false; // 保证间隔时间内执行 clearTimeout(timer); timer = setTimeout(function() { func.apply(context, args); isRun = true; }, threshhold); }; } /** * [appendQuery description] 给url添加query参数 * @param url {String} 需要添加的url * @param query {String} 添加的query,一般为'name=value' * @return {String} 返回新url */ function appendQuery(url, query) { if (!query) { return url; } var search; var a = document.createElement("a"); a.href = url; if (a.search) { search = a.search + "&" + query; } else { search = "?" + query; } return a.protocol + "//" + a.host + a.pathname + search + a.hash; } /** * [objToQuery description] 将object转换成query形式 * @param obj {Object} 需要转换的object * @return {String} 返回query形式的字符串 */ function objToQuery(obj) { return Object.keys(obj).map(function(k) { return [k, obj[k]].join('='); }).join('&'); } /** * [cloneDeep description] 深度克隆object * @param obj {Object} 需要克隆的object * @return {Object} 克隆之后的新Object */ function cloneDeep(obj) { return JSON.parse(JSON.stringify(obj)); } /** * [getBrowserName description] 获取当前浏览器的名称 * @return {String} 浏览器名称 */ function getBrowserName() { var browserName = "Other"; var ua = window.navigator.userAgent; var browserRegExp = { Wechat: /micromessenger/, QQBrowser: /qqbrowser/, UC: /ubrowser|ucbrowser|ucweb/, Shoujibaidu: /baiduboxapp|baiduhd|bidubrowser|baidubrowser/, SamsungBrowser: /samsungbrowser/, MiuiBrowser: /miuibrowser/, Sogou : /sogoumobilebrowser|sogousearch/, Explorer2345 : /2345explorer|2345chrome|mb2345browser/, Liebao : /lbbrowser/, Weibo: /__weibo__/, OPPO: /oppobrowser/, toutiao: /newsarticle/, MobileQQ: /mobile.*qq/, Firefox: /firefox/, Maxthon: /maxthon/, Se360: /360se/, Ee360: /360ee/, Safari: /(iphone|ipad).*version.*mobile.*safari/, Chrome: /chrome|crios/, AndroidBrowser: /android.*safari|android.*release.*browser/ }; for (var i in browserRegExp) { if (browserRegExp[i].exec(ua.toLowerCase())) { browserName = i; break; } } return browserName; } /** * [getSystem description] 获取当前操作系统 * @return {String} 操作系统名称+版本 */ function getSystem() { var result = 'Android', ua = navigator.userAgent; if (ua.match(/(Android)\s+([\d.]+)/)) return 'Android_' + ua.match(/(Android)\s+([\d.]+)/)[2]; if (ua.match(/(iPad).*OS\s([\d_]+)/) || ua.match(/(iPhone\sOS)\s([\d_]+)/)) return result = 'iOS_' + (ua.match(/(iPad).*OS\s([\d_]+)/) ? ua.match(/(iPad).*OS\s([\d_]+)/)[2] : ua.match(/(iPhone\sOS)\s([\d_]+)/)[2]); if (ua.match(/Windows Phone/)) return result = 'WP'; return result; } /** * [getDevice description] 获取当前设备类型 * @return {String} 设备类型 */ function getDevice() { var deviceName = 'PC', ua = navigator.userAgent; var iPad = ua.match(/(iPad).*OS\s([\d_]+)/); var iPhone = ua.match(/(iPhone\sOS)\s([\d_]+)/); var Android = ua.match(/(Android)\s+([\d.]+)/); var WP = ua.match(/(Windows Phone)\s+([\d.]+)/); if (iPad) { deviceName = 'iPad'; } if (iPhone) { deviceName = 'iPhone'; } if (Android) { if (!ua.toLowerCase().match(/mobile/)) { deviceName = 'Pad'; } else if (ua.match(/chrome\/([\d.]+)/) && ua.toLowerCase().match(/mobile/)) { deviceName = 'Phone'; } else if (ua.toLowerCase().match(/firefox\/([\d.]+)/) && ua.toLowerCase().match(/mobile/)) { deviceName = 'Phone'; } else { deviceName = 'Phone'; } } if (WP) { deviceName = 'Phone'; } return deviceName; } /** * [getNetType description] 获取当前网络类型 * @return {String} 网络类型 */ function getNetType(){ var netMatch = ua.match(/NetType\/([^\s]*)/i), netType = "WIFI"; if (netMatch) netType = netMatch[1]; return netType; }