1625 lines
50 KiB
JavaScript
1625 lines
50 KiB
JavaScript
function getBaseUrl() {
|
||
var ishttps = 'https:' == document.location.protocol ? true : false;
|
||
var url = window.location.host;
|
||
if (ishttps) {
|
||
url = 'https://' + url;
|
||
} else {
|
||
url = 'http://' + url;
|
||
}
|
||
return url;
|
||
}
|
||
function getWsBaseUrl() {
|
||
var ishttps = 'https:' == document.location.protocol ? true : false;
|
||
var url = window.location.host;
|
||
if (ishttps) {
|
||
url = 'wss://' + url;
|
||
} else {
|
||
url = 'ws://' + url;
|
||
}
|
||
return url;
|
||
}
|
||
//获取域名部分
|
||
function getDomainFromUrl(url) {
|
||
if(!url||url==""){
|
||
url=window.location.href;
|
||
}
|
||
const regex = /^https?:\/\/([^\/]+)/i;
|
||
const match = url.match(regex);
|
||
return match[1];
|
||
}
|
||
//获取协议部分
|
||
function getProtocolFromUrl(url) {
|
||
if(!url||url==""){
|
||
url=window.location.href;
|
||
}
|
||
const regex = /^(https?)/i;
|
||
const match = url.match(regex);
|
||
return match[1];
|
||
}
|
||
//获取图片链接
|
||
function getImageUrl(imgUrl,host){
|
||
var prefix=imgUrl.substr(0,4);
|
||
if(prefix=='http'){
|
||
return imgUrl;
|
||
}else{
|
||
return host+imgUrl;
|
||
}
|
||
}
|
||
function notify(title, options, callback) {
|
||
|
||
// 先检查浏览器是否支持
|
||
if (!window.Notification) {
|
||
console.log("浏览器不支持notify");
|
||
return;
|
||
}
|
||
options.body=replaceHtml(options.body);
|
||
console.log("浏览器notify权限:", Notification.permission);
|
||
// 检查用户曾经是否同意接受通知
|
||
if (Notification.permission === 'granted') {
|
||
var notification = new Notification(title, options); // 显示通知
|
||
if (notification && callback) {
|
||
notification.onclick = function(event) {
|
||
callback(notification, event);
|
||
}
|
||
setTimeout(function () {
|
||
notification.close();
|
||
},3000);
|
||
}
|
||
} else {
|
||
Notification.requestPermission().then( (permission) =>function(){
|
||
console.log("请求浏览器notify权限:", permission);
|
||
if (permission === 'granted') {
|
||
notification = new Notification(title, options); // 显示通知
|
||
if (notification && callback) {
|
||
notification.onclick = function (event) {
|
||
callback(notification, event);
|
||
}
|
||
setTimeout(function () {
|
||
notification.close();
|
||
}, 3000);
|
||
}
|
||
} else if (permission === 'default') {
|
||
console.log('用户关闭授权 可以再次请求授权');
|
||
} else {
|
||
console.log('用户拒绝授权 不能显示通知');
|
||
}
|
||
});
|
||
}
|
||
|
||
}
|
||
var titleTimer=0;
|
||
var titleNum=0;
|
||
var originTitle = document.title;
|
||
// function flashTitle() {
|
||
// if(titleTimer!=0){
|
||
// return;
|
||
// }
|
||
// titleTimer = setInterval(function(){
|
||
// titleNum++;
|
||
// if (titleNum == 3) {
|
||
// titleNum = 1;
|
||
// }
|
||
// if (titleNum == 1) {
|
||
// document.title = '【🔔】' + originTitle;
|
||
// }
|
||
// if (titleNum == 2) {
|
||
// document.title = '【★】' + originTitle;
|
||
// }
|
||
// }, 500);
|
||
//
|
||
// }
|
||
|
||
function clearFlashTitle() {
|
||
clearInterval(titleTimer);
|
||
document.title = originTitle;
|
||
}
|
||
var flashing = false;
|
||
|
||
function flashTitle() {
|
||
if (flashing) {
|
||
return;
|
||
}
|
||
|
||
flashing = true;
|
||
|
||
var originalTitle = document.title;
|
||
var intervalId;
|
||
var newTitle = "🔥✉️" + originalTitle;
|
||
|
||
function changeTitle() {
|
||
document.title = document.title == originalTitle ? newTitle : originalTitle;
|
||
}
|
||
|
||
intervalId = setInterval(changeTitle, 1000);
|
||
|
||
window.onfocus = function () {
|
||
clearInterval(intervalId);
|
||
document.title = originalTitle;
|
||
flashing = false;
|
||
};
|
||
}
|
||
function emojiGifs(){
|
||
var emojiGifs=[];
|
||
var emojiTxt = ["[a]", "[b]", "[c]", "[d]", "[e]", "[f]", "[g]", "[h]", "[i]", "[j]", "[k]", "[l]", "[m]", "[n]", "[o]", "[p]", "[q]", "[r]", "[s]", "[t]", "[u]", "[v]", "[w]", "[x]", "[y]", "[z]", "[aa]", "[bb]", "[cc]", "[dd]", "[ee]", "[ff]", "[gg]", "[hh]", "[ii]", "[jj]", "[kk]", "[ll]", "[mm]", "[nn]", "[oo]", "[pp]", "[qq]", "[rr]"];
|
||
for(var i=0;i<emojiTxt.length;i++){
|
||
emojiGifs[emojiTxt[i]]="/static/images/face/"+i+".png";
|
||
}
|
||
return emojiGifs;
|
||
}
|
||
function emojiGifsMap(){
|
||
var emojiMap=[];
|
||
var emojis=emojiGifs();
|
||
for(var key in emojis){
|
||
emojiMap.push({"name":key,"path":emojis[key]});
|
||
}
|
||
return emojiMap;
|
||
}
|
||
var faceTitles = ["[a]", "[b]", "[c]", "[d]", "[e]", "[f]", "[g]", "[h]", "[i]", "[j]", "[k]", "[l]", "[m]", "[n]", "[o]", "[p]", "[q]", "[r]", "[s]", "[t]", "[u]", "[v]", "[w]", "[x]", "[y]", "[z]", "[aa]", "[bb]", "[cc]", "[dd]", "[ee]", "[ff]", "[gg]", "[hh]", "[ii]", "[jj]", "[kk]", "[ll]", "[mm]", "[nn]", "[oo]", "[pp]", "[qq]", "[rr]", "[ss]", "[tt]", "[uu]", "[vv]", "[ww]", "[xx]", "[yy]", "[zz]", "[a1]", "[b1]", "[good]", "[NO]", "[c1]", "[d1]", "[e1]", "[f1]", "[g1]", "[h1]", "[i1]", "[g1]", "[k1]", "[l1]", "[m1]", "[n1]", "[o1]", "[p1]", "[q1]", "[cake]"];
|
||
function placeFace() {
|
||
var faces=[];
|
||
for(var i=0;i<faceTitles.length;i++){
|
||
faces[faceTitles[i]]="/static/images/face/"+i+".gif";
|
||
}
|
||
return faces;
|
||
}
|
||
function replaceContent (content,baseUrl) {// 转义聊天内容中的特殊字符
|
||
if(typeof baseUrl=="undefined"){
|
||
baseUrl="";
|
||
}
|
||
// var html = function (end) {
|
||
// return new RegExp('\\n*\\[' + (end || '') + '(pre|div|span|p|table|thead|th|tbody|tr|td|ul|li|ol|li|dl|dt|dd|h2|h3|h4|h5)([\\s\\S]*?)\\]\\n*', 'g');
|
||
// };
|
||
content = (content || '').replace(/&(?!#?[a-zA-Z0-9]+;)/g, '&')
|
||
.replace(/<(?!br).*?>/g, '') // 去掉html
|
||
//.replace(/\\n/g, '<br>') // 转义换行
|
||
content=replaceSpecialTag(content,baseUrl);
|
||
return content;
|
||
}
|
||
function replaceFace(str,baseUrl){
|
||
if(baseUrl==""){
|
||
baseUrl=getBaseUrl();
|
||
}
|
||
var faces=emojiGifs();
|
||
return str.replace(/face\[([^\s\[\]]+?)\]/g, function (face) { // 转义表情
|
||
var alt = face.replace(/^face/g, '');
|
||
return '<img width="22px" alt="' + alt + '" title="' + alt + '" src="'+baseUrl + faces[alt] + '">';
|
||
});
|
||
}
|
||
function replaceImage(str,baseUrl){
|
||
return str.replace(/img\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
|
||
var src = face.replace(/^img\[/g, '').replace(/\]/g, '');;
|
||
return '<a href="' +baseUrl+ src + '" target="_blank"><img data-src="'+baseUrl+ src +'" data-lightbox class="chatImagePic" src="' +baseUrl+ src + '?width=400"/></a>';
|
||
})
|
||
}
|
||
function replaceAudio(str){
|
||
return str.replace(/audio\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
|
||
var src = face.replace(/^audio\[/g, '').replace(/\]/g, '');;
|
||
//return '<div class="chatAudio"><audio controls ref="audio" src="'+src+'" class="audio"></audio></div>';
|
||
var html= `
|
||
<audio controls ref="audio" src="`+src+`" class="audio" style="height: 38px;"></audio>
|
||
`;
|
||
|
||
return html;
|
||
})
|
||
}
|
||
function replaceAudio2(str){
|
||
return str.replace(/audio\[(.*?)\]/g, function (result) {
|
||
var mutiFiles=result.match(/audio\[(.*?)\]/)
|
||
if (mutiFiles.length<2){
|
||
return result;
|
||
}
|
||
var html= `
|
||
<div class="voice-message">
|
||
<img src="/static/images/voice-icon2.png" class="voice-icon"/>
|
||
<span></span>
|
||
<audio src="`+mutiFiles[1]+`" controls ref="audio" ></audio>
|
||
</div>
|
||
`;
|
||
return html;
|
||
|
||
// return '<a href="'+src+'" target="_blank"/><i style="font-size: 26px;color: #606266" class="el-icon-folder-checked"></i></a>';
|
||
})
|
||
|
||
// return str.replace(/audio\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
|
||
// var src = face.replace(/^audio\[/g, '').replace(/\]/g, '');
|
||
// var html=`
|
||
// <div class="voice-message">
|
||
// <img src="/static/images/voice-icon2.png" class="voice-icon"/>
|
||
// <span></span>
|
||
// <audio src=""></audio>
|
||
// </div>
|
||
// `;
|
||
// return '<div class="chatAudio"><img width="12px" data-src="'+src+'" src="/static/images/voice-icon2.png"/></div>';
|
||
// })
|
||
}
|
||
function replaceFile(str){
|
||
return str.replace(/file\[([^\s\[\]]+?)\]/g, function (face) { // 转义图片
|
||
var src = face.replace(/^file\[/g, '').replace(/\]/g, '');;
|
||
return '<a href="'+src+'" target="_blank"/><i style="font-size: 26px;color: #606266" class="el-icon-folder-checked"></i></a>';
|
||
})
|
||
}
|
||
function replaceMutiFile(str){
|
||
return str.replace(/mutiFile\[(.*?)\]/g, function (result) {
|
||
var mutiFiles=result.match(/mutiFile\[(.*?)\]/)
|
||
if (mutiFiles.length<2){
|
||
return result;
|
||
}
|
||
//return result;
|
||
|
||
var info=JSON.parse(mutiFiles[1])
|
||
var imgSrc="";
|
||
switch(info.ext){
|
||
case ".mp3":
|
||
imgSrc="/static/images/ext/MP3.png";
|
||
break;
|
||
case ".zip":
|
||
imgSrc="/static/images/ext/ZIP.png";
|
||
break;
|
||
case ".txt":
|
||
imgSrc="/static/images/ext/TXT.png";
|
||
break;
|
||
case ".7z":
|
||
imgSrc="/static/images/ext/7z.png";
|
||
break;
|
||
case ".bpm":
|
||
imgSrc="/static/images/ext/BMP.png";
|
||
break;
|
||
case ".png":
|
||
imgSrc="/static/images/ext/PNG.png";
|
||
break;
|
||
case ".jpg":
|
||
imgSrc="/static/images/ext/JPG.png";
|
||
break;
|
||
case ".jpeg":
|
||
imgSrc="/static/images/ext/JPEG.png";
|
||
break;
|
||
case ".pdf":
|
||
imgSrc="/static/images/ext/PDF.png";
|
||
break;
|
||
case ".doc":
|
||
imgSrc="/static/images/ext/DOC.png";
|
||
break;
|
||
case ".docx":
|
||
imgSrc="/static/images/ext/DOCX.png";
|
||
break;
|
||
case ".rar":
|
||
imgSrc="/static/images/ext/RAR.png";
|
||
break;
|
||
case ".xlsx":
|
||
imgSrc="/static/images/ext/XLSX.png";
|
||
break;
|
||
case ".csv":
|
||
imgSrc="/static/images/ext/XLSX.png";
|
||
break;
|
||
default:
|
||
imgSrc="/static/images/ext/default.png";
|
||
break;
|
||
}
|
||
var html= `<div onclick="window.open('`+info.path+`')" class="productCard">
|
||
<div><img src='`+imgSrc+`' style='width: 38px;height: 38px;' /></div>
|
||
<div class="productCardTitle">
|
||
<div class="productCardTitle">`+info.name+`</div>
|
||
<div style="font-size: 12px;color: #666">`+formatFileSize(info.size)+`</div>
|
||
</div>
|
||
</div>`;
|
||
return html;
|
||
|
||
// return '<a href="'+src+'" target="_blank"/><i style="font-size: 26px;color: #606266" class="el-icon-folder-checked"></i></a>';
|
||
})
|
||
}
|
||
function formatFileSize(fileSize) {
|
||
if (fileSize < 1024) {
|
||
return fileSize + 'B';
|
||
} else if (fileSize < (1024*1024)) {
|
||
var temp = fileSize / 1024;
|
||
temp = temp.toFixed(2);
|
||
return temp + 'KB';
|
||
} else if (fileSize < (1024*1024*1024)) {
|
||
var temp = fileSize / (1024*1024);
|
||
temp = temp.toFixed(2);
|
||
return temp + 'MB';
|
||
} else {
|
||
var temp = fileSize / (1024*1024*1024);
|
||
temp = temp.toFixed(2);
|
||
return temp + 'GB';
|
||
}
|
||
}
|
||
function urlEncode (str) {
|
||
str = (str + '').toString();
|
||
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28'). replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
|
||
}
|
||
function AsciiToString(i){
|
||
return String.fromCharCode(i)
|
||
}
|
||
|
||
function urlDecode(zipStr){
|
||
var uzipStr = '';
|
||
for (var i = 0; i < zipStr.length; i += 1) {
|
||
var chr = zipStr.charAt(i);
|
||
if (chr === '+') {
|
||
uzipStr += ' ';
|
||
} else if (chr === '%') {
|
||
var asc = zipStr.substring(i + 1, i + 3);
|
||
if (parseInt('0x' + asc) > 0x7f) {
|
||
uzipStr += decodeURI('%' + asc.toString() + zipStr.substring(i+3, i+9).toString());
|
||
i += 8;
|
||
}else{
|
||
uzipStr += AsciiToString(parseInt('0x' + asc));
|
||
i += 2;
|
||
}
|
||
}else{
|
||
uzipStr += chr;
|
||
}
|
||
}
|
||
|
||
return uzipStr;
|
||
}
|
||
function replaceProduct(str){
|
||
return str.replace(/^product\[(.*?)\]$/g, function (product) {
|
||
if(!arguments[1]){
|
||
return;
|
||
}
|
||
let jsonStr=arguments[1].replace(/\'/g,'"');
|
||
try{
|
||
let info=JSON.parse(jsonStr);
|
||
if(typeof info=="undefined"){
|
||
return;
|
||
}
|
||
if(!info.title) info.title="智能客服系统产品卡片";
|
||
let priceHtml="";
|
||
if(info.price){
|
||
priceHtml='<div class="productCardPrice">'+info.price+'</div>';
|
||
}
|
||
if(info.img){
|
||
info.img="<img src='"+info.img+"'/>";
|
||
}else{
|
||
info.img="";
|
||
}
|
||
let urlHtml=""
|
||
if(info.url){
|
||
urlHtml='<a href="'+info.url+'" target="_blank">查看</a>';
|
||
}
|
||
let html= `<div class="productCard">`+info.img+`<div class="productInfo"><h2 class="productCardTitle">`+info.title+`</h2><div class="productCardBtn">`+priceHtml+urlHtml+`</div></div></div>`;
|
||
return html;
|
||
}catch (e) {
|
||
return jsonStr;
|
||
}
|
||
});
|
||
}
|
||
function replaceSpecialTag(str,baseUrl) {
|
||
if(typeof baseUrl=="undefined"){
|
||
baseUrl="";
|
||
}
|
||
str=str.replace(/\n/g,"<br>");
|
||
str=replaceFace(str,baseUrl);
|
||
str=replaceImage(str,baseUrl);
|
||
str=replaceAudio(str)
|
||
str=replaceFile(str)
|
||
str=replaceMutiFile(str)
|
||
str=replaceProduct(str);
|
||
|
||
return str;
|
||
}
|
||
|
||
function filter (obj){
|
||
var imgType = ["image/jpeg","image/png","image/jpg","image/gif"];
|
||
var filetypes = imgType;
|
||
var isnext = false;
|
||
for (var i = 0; i < filetypes.length; i++) {
|
||
if (filetypes[i] == obj.type) {
|
||
return true;
|
||
}
|
||
}
|
||
return false;
|
||
}
|
||
function sleep(time) {
|
||
var startTime = new Date().getTime() + parseInt(time, 10);
|
||
while(new Date().getTime() < startTime) {}
|
||
}
|
||
//检测语种
|
||
function checkLang() {
|
||
// 尝试从查询参数中获取语言设置,如果不存在则尝试从本地存储中获取
|
||
let lang = getQuery("lang") || getLocalStorage("lang") || navigator.language;
|
||
|
||
// 根据浏览器语言设置默认语言
|
||
switch (lang) {
|
||
// 美式英语、英式英语、澳大利亚英语、加拿大英语和新西兰英语统一使用英语
|
||
case "en-US":
|
||
case "en-GB":
|
||
case "en-AU":
|
||
case "en-CA":
|
||
case "en-NZ":
|
||
case "en":
|
||
lang = "en-US";
|
||
break;
|
||
// 中文简体
|
||
case "zh-CN":
|
||
case "cn":
|
||
lang = "zh-CN";
|
||
break;
|
||
// 中文繁体,包括台湾和香港
|
||
case "zh-TW":
|
||
lang = "zh-TW";
|
||
break;
|
||
case "zh-HK":
|
||
lang = "zh-HK";
|
||
break;
|
||
case "ru-RU":
|
||
case "ru":
|
||
lang = "ru-RU";
|
||
break;
|
||
case "kk-KZ":
|
||
lang = "kk-KZ";
|
||
break;
|
||
default:
|
||
lang = "en-US";
|
||
break;
|
||
}
|
||
return lang;
|
||
}
|
||
//动态加载js
|
||
function loadJsFile(name,callback) {
|
||
var script = document.createElement('script');
|
||
script.type = 'text/javascript';
|
||
script.src = '/static/js/' + name;
|
||
script.defer = true;
|
||
if(typeof(callback)=='function'){
|
||
script.onload = script.onreadystatechange = function () {
|
||
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete"){
|
||
callback();
|
||
script.onload = script.onreadystatechange = null;
|
||
}
|
||
};
|
||
}
|
||
document.head.appendChild(script);
|
||
}
|
||
//修改url参数
|
||
function changeURLPar(destiny, par, par_value) {
|
||
var pattern = par.replace(/[.*+?^${}()|[\]\\]/g, '\\$&') + '=([^&]*)';
|
||
var replaceText = par + '=' + par_value;
|
||
if (destiny.match(new RegExp(pattern))) {
|
||
return destiny.replace(new RegExp(pattern, 'g'), replaceText);
|
||
} else {
|
||
if (destiny.match('[\?]')) {
|
||
return destiny + '&' + replaceText;
|
||
} else {
|
||
return destiny + '?' + replaceText;
|
||
}
|
||
}
|
||
}
|
||
//获取url中的get参数
|
||
function getQuery(key) {
|
||
// 获取所有参数
|
||
var query = window.location.search.substring(1);
|
||
var hash = window.location.hash.substring(1);
|
||
// 如果锚点后面有参数,把锚点后面的参数加入到search参数中
|
||
if(hash.indexOf("?") > -1){
|
||
query += "&" + hash.split("?")[1];
|
||
}
|
||
var key_values = query.split("&");
|
||
var params = {};
|
||
// 遍历参数并存入params对象
|
||
key_values.map(function (key_val){
|
||
var key_val_arr = key_val.split("=");
|
||
params[key_val_arr[0]] = key_val_arr[1];
|
||
});
|
||
// 如果找到了key对应的参数,返回对应值
|
||
if(typeof params[key]!="undefined"){
|
||
return params[key];
|
||
}
|
||
// 如果没找到,返回空字符串
|
||
return "";
|
||
}
|
||
function utf8ToB64(str) {
|
||
return window.btoa(unescape(encodeURIComponent(str)));
|
||
}
|
||
function urlDecode2(str) {
|
||
return decodeURIComponent(str.replace(/\%20/g, '+'));
|
||
}
|
||
function b64ToUtf8(str) {
|
||
str=urlDecode2(str);
|
||
return decodeURIComponent(escape(window.atob(str)));
|
||
}
|
||
//存储localStorge
|
||
function setLocalStorage(key,obj){
|
||
if(!navigator.cookieEnabled||typeof window.localStorage == 'undefined'){
|
||
return false;
|
||
}
|
||
localStorage.setItem(key, JSON.stringify(obj));
|
||
return true;
|
||
}
|
||
//读取localStorge
|
||
function getLocalStorage(key){
|
||
if(!navigator.cookieEnabled||typeof window.localStorage == 'undefined'){
|
||
return false;
|
||
}
|
||
var str=localStorage.getItem(key);
|
||
if(!str){
|
||
return "";
|
||
}
|
||
return JSON.parse(str);
|
||
}
|
||
//设置cookie
|
||
function setCookie(name,value,expireTime) {
|
||
var exp = new Date();
|
||
exp.setTime(exp.getTime() + expireTime*1000);
|
||
document.cookie = name + "="+ escape (value) + ";expires=" + exp.toGMTString();
|
||
}
|
||
//读取cookie
|
||
function getCookie(name) {
|
||
var arr,reg=new RegExp("(^| )"+name+"=([^;]*)(;|$)");
|
||
if(arr=document.cookie.match(reg)){
|
||
return unescape(arr[2]);
|
||
}else{
|
||
return null;
|
||
}
|
||
}
|
||
|
||
function setFakeCookie(name,value,expire) {
|
||
var obj={
|
||
"create_time":getNowDate(),
|
||
"expire":expire,
|
||
"value":value,
|
||
}
|
||
localStorage.setItem(name, JSON.stringify(obj));
|
||
}
|
||
function getFakeCookie(name) {
|
||
var obj=JSON.parse(localStorage.getItem(name));
|
||
if(!obj){
|
||
return "";
|
||
}
|
||
var visitorExpireSecond=new Date(obj.create_time).getTime()+parseInt(obj.expire)*1000;
|
||
var nowTime=getTimestamp();
|
||
if(visitorExpireSecond<=nowTime){
|
||
localStorage.removeItem(name);
|
||
return "";
|
||
}
|
||
return obj.value;
|
||
}
|
||
var imgs = document.querySelectorAll('img');
|
||
|
||
//offsetTop是元素与offsetParent的距离,循环获取直到页面顶部
|
||
function getTop(e) {
|
||
var T = e.offsetTop;
|
||
while(e = e.offsetParent) {
|
||
T += e.offsetTop;
|
||
}
|
||
return T;
|
||
}
|
||
|
||
function lazyLoad(imgs) {
|
||
var H = document.documentElement.clientHeight;//获取可视区域高度
|
||
var S = document.documentElement.scrollTop || document.body.scrollTop;
|
||
for (var i = 0; i < imgs.length; i++) {
|
||
if (H + S > getTop(imgs[i])) {
|
||
console.log(imgs[i]);
|
||
imgs[i].src = imgs[i].getAttribute('data-src');
|
||
}
|
||
}
|
||
}
|
||
function loadImage(url){
|
||
var image = new Image();
|
||
image.src = url;
|
||
console.log(image);
|
||
}
|
||
function image2Canvas(image) {
|
||
var canvas = document.createElement('canvas')
|
||
var ctx = canvas.getContext('2d')
|
||
canvas.width = image.naturalWidth
|
||
canvas.height = image.naturalHeight
|
||
ctx.drawImage(image, 0, 0, canvas.width, canvas.height)
|
||
return canvas
|
||
}
|
||
function canvas2DataUrl(canvas, quality, type) {
|
||
return canvas.toDataURL(type || 'image/jpeg', quality || 0.8)
|
||
}
|
||
function dataUrl2Image(dataUrl, callback) {
|
||
var image = new Image()
|
||
image.onload = function() {
|
||
callback(image)
|
||
}
|
||
image.src = dataUrl
|
||
}
|
||
function dateFormat(fmt, date) {
|
||
let ret;
|
||
const opt = {
|
||
"Y+": date.getFullYear().toString(), // 年
|
||
"m+": (date.getMonth() + 1).toString(), // 月
|
||
"d+": date.getDate().toString(), // 日
|
||
"H+": date.getHours().toString(), // 时
|
||
"M+": date.getMinutes().toString(), // 分
|
||
"S+": date.getSeconds().toString() // 秒
|
||
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
||
};
|
||
for (let k in opt) {
|
||
if(k!="Y+"){
|
||
var length=opt[k].length;
|
||
if(length<2){
|
||
opt[k]="0"+opt[k];
|
||
}
|
||
}
|
||
ret = new RegExp("(" + k + ")").exec(fmt);
|
||
if (ret) {
|
||
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
|
||
};
|
||
};
|
||
return fmt;
|
||
}
|
||
/**
|
||
* 人性化时间
|
||
* @param {Object} timestamp
|
||
*/
|
||
function beautifyTime(timestamp,lang){
|
||
var mistiming = Math.round(new Date() / 1000)-timestamp;
|
||
mistiming = Math.abs(mistiming)
|
||
if(lang=="en"){
|
||
var postfix = mistiming>0 ? 'ago' : 'later'
|
||
var arrr = [' years ',' months ',' weeks ',' days ',' hours ',' minutes ',' seconds '];
|
||
var just='just now';
|
||
}else if(lang=="tw"){
|
||
var postfix = mistiming>0 ? '前' : '後'
|
||
var arrr = ['年','個月','周','天','小時','分鐘','秒'];
|
||
var just='剛剛';
|
||
}else{
|
||
var postfix = mistiming>0 ? '前' : '后'
|
||
var arrr = ['年','个月','周','天','小时','分钟','秒'];
|
||
var just='刚刚';
|
||
}
|
||
if(mistiming<=1){
|
||
return just;
|
||
}
|
||
|
||
var arrn = [31536000,2592000,604800,86400,3600,60,1];
|
||
|
||
for(var i=0; i<7; i++){
|
||
var inm = Math.floor(mistiming/arrn[i])
|
||
if(inm!=0){
|
||
return inm+arrr[i] + postfix
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 判断是否是手机访问
|
||
* @returns {boolean}
|
||
*/
|
||
function isMobile() {
|
||
if( /Mobile|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
//发送ajax的助手函数
|
||
function sendAjax(url,method,params,callback){
|
||
$.ajax({
|
||
type: method,
|
||
url: url,
|
||
data:params,
|
||
headers: {
|
||
"token": localStorage.getItem("token")
|
||
},
|
||
success: function(data) {
|
||
callback(data);
|
||
},
|
||
error: function(data) {
|
||
var res=JSON.parse(data.responseText);
|
||
callback(res);
|
||
},
|
||
});
|
||
}
|
||
//复制文本
|
||
function copyText(text) {
|
||
var target = document.createElement('input') //创建input节点
|
||
target.value = text // 给input的value赋值
|
||
document.body.appendChild(target) // 向页面插入input节点
|
||
target.select() // 选中input
|
||
document.execCommand("copy"); // 执行浏览器复制命令
|
||
document.body.removeChild(target);
|
||
return true;
|
||
}
|
||
function MyHereDoc(){
|
||
/*HERE
|
||
|
||
HERE*/
|
||
var here = "HERE";
|
||
var reobj = new RegExp("/\\*"+here+"\\n[\\s\\S]*?\\n"+here+"\\*/", "m");
|
||
str = reobj.exec(MyHereDoc).toString();
|
||
str = str.replace(new RegExp("/\\*"+here+"\\n",'m'),'').toString();
|
||
return str.replace(new RegExp("\\n"+here+"\\*/",'m'),'').toString();
|
||
}
|
||
//js获取当前时间
|
||
function getNowDate() {
|
||
var myDate = new Date;
|
||
var year = myDate.getFullYear(); //获取当前年
|
||
var mon = myDate.getMonth() + 1; //获取当前月
|
||
if(mon<10){
|
||
mon="0"+mon;
|
||
}
|
||
var date = myDate.getDate(); //获取当前日
|
||
if(date<10){
|
||
date="0"+date;
|
||
}
|
||
var hours = myDate.getHours(); //获取当前小时
|
||
if(hours<10){
|
||
hours="0"+hours;
|
||
}
|
||
var minutes = myDate.getMinutes(); //获取当前分钟
|
||
if(minutes<10){
|
||
minutes="0"+minutes;
|
||
}
|
||
var seconds = myDate.getSeconds(); //获取当前秒
|
||
if(seconds<10){
|
||
seconds="0"+seconds;
|
||
}
|
||
var now = year + "-" + mon + "-" + date + " " + hours + ":" + minutes + ":" + seconds;
|
||
return now;
|
||
}
|
||
//获取当前时间戳
|
||
function getTimestamp() {
|
||
return new Date(getNowDate()).getTime();
|
||
}
|
||
//删除对象中的空属性
|
||
function removePropertyOfNull(obj){
|
||
var i = obj.length;
|
||
while (i--) {
|
||
if (obj[i]===null) {
|
||
obj.splice(i, 1);
|
||
}
|
||
}
|
||
return obj;
|
||
}
|
||
//判断版本号大小
|
||
function compareVersion(v1, v2) {
|
||
if (v1 == v2) {
|
||
return 0;
|
||
}
|
||
|
||
const vs1 = v1.split(".").map(a => parseInt(a));
|
||
const vs2 = v2.split(".").map(a => parseInt(a));
|
||
|
||
const length = Math.min(vs1.length, vs2.length);
|
||
for (let i = 0; i < length; i++) {
|
||
if (vs1[i] > vs2[i]) {
|
||
return 1;
|
||
} else if (vs1[i] < vs2[i]) {
|
||
return -1;
|
||
}
|
||
}
|
||
|
||
if (length == vs1.length) {
|
||
return -1;
|
||
} else {
|
||
return 1;
|
||
}
|
||
}
|
||
function isWeiXin(){
|
||
//window.navigator.userAgent属性包含了浏览器类型、版本、操作系统类型、浏览器引擎类型等信息,这个属性可以用来判断浏览器类型
|
||
var ua = window.navigator.userAgent.toLowerCase();
|
||
//通过正则表达式匹配ua中是否含有MicroMessenger字符串
|
||
if(ua.match(/MicroMessenger/i) == 'micromessenger'){
|
||
return true;
|
||
}else{
|
||
return false;
|
||
}
|
||
}
|
||
function isMobile() {
|
||
if( /Mobile|Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
function replaceHtml(str){
|
||
return str.replace(/<\/?.+?\/?>/g,'');
|
||
}
|
||
function getSelect(){
|
||
var selecter = window.getSelection().toString();
|
||
if (selecter != null && selecter.trim() != ""){
|
||
return selecter.trim();
|
||
}
|
||
return "";
|
||
}
|
||
//数组分页
|
||
function pagination(pageNo, pageSize, array) {
|
||
var offset = (pageNo - 1) * pageSize;
|
||
return (offset + pageSize >= array.length) ? array.slice(offset, array.length) : array.slice(offset, offset + pageSize);
|
||
}
|
||
|
||
function mod(n, m) {
|
||
return ((n % m) + m) % m;
|
||
}
|
||
//动态加载css
|
||
function dynamicLoadCss(url){
|
||
var head = document.getElementsByTagName('head')[0];
|
||
var link = document.createElement('link');
|
||
link.type='text/css';
|
||
link.rel = 'stylesheet';
|
||
link.href = url;
|
||
head.appendChild(link);
|
||
}
|
||
//动态加载js文件
|
||
function dynamicLoadJs(url, callback){
|
||
var head = document.getElementsByTagName('head')[0];
|
||
var script = document.createElement('script');
|
||
script.type = 'text/javascript';
|
||
script.src = url;
|
||
if(typeof(callback)=='function'){
|
||
script.onload = script.onreadystatechange = function () {
|
||
if (!this.readyState || this.readyState === "loaded" || this.readyState === "complete"){
|
||
callback();
|
||
script.onload = script.onreadystatechange = null;
|
||
}
|
||
};
|
||
}
|
||
head.appendChild(script);
|
||
}
|
||
//数组导出CSV文件
|
||
function exportCSV(jsonData,fileName){
|
||
if(!jsonData || jsonData.length==0){
|
||
return;
|
||
}
|
||
if(!fileName){
|
||
fileName="exportCSV.csv";
|
||
}
|
||
let one=jsonData[0];
|
||
let csvText="";
|
||
for(let key in one){
|
||
csvText+=key+","
|
||
}
|
||
csvText=trim(csvText,",")+"\n";
|
||
//增加\t为了不让表格显示科学计数法或者其他格式
|
||
for(let i = 0 ; i < jsonData.length ; i++ ){
|
||
let row="";
|
||
for(let item in jsonData[i]){
|
||
row+=`${jsonData[i][item] + '\t'},`;
|
||
}
|
||
csvText+=trim(row,",")+'\n';
|
||
}
|
||
//encodeURIComponent解决中文乱码
|
||
let uri = 'data:text/csv;charset=utf-8,\ufeff' + encodeURIComponent(csvText);
|
||
//通过创建a标签实现
|
||
let link = document.createElement("a");
|
||
link.href = uri;
|
||
//对下载的文件命名
|
||
link.download = fileName;
|
||
document.body.appendChild(link);
|
||
link.click();
|
||
document.body.removeChild(link);
|
||
}
|
||
//js实现类似php trim函数
|
||
function trim(str, char) {
|
||
if (char) {
|
||
str=str.replace(new RegExp('^\\'+char+'+|\\'+char+'+$', 'g'), '');
|
||
}
|
||
return str.replace(/^\s+|\s+$/g, '');
|
||
};
|
||
//截取指定个数的字符串
|
||
function truncateString(inputString, maxLength) {
|
||
let currentLength = 0;
|
||
let outputString = '';
|
||
let i = 0;
|
||
|
||
while (i < inputString.length && currentLength < maxLength) {
|
||
const char = inputString[i];
|
||
const charCode = inputString.charCodeAt(i);
|
||
|
||
// 如果字符是英文字符(ASCII码范围:32-126)或中文字符
|
||
if ((charCode >= 32 && charCode <= 126) || (charCode >= 19968 && charCode <= 40869)) {
|
||
outputString += char;
|
||
currentLength += 1; // 英文字符算一个字符,中文字符也算一个字符
|
||
} else {
|
||
// 其他字符,如表情符号等,可能会占用多个字符宽度,视情况增加字符宽度
|
||
currentLength += 2; // 增加字符宽度,可以根据需要调整
|
||
outputString += char;
|
||
}
|
||
i++;
|
||
}
|
||
|
||
return outputString;
|
||
};
|
||
//总分页数
|
||
function sumPage(pageSize,arr){
|
||
var len=arr.length;
|
||
if(len<pageSize){
|
||
return 1;
|
||
}
|
||
var pages=len % pageSize == 0 ? len / pageSize : Math.ceil(len / pageSize);
|
||
|
||
return pages;
|
||
}
|
||
//数组分页
|
||
/** 将数组进行分页,返回新的分页数组
|
||
* @param {Object} pageSize 每页大小
|
||
* @param {Object} arr 数组
|
||
*/
|
||
function returnAllPageFunc(pageSize, arr) {
|
||
let pageNum = 1
|
||
let pageObj = {
|
||
pageNum: 1,
|
||
list: []
|
||
}
|
||
let pageResult = []
|
||
|
||
let newArr = JSON.parse(JSON.stringify(arr))
|
||
let totalPage = newArr.length ? Math.ceil(arr.length / pageSize) : 0 // 计算总页数
|
||
|
||
for (let i = 1; i <= totalPage; i++) {
|
||
if (totalPage == 1) {
|
||
pageNum += 1
|
||
pageObj.list = newArr.splice(0, arr.length)
|
||
} else if (i <= totalPage) {
|
||
pageNum += 1
|
||
pageObj.list = newArr.splice(0, pageSize)
|
||
} else {
|
||
pageObj.list = newArr.splice(0, arr.length % pageSize)
|
||
}
|
||
pageResult.push(pageObj)
|
||
pageObj = {
|
||
pageNum: pageNum,
|
||
list: []
|
||
}
|
||
}
|
||
console.log(`分页:${JSON.stringify(pageResult)}`)
|
||
return pageResult
|
||
}
|
||
function easyFor(arr,callback){
|
||
for(var i=0;i<arr.length;i++){
|
||
callback(i,arr[i]);
|
||
}
|
||
}
|
||
//今天零点
|
||
function getTordayZero(){
|
||
return new Date(new Date().toLocaleDateString())
|
||
}
|
||
//缩短时间
|
||
function shortTime(t){
|
||
let time=new Date(t);
|
||
let today = new Date();
|
||
let todayYear = today.getFullYear();
|
||
let todayMonth = today.getMonth()+1;
|
||
let todayDate = today.getDate();
|
||
|
||
let targetYear = time.getFullYear();
|
||
let targetMonth = time.getMonth()+1;
|
||
let targetDate = time.getDate();
|
||
let targetHour = time.getHours();
|
||
let targetMinutes = time.getMinutes();
|
||
let targetSeconds = time.getSeconds();
|
||
// 同一天,只显示小时、分钟、秒
|
||
if (todayYear === targetYear && todayMonth === targetMonth && todayDate === targetDate) {
|
||
if (targetHour < 10) {
|
||
targetHour = "0" + targetHour;
|
||
}
|
||
if (targetMinutes < 10) {
|
||
targetMinutes = "0" + targetMinutes;
|
||
}
|
||
if (targetSeconds < 10) {
|
||
targetSeconds = "0" + targetSeconds;
|
||
}
|
||
return targetHour + ":" + targetMinutes + ":" + targetSeconds;
|
||
}
|
||
// 同一年,只显示月日等
|
||
if (todayYear === targetYear) {
|
||
|
||
if (targetMonth < 10) {
|
||
targetMonth = "0" + targetMonth;
|
||
}
|
||
if (targetDate < 10) {
|
||
targetDate = "0" + targetDate;
|
||
}
|
||
if (targetHour < 10) {
|
||
targetHour = "0" + targetHour;
|
||
}
|
||
if (targetMinutes < 10) {
|
||
targetMinutes = "0" + targetMinutes;
|
||
}
|
||
if (targetSeconds < 10) {
|
||
targetSeconds = "0" + targetSeconds;
|
||
}
|
||
return `${targetMonth}-${targetDate} `+targetHour + ":" + targetMinutes + ":" + targetSeconds;
|
||
}
|
||
return t;
|
||
}
|
||
//强密码验证
|
||
function strongPasswordCheck(s) {
|
||
var pattern = /^(?![a-zA-Z]+$)(?![A-Z0-9]+$)(?![a-z0-9]+$)[a-zA-Z0-9]{6,20}$/;
|
||
//如果符合至少6个,至多20个字符组成。至少包含一个小写字母,一个大写字母,和一个数字。
|
||
if (pattern.test(s)) {
|
||
return true;
|
||
} else {
|
||
return false;
|
||
}
|
||
}
|
||
//删除对象数组中指定key value的对象
|
||
function removeObjects(objects, key, value) {
|
||
return objects.filter(function(object) {
|
||
return object[key] !== value;
|
||
});
|
||
}
|
||
//延迟展示
|
||
function displayGreetings(greetings,callback) {
|
||
if(!greetings||greetings.length==0){
|
||
return;
|
||
}
|
||
let delay=0;
|
||
for (let i = 0; i < greetings.length; i++) {
|
||
if(!greetings[i].delay_second){
|
||
delay+=3;
|
||
}else{
|
||
delay+=greetings[i].delay_second;
|
||
}
|
||
greetings[i].delay_second=delay;
|
||
}
|
||
for (let i = 0; i < greetings.length; i++) {
|
||
let greeting = greetings[i];
|
||
setTimeout(function() {
|
||
// 在这里执行你想展示的操作,例如:
|
||
callback(greeting);
|
||
}, greeting.delay_second*1000);
|
||
}
|
||
}
|
||
//获取浏览器信息
|
||
function getBrowserInfo(ua) {
|
||
if(/Googlebot/i.test(ua)){
|
||
return {
|
||
name: "Googlebot",
|
||
version: ""
|
||
};
|
||
}
|
||
if(/MicroMessenger/i.test(ua)){
|
||
return {
|
||
name: "MicroMessenger",
|
||
version: ua.match(/MicroMessenger\/([^\s]+)/)[1]
|
||
};
|
||
}
|
||
if(/Mi|MiuiBrowser/i.test(ua)){
|
||
return {
|
||
name: "MiuiBrowser",
|
||
version: ""
|
||
};
|
||
}
|
||
if(/SM/i.test(ua)){
|
||
return {
|
||
name: "SamsungBrowser",
|
||
version: ""
|
||
};
|
||
}
|
||
if(/pclm|OPM|HeyTapBrowser/i.test(ua)){
|
||
return {
|
||
name: "OPPO Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
if(/Vivo/i.test(ua)){
|
||
return {
|
||
name: "ViVO",
|
||
version: ""
|
||
};
|
||
}
|
||
if(/Quark/i.test(ua)){
|
||
return {
|
||
name: "Quark Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
//手机
|
||
if (/iPhone/.test(ua)) {
|
||
let matchs=ua.match(/CPU\s+iPhone\s+OS\s+([^\s]+)\s+like/);
|
||
let version="";
|
||
if(matchs && matchs.length>1){
|
||
version=matchs[1];
|
||
}
|
||
return {
|
||
name: "Mobile Safari",
|
||
version: version
|
||
};
|
||
}
|
||
//猎豹
|
||
if (/LBBROWSER/i.test(ua)) {
|
||
return {
|
||
name: "Liebao Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
//QQ
|
||
if (/M?QQBrowser/i.test(ua)) {
|
||
return {
|
||
name: "QQ Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
//uc
|
||
if (/UCWEB|UCBrowser/i.test(ua)) {
|
||
return {
|
||
name: "UC Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
|
||
//360
|
||
if (/360SE/i.test(ua)) {
|
||
return {
|
||
name: "360 Secure Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
//QQ 浏览器
|
||
if (/QQBrowser/i.test(ua)) {
|
||
return {
|
||
name: "QQ Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// Baidu Browser
|
||
if (/baidubrowser/i.test(ua)) {
|
||
return {
|
||
name: "Baidu Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// Sogou Browser
|
||
if (/MetaSr|Sogou/i.test(ua)) {
|
||
return {
|
||
name: "Sogou Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// TT Browser
|
||
if (/TaoBrowser/i.test(ua)) {
|
||
return {
|
||
name: "TT Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// SoHu Browser
|
||
if (/LBBROWSER|SOHU/i.test(ua)) {
|
||
return {
|
||
name: "SoHu Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// The World Browser
|
||
if (/TheWorld/i.test(ua)) {
|
||
return {
|
||
name: "The World Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// 2345 Browser
|
||
if (/2345Explorer/i.test(ua)) {
|
||
return {
|
||
name: "2345 Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// Huawei Browser
|
||
if (/HuaweiBrowser/i.test(ua)) {
|
||
return {
|
||
name: "Huawei Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
// Kingsoft Browser
|
||
if (/K-OTS/i.test(ua)) {
|
||
return {
|
||
name: "Kingsoft Browser",
|
||
version: ""
|
||
};
|
||
}
|
||
if (/360EE/i.test(ua)) {
|
||
return {
|
||
name: "360 Extreme Explorer",
|
||
version: ""
|
||
};
|
||
}
|
||
// Edge
|
||
if (/Edg\/\d+/i.test(ua)) {
|
||
return {
|
||
name: "Microsoft Edge",
|
||
version: ua.match(/Edg\/([^\s]+)/)[1]
|
||
};
|
||
}
|
||
// Chrome
|
||
if (/Chrome\/\d+/.test(ua)) {
|
||
return {
|
||
name: "Google Chrome",
|
||
version: ua.match(/Chrome\/([^\s]+)/)[1]
|
||
};
|
||
}
|
||
// Firefox
|
||
if (/Firefox\/\d+/.test(ua)) {
|
||
return {
|
||
name: "Mozilla Firefox",
|
||
version: ua.match(/Firefox\/([^\s]+)/)[1]
|
||
};
|
||
}
|
||
// Safari
|
||
if (/Safari\/\d+/.test(ua)) {
|
||
return {
|
||
name: "Apple Safari",
|
||
version: ua.match(/Safari\/([^\s]+)/)[1]
|
||
};
|
||
}
|
||
if (/MSIE \d+/.test(ua)) {
|
||
return {
|
||
name: "Microsoft Internet Explorer",
|
||
version: ua.match(/MSIE ([^\s]+)/)[1]
|
||
};
|
||
}
|
||
|
||
// Other
|
||
return {
|
||
name: "Other",
|
||
version: "Unknown"
|
||
};
|
||
}
|
||
//获取操作系统和设备信息
|
||
function getOSAndDeviceInfo(ua) {
|
||
const result = {
|
||
os:"",
|
||
device:""
|
||
};
|
||
// 操作系统
|
||
if (/Android/.test(ua)) {
|
||
result.os = "Android";
|
||
} else if (/iPhone/i.test(ua)) {
|
||
result.os = "iOS";
|
||
result.device = "iPhone";
|
||
} else if (/Mac/i.test(ua)) {
|
||
result.os = "Mac OS X";
|
||
result.device = "Mac";
|
||
} else if (/Windows/.test(ua)) {
|
||
if (/NT 10.0/.test(ua)) {
|
||
result.os = "Windows 10";
|
||
} else if (/NT 6.2/.test(ua)) {
|
||
result.os = "Windows 8";
|
||
} else if (/NT 6.1/.test(ua)) {
|
||
result.os = "Windows 7";
|
||
} else if (/NT 6.0/.test(ua)) {
|
||
result.os = "Windows Vista";
|
||
} else if (/NT 5.2/.test(ua)) {
|
||
result.os = "Windows Server 2003";
|
||
} else if (/NT 5.1/.test(ua)) {
|
||
result.os = "Windows XP";
|
||
}
|
||
}else {
|
||
result.os = "Other";
|
||
}
|
||
// 手机品牌型号
|
||
if (/Samsung|SM/i.test(ua)) {
|
||
result.device = "Samsung";
|
||
} else if (/Huawei/i.test(ua)) {
|
||
result.device = "Huawei";
|
||
} else if (/Xiaomi|M2011K2C/i.test(ua)) {
|
||
result.device = "Xiaomi";
|
||
} else if (/221013|Redmi/i.test(ua)) {
|
||
result.device = "Redmi";
|
||
}else if (/OPPO|pclm|OPM|HeyTapBrowser/i.test(ua)) {
|
||
result.device = "OPPO";
|
||
} else if (/Vivo/i.test(ua)) {
|
||
result.device = "Vivo";
|
||
} else if (/OnePlus|ne2210/i.test(ua)) {
|
||
result.device = "OnePlus ";
|
||
}else if (/Sony/i.test(ua)) {
|
||
result.device = "Sony";
|
||
} else if (/LG/i.test(ua)) {
|
||
result.device = "LG";
|
||
} else if (/HTC/i.test(ua)) {
|
||
result.device = "HTC" ;
|
||
} else if (/Nokia/i.test(ua)) {
|
||
result.device = "Nokia";
|
||
} else if (/Lenovo/i.test(ua)) {
|
||
result.device = "Lenovo";
|
||
}else if (/ZTE/i.test(ua)) {
|
||
result.device = "ZTE";
|
||
} else if (/Gionee/i.test(ua)) {
|
||
result.device = "Gionee";
|
||
} else if (/Meizu/i.test(ua)) {
|
||
result.device = "Meizu";
|
||
} else if (/Coolpad/i.test(ua)) {
|
||
result.device = "Coolpad";
|
||
} else if (/Oppo/i.test(ua)) {
|
||
result.device = "Oppo";
|
||
} else if (/TCL/i.test(ua)) {
|
||
result.device = "TCL";
|
||
} else if (/RMX/i.test(ua)) {
|
||
result.device = "Realme";
|
||
}
|
||
return result;
|
||
}
|
||
//使元素可拖动
|
||
function makeElementDraggableOnDesktop(elementId) {
|
||
const draggableDiv = document.getElementById(elementId);
|
||
let isDragging = false;
|
||
let dragStartX, dragStartY, offsetX, offsetY;
|
||
const container = draggableDiv.parentElement;
|
||
|
||
draggableDiv.addEventListener('mousedown', function(e) {
|
||
isDragging = true;
|
||
dragStartX = e.clientX;
|
||
dragStartY = e.clientY;
|
||
const rect = draggableDiv.getBoundingClientRect();
|
||
offsetX = dragStartX - rect.left;
|
||
offsetY = dragStartY - rect.top;
|
||
});
|
||
|
||
draggableDiv.addEventListener('mousemove', function(e) {
|
||
if (isDragging) {
|
||
const x = e.clientX - offsetX;
|
||
const y = e.clientY - offsetY;
|
||
const maxX = container.clientWidth - draggableDiv.offsetWidth;
|
||
const maxY = container.clientHeight - draggableDiv.offsetHeight;
|
||
const boundedX = Math.max(0, Math.min(x, maxX));
|
||
const boundedY = Math.max(0, Math.min(y, maxY));
|
||
draggableDiv.style.left = boundedX + 'px';
|
||
draggableDiv.style.top = boundedY + 'px';
|
||
}
|
||
});
|
||
|
||
draggableDiv.addEventListener('mouseup', function(e) {
|
||
isDragging = false;
|
||
});
|
||
}
|
||
|
||
|
||
// 手机设备可拖动
|
||
function makeElementDraggableOnMobile(elementId) {
|
||
const draggableDiv = document.getElementById(elementId);
|
||
let isDragging = false;
|
||
let dragStartX, dragStartY, touchStartX, touchStartY, offsetX, offsetY;
|
||
|
||
function startDragging(e) {
|
||
e.preventDefault();
|
||
const touch = e.touches[0];
|
||
touchStartX = touch.clientX;
|
||
touchStartY = touch.clientY;
|
||
const rect = draggableDiv.getBoundingClientRect();
|
||
offsetX = touch.clientX - rect.left;
|
||
offsetY = touch.clientY - rect.top;
|
||
isDragging = true;
|
||
}
|
||
|
||
function moveElement(e) {
|
||
e.preventDefault();
|
||
if (isDragging) {
|
||
const touch = e.touches[0];
|
||
let x = touch.clientX - offsetX;
|
||
let y = touch.clientY - offsetY;
|
||
const maxX = window.innerWidth - draggableDiv.offsetWidth;
|
||
const maxY = window.innerHeight - draggableDiv.offsetHeight;
|
||
x = Math.min(Math.max(0, x), maxX);
|
||
y = Math.min(Math.max(0, y), maxY);
|
||
draggableDiv.style.left = x + 'px';
|
||
draggableDiv.style.top = y + 'px';
|
||
}
|
||
}
|
||
|
||
function stopDragging() {
|
||
isDragging = false;
|
||
}
|
||
|
||
draggableDiv.addEventListener('touchstart', startDragging, { passive: false });
|
||
draggableDiv.addEventListener('touchmove', moveElement, { passive: false });
|
||
draggableDiv.addEventListener('touchend', stopDragging);
|
||
}
|
||
|
||
// 根据设备类型调用不同的可拖动函数
|
||
function makeElementDraggable(elementId) {
|
||
if (isMobile()) {
|
||
makeElementDraggableOnMobile(elementId);
|
||
} else {
|
||
makeElementDraggableOnDesktop(elementId);
|
||
}
|
||
}
|
||
//获取屏幕媒体流
|
||
function getScreenStream(callback) {
|
||
if (navigator.mediaDevices && navigator.mediaDevices.getDisplayMedia) {
|
||
// 桌面浏览器,使用 getDisplayMedia() 获取屏幕视频流
|
||
navigator.mediaDevices.getDisplayMedia({ video: true })
|
||
.then((stream) => {
|
||
callback(stream);
|
||
})
|
||
.catch((error) => {
|
||
console.error('Error: ' + error);
|
||
});
|
||
} else if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
||
// 移动设备或不支持 getDisplayMedia() 的桌面浏览器,使用 getUserMedia() 获取屏幕视频流
|
||
navigator.mediaDevices.getUserMedia({ video: { mediaSource: 'screen' } })
|
||
.then((stream) => {
|
||
callback(stream);
|
||
})
|
||
.catch((error) => {
|
||
console.error('Error: ' + error);
|
||
});
|
||
} else {
|
||
console.error('Error: getUserMedia not supported on this browser.');
|
||
}
|
||
}
|
||
//根据多个分隔字符,分隔字符串为数组
|
||
function splitString(inputString, separator) {
|
||
// 创建正则表达式,匹配传递的多个分隔符
|
||
const regEx = new RegExp(`[${separator}]`, 'g');
|
||
|
||
// 使用 split() 方法将字符串分割成数组
|
||
const result = inputString.split(regEx);
|
||
|
||
// 返回分割后的数组
|
||
return result;
|
||
}
|
||
//循环数组,并且修改数组中的元素
|
||
function foreachArray(arr, callback) {
|
||
// 遍历数组,执行回调函数修改元素
|
||
for (var i = 0; i < arr.length; i++) {
|
||
arr[i] = callback(arr[i]);
|
||
}
|
||
|
||
// 返回修改后的数组
|
||
return arr;
|
||
}
|
||
function myBrowser(userAgent) {
|
||
|
||
var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
|
||
|
||
var isQQ = userAgent.indexOf("QQBrowser") > -1; //判断是否QQBrowser浏览器
|
||
|
||
|
||
|
||
var isIE = userAgent.indexOf("compatible") > -1
|
||
&& userAgent.indexOf("MSIE") > -1; //判断是否IE7~IE10浏览器
|
||
|
||
var isIE11 = userAgent.indexOf("compatible") === -1
|
||
&& userAgent.indexOf("Trident") > -1; //判断是否IE11浏览器
|
||
|
||
var isEdge = userAgent.indexOf("Edg") > -1; //判断是否IE的Edge浏览器
|
||
|
||
var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
|
||
|
||
var isSafari = userAgent.indexOf("Safari") > -1
|
||
&& userAgent.indexOf("Mac") > -1; //判断是否Safari浏览器
|
||
|
||
var isChrome = userAgent.indexOf("Chrome") > -1
|
||
&& userAgent.indexOf("; Win") > -1
|
||
&& userAgent.indexOf("Safari") > -1; //判断Chrome浏览器
|
||
|
||
var is360 = userAgent.indexOf("Chrome") > -1
|
||
&& userAgent.indexOf("; WOW") > -1
|
||
&& userAgent.indexOf("Safari") > -1; //判断360浏览器
|
||
|
||
var isMobile=userAgent.indexOf("Mobile") > -1;
|
||
var isWechat=/MicroMessenger/i.test(userAgent);
|
||
var isMi=userAgent.indexOf("Mobile") > -1 && /Mi|MiuiBrowser/i.test(userAgent);
|
||
var isHuawei=userAgent.indexOf("Mobile") > -1 && /huawei/i.test(userAgent);
|
||
var isSamsung=userAgent.indexOf("Mobile") > -1 && /SM/i.test(userAgent);
|
||
var isOPPO =userAgent.indexOf("Mobile") > -1 && /pclm|OPM|HeyTapBrowser/i.test(userAgent);
|
||
var isVivo=userAgent.indexOf("Mobile") > -1 && /Vivo/i.test(userAgent);
|
||
var isBaidu=userAgent.indexOf("Mobile") > -1 && /Baidu/i.test(userAgent);
|
||
var isUC = /UcBrowser/i.test(userAgent); //判断是否UC浏览器
|
||
|
||
if (isIE) {
|
||
var reIE = /MSIE (\d+)\.\d+;/;
|
||
// match() 返回一个数组。数组第一项是匹配到的所有文本;数组第二项是正则中小括号匹配到的文本
|
||
var matchReg = userAgent.match(reIE)
|
||
var fIEVersion = matchReg[1];
|
||
if (fIEVersion == 7) {
|
||
return "IE7及其以下";
|
||
} else if (fIEVersion == 8) {
|
||
return "IE8";
|
||
} else if (fIEVersion == 9) {
|
||
return "IE9";
|
||
} else if (fIEVersion == 10) {
|
||
return "IE10";
|
||
} else {
|
||
return "0";
|
||
}//IE版本过低
|
||
return "IE";
|
||
}
|
||
if (isWechat) return "Wechat";
|
||
if (is360) return "360";
|
||
if(isMi) return "XiaoMi";
|
||
if(isHuawei) return "Huawei";
|
||
if (isUC) return "UcBrowser";
|
||
if (isQQ) return "QQBrowser";
|
||
if (isIE11) return "IE11";
|
||
if (isSamsung) return "SamsungBrowser";
|
||
if (isOPPO) return "OPPO";
|
||
if (isVivo) return "Vivo";
|
||
if (isBaidu) return "Baidu";
|
||
if (isEdge) {
|
||
return "Edge";
|
||
}
|
||
if (isFF) {
|
||
return "Firefox";
|
||
}
|
||
if (isSafari) {
|
||
return "Safari";
|
||
}
|
||
if (isChrome) {
|
||
return "Chrome";
|
||
}
|
||
if (isOpera) {
|
||
return "Opera";
|
||
}
|
||
if(isMobile){
|
||
return "Mobile";
|
||
}
|
||
}
|
||
function makeResizable(className,callback) {
|
||
var isResizing = false;
|
||
var lastY = 0;
|
||
$(document).on('mouseover', '.' + className, function(e) {
|
||
var $resizableDiv = $('.' + className);
|
||
var topOffset = $resizableDiv.offset().top;
|
||
var mouseY = e.clientY;
|
||
|
||
if (mouseY >= topOffset && mouseY <= topOffset + 80) { // 只在鼠标位于上边框20像素范围内时允许拖动
|
||
$resizableDiv.addClass('resizing');
|
||
}else{
|
||
$resizableDiv.removeClass('resizing');
|
||
}
|
||
});
|
||
$(document).on('mousedown', '.' + className, function(e) {
|
||
var $resizableDiv = $('.' + className);
|
||
var topOffset = $resizableDiv.offset().top;
|
||
var mouseY = e.clientY;
|
||
|
||
if (mouseY >= topOffset && mouseY <= topOffset + 80) { // 只在鼠标位于上边框20像素范围内时允许拖动
|
||
isResizing = true;
|
||
lastY = e.clientY;
|
||
$('body').addClass('resizing');
|
||
}
|
||
});
|
||
|
||
$(document).on('mousemove', function(e) {
|
||
if (!isResizing) return;
|
||
|
||
var deltaY = lastY - e.clientY; // 计算鼠标移动的垂直距离
|
||
var $resizableDiv = $('.' + className);
|
||
var newHeight = $resizableDiv.height() + deltaY;
|
||
if(newHeight<150){
|
||
newHeight=150;
|
||
}
|
||
$resizableDiv.height(newHeight);
|
||
lastY = e.clientY;
|
||
callback();
|
||
});
|
||
|
||
$(document).on('mouseup', function() {
|
||
isResizing = false;
|
||
$('body').removeClass('resizing');
|
||
});
|
||
$(document).on('mouseleave', '.' + className, function(e) {
|
||
isResizing = false;
|
||
$('.' + className).removeClass('resizing');
|
||
});
|
||
}
|
||
function getOsImg(osName) {
|
||
let imgUrl="";
|
||
if(osName=="Windows"){
|
||
imgUrl="<span><img style='width: 13px;margin-right: 5px' src='/static/images/ua/windows11.svg' </span>";
|
||
}else if(osName=="Linux"){
|
||
imgUrl="<span><img style='width: 13px;margin-right: 5px' src='/static/images/ua/linux.svg' </span>";
|
||
}else if(osName=="Mac OS"){
|
||
imgUrl="<span><img style='width: 13px;margin-right: 5px' src='/static/images/ua/mac.svg' </span>";
|
||
}else if(osName=="iOS"){
|
||
imgUrl="<span><img style='width: 15px;margin-right: 5px' src='/static/images/ua/iphone.svg' </span>";
|
||
}else if(osName=="Android"||osName=="android"){
|
||
imgUrl="<span><img style='width: 14px;margin-right: 5px' src='/static/images/ua/android.svg' </span>";
|
||
}
|
||
return imgUrl+osName;
|
||
}
|
||
function getBrowerImg(name) {
|
||
let imgUrl="";
|
||
if(name=="Safari"){
|
||
imgUrl="<span><img style='width: 14px;margin-right: 5px' src='/static/images/ua/safari.svg' </span>";
|
||
}else if(name=="Firefox"){
|
||
imgUrl="<span><img style='width: 13px;margin-right: 5px' src='/static/images/ua/firefox.svg' </span>";
|
||
}else if(name=="Chrome") {
|
||
imgUrl = "<span><img style='width: 13px;margin-right: 5px' src='/static/images/ua/chrome.svg' </span>";
|
||
}else if(name=="Edge"){
|
||
imgUrl="<span><img style='width: 13px;margin-right: 5px' src='/static/images/ua/edge.svg' </span>";
|
||
}else{
|
||
imgUrl="<span><img style='width: 14px;margin-right: 5px' src='/static/images/ua/defaultbrowser.svg' </span>";
|
||
}
|
||
return imgUrl+name;
|
||
}
|
||
//55Sy5pa5OuS4iua1t+iEieiBlOenkeaKgOaciemZkOWFrOWPuArnurPnqI7nmbvorrDlj7c6OTEzMTAxMTRNQTFHV0UzVzdFCuiBlOezu+WcsOWdgDrkuIrmtbfluILlmInlrprljLrph5HmspnmsZ/ot68zMTMx5Y+3MuW5okoK55S16K+d5Y+356CBOjAyMS02MjQxNTI1Ng==
|
||
; |