new
This commit is contained in:
@@ -0,0 +1,853 @@
|
||||
/**
|
||||
* Created by Yuri2 on 2016/12/9.
|
||||
* Updated on 2018/3/30.
|
||||
*/
|
||||
|
||||
|
||||
|
||||
//原型丰富
|
||||
|
||||
Date.prototype.format = function (fmt) { //author: meizz
|
||||
if (!fmt) {
|
||||
fmt = 'yyyy-MM-dd hh:mm:ss';
|
||||
}
|
||||
var o = {
|
||||
"M+": this.getMonth() + 1, //月份
|
||||
"d+": this.getDate(), //日
|
||||
"h+": this.getHours(), //小时
|
||||
"m+": this.getMinutes(), //分
|
||||
"s+": this.getSeconds(), //秒
|
||||
"q+": Math.floor((this.getMonth() + 3) / 3), //季度
|
||||
"S": this.getMilliseconds() //毫秒
|
||||
};
|
||||
if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
|
||||
for (var k in o)
|
||||
if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
|
||||
return fmt;
|
||||
};
|
||||
|
||||
Array.unique = function (arr) {
|
||||
var newArray = [];
|
||||
var oldArray = arr;
|
||||
if (oldArray.length <= 1) {
|
||||
return oldArray;
|
||||
}
|
||||
for (var i = 0; oldArray.length > 0; i++) {
|
||||
//要一直把oldArray pop完为止.所以长度会一直变短。所以不能用i < oldArray.length的形式来判断是否完成.
|
||||
newArray.push(oldArray.shift()); //oldArray从最前面开始移出数组元素,这样新数组的顺序不会变。
|
||||
for (var j = 0; j < oldArray.length; j++) {
|
||||
if (newArray[i] === oldArray[j]) {
|
||||
oldArray.splice(j, 1);//删除重复的元素
|
||||
j--;
|
||||
}
|
||||
}
|
||||
}
|
||||
return newArray;
|
||||
};
|
||||
|
||||
Array.in_array = function (needle, arrayToSearch) {
|
||||
for (s = 0; s < arrayToSearch.length; s++) {
|
||||
thisEntry = arrayToSearch[s].toString();
|
||||
if (thisEntry === needle) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
/**
|
||||
*
|
||||
* Base64 encode / decode
|
||||
*
|
||||
* @author haitao.tu
|
||||
* @date 2010-04-26
|
||||
* @email tuhaitao@foxmail.com
|
||||
*
|
||||
*/
|
||||
function Base64() {
|
||||
|
||||
// private property
|
||||
_keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
|
||||
// public method for encoding
|
||||
this.encode = function (input) {
|
||||
var output = "";
|
||||
var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
|
||||
var i = 0;
|
||||
input = _utf8_encode(input);
|
||||
while (i < input.length) {
|
||||
chr1 = input.charCodeAt(i++);
|
||||
chr2 = input.charCodeAt(i++);
|
||||
chr3 = input.charCodeAt(i++);
|
||||
enc1 = chr1 >> 2;
|
||||
enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
|
||||
enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
|
||||
enc4 = chr3 & 63;
|
||||
if (isNaN(chr2)) {
|
||||
enc3 = enc4 = 64;
|
||||
} else if (isNaN(chr3)) {
|
||||
enc4 = 64;
|
||||
}
|
||||
output = output +
|
||||
_keyStr.charAt(enc1) + _keyStr.charAt(enc2) +
|
||||
_keyStr.charAt(enc3) + _keyStr.charAt(enc4);
|
||||
}
|
||||
return output;
|
||||
};
|
||||
|
||||
// public method for decoding
|
||||
this.decode = function (input) {
|
||||
var output = "";
|
||||
var chr1, chr2, chr3;
|
||||
var enc1, enc2, enc3, enc4;
|
||||
var i = 0;
|
||||
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
|
||||
while (i < input.length) {
|
||||
enc1 = _keyStr.indexOf(input.charAt(i++));
|
||||
enc2 = _keyStr.indexOf(input.charAt(i++));
|
||||
enc3 = _keyStr.indexOf(input.charAt(i++));
|
||||
enc4 = _keyStr.indexOf(input.charAt(i++));
|
||||
chr1 = (enc1 << 2) | (enc2 >> 4);
|
||||
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
|
||||
chr3 = ((enc3 & 3) << 6) | enc4;
|
||||
output = output + String.fromCharCode(chr1);
|
||||
if (enc3 !== 64) {
|
||||
output = output + String.fromCharCode(chr2);
|
||||
}
|
||||
if (enc4 !== 64) {
|
||||
output = output + String.fromCharCode(chr3);
|
||||
}
|
||||
}
|
||||
output = _utf8_decode(output);
|
||||
return output;
|
||||
};
|
||||
|
||||
// private method for UTF-8 encoding
|
||||
_utf8_encode = function (string) {
|
||||
string = string.replace(/\r\n/g, "\n");
|
||||
var utftext = "";
|
||||
for (var n = 0; n < string.length; n++) {
|
||||
var c = string.charCodeAt(n);
|
||||
if (c < 128) {
|
||||
utftext += String.fromCharCode(c);
|
||||
} else if ((c > 127) && (c < 2048)) {
|
||||
utftext += String.fromCharCode((c >> 6) | 192);
|
||||
utftext += String.fromCharCode((c & 63) | 128);
|
||||
} else {
|
||||
utftext += String.fromCharCode((c >> 12) | 224);
|
||||
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
|
||||
utftext += String.fromCharCode((c & 63) | 128);
|
||||
}
|
||||
|
||||
}
|
||||
return utftext;
|
||||
};
|
||||
|
||||
// private method for UTF-8 decoding
|
||||
_utf8_decode = function (utftext) {
|
||||
var string = "";
|
||||
var i = 0;
|
||||
var c = c1 = c2 = 0;
|
||||
while (i < utftext.length) {
|
||||
c = utftext.charCodeAt(i);
|
||||
if (c < 128) {
|
||||
string += String.fromCharCode(c);
|
||||
i++;
|
||||
} else if ((c > 191) && (c < 224)) {
|
||||
c2 = utftext.charCodeAt(i + 1);
|
||||
string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
|
||||
i += 2;
|
||||
} else {
|
||||
c2 = utftext.charCodeAt(i + 1);
|
||||
c3 = utftext.charCodeAt(i + 2);
|
||||
string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
|
||||
i += 3;
|
||||
}
|
||||
}
|
||||
return string;
|
||||
}
|
||||
}
|
||||
|
||||
/** 事件 */
|
||||
var Event = {
|
||||
// 通过on接口监听事件eventName
|
||||
// 如果事件eventName被触发,则执行callback回调函数
|
||||
on: function (eventName, callback) {
|
||||
//你的代码
|
||||
if (!this.handles) {
|
||||
//this.handles={};
|
||||
Object.defineProperty(this, "handles", {
|
||||
value: {},
|
||||
enumerable: false,
|
||||
configurable: true,
|
||||
writable: true
|
||||
})
|
||||
}
|
||||
|
||||
if (!this.handles[eventName]) {
|
||||
this.handles[eventName] = [];
|
||||
}
|
||||
this.handles[eventName].push(callback);
|
||||
},
|
||||
// 触发事件 eventName
|
||||
emit: function (eventName) {
|
||||
//你的代码
|
||||
if (this.handles[arguments[0]]) {
|
||||
for (var i = 0; i < this.handles[arguments[0]].length; i++) {
|
||||
this.handles[arguments[0]][i](arguments[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
//Yuri2 助手
|
||||
var Yuri2 = {
|
||||
log: function (content) {
|
||||
if (console && typeof (console.log) === 'function') {
|
||||
console.log(content)
|
||||
}
|
||||
},
|
||||
f5: function () {
|
||||
location.reload()
|
||||
},
|
||||
getArrayKeys: function (myhash) {
|
||||
var keys = [];
|
||||
for (key in myhash) {
|
||||
keys.push(key);
|
||||
}
|
||||
return keys;
|
||||
},
|
||||
submitForm: function (action, params) {
|
||||
var form = $("<form></form>");
|
||||
form.attr('action', action);
|
||||
form.attr('method', 'post');
|
||||
form.attr('target', '_self');
|
||||
for (param in params) {
|
||||
var input1 = $("<input type='hidden' name='" + param + "' />");
|
||||
input1.val(params[param]);
|
||||
form.append(input1);
|
||||
}
|
||||
form.appendTo("body");
|
||||
form.css('display', 'none');
|
||||
form.submit();
|
||||
},
|
||||
formValidator: function (data) {
|
||||
function check(e) {
|
||||
var reg = $(e)[0].gear_reg;
|
||||
var preg_rel = reg.test($(e).val());
|
||||
if (preg_rel) {
|
||||
$(e).css('color', 'green');
|
||||
$(e).css('border-color', 'rgba(80, 212, 84, 0.9)');
|
||||
$(e).removeClass('gear-valid-failed');
|
||||
} else {
|
||||
$(e).css('color', 'red');
|
||||
$(e).css('border-color', 'rgba(239, 104, 104, 0.51)');
|
||||
$(e).addClass('gear-valid-failed');
|
||||
}
|
||||
}
|
||||
|
||||
for (field in data.fields) {
|
||||
var ipt = $(data.form + " input[name='" + field + "']");
|
||||
if (ipt.length === 0) {
|
||||
ipt = $(data.form + " select[name='" + field + "']")
|
||||
}
|
||||
if (ipt.length === 0) {
|
||||
ipt = $(data.form + " textarea[name='" + field + "']")
|
||||
}
|
||||
ipt[0].gear_reg = data.fields[field];
|
||||
ipt.bind('input propertychange change', function () {
|
||||
check(this)
|
||||
});
|
||||
check(ipt)
|
||||
}
|
||||
$(data.form).submit(function () {
|
||||
var valid_fails = $(this).find('.gear-valid-failed');
|
||||
var errors = valid_fails.length;
|
||||
if (errors > 0) {
|
||||
alert('验证失败,请检查输入。\r\nValidation failed, please check the input.');
|
||||
return false;
|
||||
}
|
||||
})
|
||||
},
|
||||
timestampToDate: function (timestamp, format) {
|
||||
format = format ? format : 'yyyy-MM-dd hh:mm:ss';
|
||||
var newDate = new Date();
|
||||
newDate.setTime(timestamp * 1000);
|
||||
return (newDate.format(format));
|
||||
},
|
||||
isPC: function () {
|
||||
var userAgentInfo = navigator.userAgent;
|
||||
var Agents = ["Android", "iPhone",
|
||||
"SymbianOS", "Windows Phone",
|
||||
"iPad", "iPod"];
|
||||
var flag = true;
|
||||
for (var v = 0; v < Agents.length; v++) {
|
||||
if (userAgentInfo.indexOf(Agents[v]) > 0) {
|
||||
flag = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return flag;
|
||||
},
|
||||
isSmallScreen: function (size) {
|
||||
if (!size) {
|
||||
size = 768
|
||||
}
|
||||
var width = document.body.clientWidth;
|
||||
return width < size;
|
||||
},
|
||||
clone: function (obj) {
|
||||
var o;
|
||||
if (typeof obj === "object") {
|
||||
if (obj === null) {
|
||||
o = null;
|
||||
} else {
|
||||
if (obj instanceof Array) {
|
||||
o = [];
|
||||
for (var i = 0, len = obj.length; i < len; i++) {
|
||||
o.push(Yuri2.clone(obj[i]));
|
||||
}
|
||||
} else {
|
||||
o = {};
|
||||
for (var j in obj) {
|
||||
o[j] = Yuri2.clone(obj[j]);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
o = obj;
|
||||
}
|
||||
return o;
|
||||
},
|
||||
isSet: function (v) {
|
||||
{
|
||||
return !((typeof (v) === 'undefined') || (v === null));
|
||||
}
|
||||
},
|
||||
/** @deprecated */
|
||||
in_array: function (stringToSearch, arrayToSearch) {
|
||||
for (s = 0; s < arrayToSearch.length; s++) {
|
||||
thisEntry = arrayToSearch[s].toString();
|
||||
if (thisEntry === stringToSearch) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
},
|
||||
isArray: function (o) {
|
||||
return Object.prototype.toString.call(o) === '[object Array]';
|
||||
},
|
||||
/**
|
||||
* 合并两个json对象属性为一个对象
|
||||
* @param jsonObject1
|
||||
* @param jsonObject2
|
||||
* @param recursion (remain default)
|
||||
* @returns object resultJsonObject
|
||||
*/
|
||||
jsonMerge: function (jsonObject1, jsonObject2, recursion) {
|
||||
var resultJsonObject = {};
|
||||
for (var attr in jsonObject1) {
|
||||
resultJsonObject[attr] = jsonObject1[attr];
|
||||
}
|
||||
for (var attr in jsonObject2) {
|
||||
resultJsonObject[attr] =
|
||||
recursion === true &&
|
||||
!this.isArray(resultJsonObject[attr]) &&
|
||||
!this.isArray(jsonObject2[attr]) &&
|
||||
recursion === true &&
|
||||
typeof (resultJsonObject[attr]) === 'object' &&
|
||||
typeof (jsonObject2[attr]) === 'object' ?
|
||||
Yuri2.jsonMerge(resultJsonObject[attr], jsonObject2[attr], false) : jsonObject2[attr];
|
||||
}
|
||||
return resultJsonObject;
|
||||
},
|
||||
randInt: function (n, m) {
|
||||
var c = m - n + 1;
|
||||
return Math.floor(Math.random() * c + n);
|
||||
},
|
||||
shuffle: function (arr) {
|
||||
var i,
|
||||
j,
|
||||
temp;
|
||||
for (i = arr.length - 1; i > 0; i--) {
|
||||
j = Math.floor(Math.random() * (i + 1));
|
||||
temp = arr[i];
|
||||
arr[i] = arr[j];
|
||||
arr[j] = temp;
|
||||
}
|
||||
return arr;
|
||||
},
|
||||
htmlspecialchars: function (str) {
|
||||
str = str.replace(/&/g, '&');
|
||||
str = str.replace(/</g, '<');
|
||||
str = str.replace(/>/g, '>');
|
||||
str = str.replace(/"/g, '"');
|
||||
str = str.replace(/'/g, ''');
|
||||
return str;
|
||||
},
|
||||
htmlspecialchars_decode: function (str) {
|
||||
str = str.replace(/&/g, '&');
|
||||
str = str.replace(/</g, '<');
|
||||
str = str.replace(/>/g, '>');
|
||||
str = str.replace(/"/g, "''");
|
||||
str = str.replace(/'/g, "'");
|
||||
return str;
|
||||
},
|
||||
textOverFlow: function (str, len) {
|
||||
return str.length > len ? str.substring(0, len) + "..." : str;
|
||||
},
|
||||
getLang: function () {
|
||||
return (navigator.language || navigator.browserLanguage).toLowerCase();
|
||||
//通常是 zh-cn
|
||||
},
|
||||
iframeOnClick: {
|
||||
resolution: 200,
|
||||
iframes: [],
|
||||
interval: null,
|
||||
Iframe: function () {
|
||||
this.element = arguments[0];
|
||||
this.cb = arguments[1];
|
||||
this.hasTracked = false;
|
||||
},
|
||||
track: function (element, cb) {
|
||||
this.iframes.push(new this.Iframe(element, cb));
|
||||
if (!this.interval) {
|
||||
var _this = this;
|
||||
this.interval = setInterval(function () {
|
||||
_this.checkClick();
|
||||
}, this.resolution);
|
||||
}
|
||||
},
|
||||
checkClick: function () {
|
||||
if (document.activeElement) {
|
||||
var activeElement = document.activeElement;
|
||||
for (var i in this.iframes) {
|
||||
if (activeElement === this.iframes[i].element) { // user is in this Iframe
|
||||
if (this.iframes[i].hasTracked === false) {
|
||||
this.iframes[i].cb.apply(window, []);
|
||||
this.iframes[i].hasTracked = true;
|
||||
}
|
||||
} else {
|
||||
this.iframes[i].hasTracked = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
loadScript: function (url, callback) {
|
||||
var script = document.createElement("script");
|
||||
script.type = "text/javascript";
|
||||
if (typeof(callback) !== "undefined") {
|
||||
if (script.readyState) {
|
||||
script.onreadystatechange = function () {
|
||||
if (script.readyState === "loaded" || script.readyState === "complete") {
|
||||
script.onreadystatechange = null;
|
||||
callback(script);
|
||||
}
|
||||
};
|
||||
} else {
|
||||
script.onload = function () {
|
||||
callback(script);
|
||||
};
|
||||
}
|
||||
}
|
||||
script.src = url;
|
||||
document.head.appendChild(script);
|
||||
},
|
||||
/**
|
||||
* jsonp 请求
|
||||
* @param url string
|
||||
* @param data json
|
||||
* @param callback callback
|
||||
* @param name_data string
|
||||
* @param name_callback string
|
||||
* */
|
||||
jsonp: function (url, data, callback, name_data, name_callback) {
|
||||
name_data || (name_data = 'data');
|
||||
name_callback || (name_callback = 'callback');
|
||||
var func_name = Math.random();
|
||||
if (!Yuri2.jsonp_funcs) {
|
||||
Yuri2.jsonp_funcs = {};
|
||||
}
|
||||
Yuri2.jsonp_funcs[func_name] = callback;
|
||||
var rel = '';
|
||||
rel += url;
|
||||
if (url.indexOf('?') < 0) {
|
||||
rel += '?';
|
||||
}
|
||||
if (url.indexOf('&') > 0) {
|
||||
rel += '&';
|
||||
}
|
||||
rel += name_callback + '=' + encodeURIComponent('Yuri2.jsonp_funcs["' + func_name + '"]');
|
||||
if (data) {
|
||||
var data_str = JSON.stringify(data);
|
||||
data_str = encodeURIComponent(data_str);
|
||||
rel += '&' + name_data + '=' + data_str;
|
||||
}
|
||||
Yuri2.loadScript(rel, function (script) {
|
||||
script.parentNode.removeChild(script);
|
||||
})
|
||||
|
||||
},
|
||||
heredoc: function (fn) {
|
||||
//var tmpl = heredoc(function(){/* abcdefg */}) 可以优雅的解决多行文本问题
|
||||
return fn.toString().split('\n').slice(1, -1).join('\n') + '\n'
|
||||
},
|
||||
getClientSize: function () {
|
||||
var clientHeight = document.body.clientHeight;
|
||||
var clientWidth = document.body.clientWidth;
|
||||
return {
|
||||
width: clientWidth,
|
||||
height: clientHeight,
|
||||
};
|
||||
},
|
||||
wait: function (condition, callback) {
|
||||
var itv = setInterval(function () {
|
||||
if (condition) {
|
||||
clearInterval(itv);
|
||||
callback();
|
||||
}
|
||||
}, 100)
|
||||
},
|
||||
jsonDeepCopy: function (obj) {
|
||||
return JSON.parse(JSON.stringify(obj));
|
||||
},
|
||||
jsonFormat: function (json) {
|
||||
if (typeof json !== 'object') {
|
||||
json = JSON.parse(json);
|
||||
}
|
||||
var formatted = JSON.stringify(json, null, 4);
|
||||
return formatted;
|
||||
},
|
||||
//保存文本文件
|
||||
saveAs: (function (view) {
|
||||
"use strict";
|
||||
// IE <10 is explicitly unsupported
|
||||
if (typeof view === "undefined" || typeof navigator !== "undefined" && /MSIE [1-9]\./.test(navigator.userAgent)) {
|
||||
return;
|
||||
}
|
||||
var
|
||||
doc = view.document
|
||||
// only get URL when necessary in case Blob.js hasn't overridden it yet
|
||||
, get_URL = function () {
|
||||
return view.URL || view.webkitURL || view;
|
||||
}
|
||||
, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")
|
||||
, can_use_save_link = "download" in save_link
|
||||
, click = function (node) {
|
||||
var event = new MouseEvent("click");
|
||||
node.dispatchEvent(event);
|
||||
}
|
||||
, is_safari = /constructor/i.test(view.HTMLElement) || view.safari
|
||||
, is_chrome_ios = /CriOS\/[\d]+/.test(navigator.userAgent)
|
||||
, throw_outside = function (ex) {
|
||||
(view.setImmediate || view.setTimeout)(function () {
|
||||
throw ex;
|
||||
}, 0);
|
||||
}
|
||||
, force_saveable_type = "application/octet-stream"
|
||||
// the Blob API is fundamentally broken as there is no "downloadfinished" event to subscribe to
|
||||
, arbitrary_revoke_timeout = 1000 * 40 // in ms
|
||||
, revoke = function (file) {
|
||||
var revoker = function () {
|
||||
if (typeof file === "string") { // file is an object URL
|
||||
get_URL().revokeObjectURL(file);
|
||||
} else { // file is a File
|
||||
file.remove();
|
||||
}
|
||||
};
|
||||
setTimeout(revoker, arbitrary_revoke_timeout);
|
||||
}
|
||||
, dispatch = function (filesaver, event_types, event) {
|
||||
event_types = [].concat(event_types);
|
||||
var i = event_types.length;
|
||||
while (i--) {
|
||||
var listener = filesaver["on" + event_types[i]];
|
||||
if (typeof listener === "function") {
|
||||
try {
|
||||
listener.call(filesaver, event || filesaver);
|
||||
} catch (ex) {
|
||||
throw_outside(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
, auto_bom = function (blob) {
|
||||
// prepend BOM for UTF-8 XML and text/* types (including HTML)
|
||||
// note: your browser will automatically convert UTF-16 U+FEFF to EF BB BF
|
||||
if (/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(blob.type)) {
|
||||
return new Blob([String.fromCharCode(0xFEFF), blob], { type: blob.type });
|
||||
}
|
||||
return blob;
|
||||
}
|
||||
, FileSaver = function (blob, name, no_auto_bom) {
|
||||
if (!no_auto_bom) {
|
||||
blob = auto_bom(blob);
|
||||
}
|
||||
// First try a.download, then web filesystem, then object URLs
|
||||
var
|
||||
filesaver = this
|
||||
, type = blob.type
|
||||
, force = type === force_saveable_type
|
||||
, object_url
|
||||
, dispatch_all = function () {
|
||||
dispatch(filesaver, "writestart progress write writeend".split(" "));
|
||||
}
|
||||
// on any filesys errors revert to saving with object URLs
|
||||
, fs_error = function () {
|
||||
if ((is_chrome_ios || (force && is_safari)) && view.FileReader) {
|
||||
// Safari doesn't allow downloading of blob urls
|
||||
var reader = new FileReader();
|
||||
reader.onloadend = function () {
|
||||
var url = is_chrome_ios ? reader.result : reader.result.replace(/^data:[^;]*;/, 'data:attachment/file;');
|
||||
var popup = view.open(url, '_blank');
|
||||
if (!popup) view.location.href = url;
|
||||
url = undefined; // release reference before dispatching
|
||||
filesaver.readyState = filesaver.DONE;
|
||||
dispatch_all();
|
||||
};
|
||||
reader.readAsDataURL(blob);
|
||||
filesaver.readyState = filesaver.INIT;
|
||||
return;
|
||||
}
|
||||
// don't create more object URLs than needed
|
||||
if (!object_url) {
|
||||
object_url = get_URL().createObjectURL(blob);
|
||||
}
|
||||
if (force) {
|
||||
view.location.href = object_url;
|
||||
} else {
|
||||
var opened = view.open(object_url, "_blank");
|
||||
if (!opened) {
|
||||
// Apple does not allow window.open, see https://developer.apple.com/library/safari/documentation/Tools/Conceptual/SafariExtensionGuide/WorkingwithWindowsandTabs/WorkingwithWindowsandTabs.html
|
||||
view.location.href = object_url;
|
||||
}
|
||||
}
|
||||
filesaver.readyState = filesaver.DONE;
|
||||
dispatch_all();
|
||||
revoke(object_url);
|
||||
}
|
||||
;
|
||||
filesaver.readyState = filesaver.INIT;
|
||||
|
||||
if (can_use_save_link) {
|
||||
object_url = get_URL().createObjectURL(blob);
|
||||
setTimeout(function () {
|
||||
save_link.href = object_url;
|
||||
save_link.download = name;
|
||||
click(save_link);
|
||||
dispatch_all();
|
||||
revoke(object_url);
|
||||
filesaver.readyState = filesaver.DONE;
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
fs_error();
|
||||
}
|
||||
, FS_proto = FileSaver.prototype
|
||||
, saveAs = function (blob, name, no_auto_bom) {
|
||||
return new FileSaver(blob, name || blob.name || "download", no_auto_bom);
|
||||
}
|
||||
;
|
||||
// IE 10+ (native saveAs)
|
||||
if (typeof navigator !== "undefined" && navigator.msSaveOrOpenBlob) {
|
||||
return function (blob, name, no_auto_bom) {
|
||||
name = name || blob.name || "download";
|
||||
|
||||
if (!no_auto_bom) {
|
||||
blob = auto_bom(blob);
|
||||
}
|
||||
return navigator.msSaveOrOpenBlob(blob, name);
|
||||
};
|
||||
}
|
||||
|
||||
FS_proto.abort = function () {
|
||||
};
|
||||
FS_proto.readyState = FS_proto.INIT = 0;
|
||||
FS_proto.WRITING = 1;
|
||||
FS_proto.DONE = 2;
|
||||
|
||||
FS_proto.error =
|
||||
FS_proto.onwritestart =
|
||||
FS_proto.onprogress =
|
||||
FS_proto.onwrite =
|
||||
FS_proto.onabort =
|
||||
FS_proto.onerror =
|
||||
FS_proto.onwriteend =
|
||||
null;
|
||||
|
||||
return saveAs;
|
||||
}(
|
||||
typeof self !== "undefined" && self
|
||||
|| typeof window !== "undefined" && window
|
||||
|| this.content
|
||||
)),
|
||||
getQueryString: function (name) {
|
||||
var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
|
||||
var r = window.location.search.substr(1).match(reg);
|
||||
if (r != null) return (r[2]);
|
||||
return null;
|
||||
},
|
||||
|
||||
/**
|
||||
*@param {string} url 完整的URL地址
|
||||
*@returns {object} 自定义的对象
|
||||
*@description 用法示例:var myURL = parseURL('http://abc.com:8080/dir/index.html?id=255&m=hello#top');
|
||||
myURL.file='index.html'
|
||||
|
||||
myURL.hash= 'top'
|
||||
|
||||
myURL.host= 'abc.com'
|
||||
|
||||
myURL.query= '?id=255&m=hello'
|
||||
|
||||
myURL.params= Object = { id: 255, m: hello }
|
||||
|
||||
myURL.path= '/dir/index.html'
|
||||
|
||||
myURL.segments= Array = ['dir', 'index.html']
|
||||
|
||||
myURL.port= '8080'
|
||||
|
||||
myURL.protocol= 'http'
|
||||
|
||||
myURL.source= 'http://abc.com:8080/dir/index.html?id=255&m=hello#top'
|
||||
|
||||
*/
|
||||
parseURL: function (url) {
|
||||
url || (url = location.href);
|
||||
var a = document.createElement('a');
|
||||
a.href = url;
|
||||
a.href = a.href; //神奇的代码,借助a标签把相对路径转换为绝对路径
|
||||
return {
|
||||
source: url,
|
||||
protocol: a.protocol.replace(':', ''),
|
||||
host: a.hostname,
|
||||
port: a.port,
|
||||
query: a.search,
|
||||
params: (function () {
|
||||
var ret = {},
|
||||
seg = a.search.replace(/^\?/, '').split('&'),
|
||||
len = seg.length, i = 0, s;
|
||||
for (; i < len; i++) {
|
||||
if (!seg[i]) {
|
||||
continue;
|
||||
}
|
||||
s = seg[i].split('=');
|
||||
ret[s[0]] = s[1];
|
||||
}
|
||||
return ret;
|
||||
})(),
|
||||
file: (a.pathname.match(/\/([^\/?#]+)$/i) || [, ''])[1],
|
||||
hash: a.hash.replace('#', ''),
|
||||
path: a.pathname.replace(/^([^\/])/, '/$1'),
|
||||
relative: (a.href.match(/tps?:\/\/[^\/]+(.+)/) || [, ''])[1],
|
||||
segments: a.pathname.replace(/^\//, '').split('/')
|
||||
};
|
||||
},
|
||||
|
||||
myBrowser: function () {
|
||||
var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
|
||||
if (userAgent.indexOf("Opera") > -1) {
|
||||
return "Opera"
|
||||
}
|
||||
if (userAgent.indexOf("Firefox") > -1) {
|
||||
return "FF";
|
||||
}
|
||||
if (userAgent.indexOf("Chrome") > -1) {
|
||||
return "Chrome";
|
||||
}
|
||||
if (userAgent.indexOf("Safari") > -1) {
|
||||
return "Safari";
|
||||
}
|
||||
if (!!window.ActiveXObject || "ActiveXObject" in window) {
|
||||
return "IE";
|
||||
}
|
||||
},
|
||||
|
||||
isIE: function () {
|
||||
return this.myBrowser() === 'IE';
|
||||
},
|
||||
|
||||
evalObj: function (str) {
|
||||
return eval("(" + str + ")");
|
||||
},
|
||||
loadContentFromUrl: function (url, method, callback, noCache) {
|
||||
if (noCache === undefined) noCache = true;
|
||||
var xmlhttp;
|
||||
if (!method) {
|
||||
method = 'GET';
|
||||
}
|
||||
try {
|
||||
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
|
||||
} catch (e) {
|
||||
try {
|
||||
xmlhttp = new XMLHttpRequest();
|
||||
} catch (e) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
xmlhttp.open(method, url);
|
||||
if (noCache) {
|
||||
xmlhttp.setRequestHeader('Cache-Control', 'max-age=0');
|
||||
}
|
||||
xmlhttp.onreadystatechange = function () {
|
||||
if (xmlhttp.readyState === 4) {
|
||||
if (xmlhttp.status === 200) {
|
||||
callback(null, xmlhttp.responseText);
|
||||
} else {
|
||||
callback(xmlhttp.status, xmlhttp.responseText);
|
||||
}
|
||||
}
|
||||
};
|
||||
try {
|
||||
xmlhttp.send(null);
|
||||
} catch (e) {
|
||||
callback(e, '');
|
||||
}
|
||||
},
|
||||
// 交换数组元素
|
||||
arrSwapItems: function (arr, index1, index2) {
|
||||
arr[index1] = arr.splice(index2, 1, arr[index1])[0];
|
||||
return arr;
|
||||
},
|
||||
|
||||
// 上移
|
||||
arrUpRecord: function (arr, $index) {
|
||||
if ($index === 0) {
|
||||
return;
|
||||
}
|
||||
this.arrSwapItems(arr, $index, $index - 1);
|
||||
},
|
||||
|
||||
// 下移
|
||||
arrDownRecord: function (arr, $index) {
|
||||
if ($index === arr.length - 1) {
|
||||
return;
|
||||
}
|
||||
this.arrSwapItems(arr, $index, $index + 1);
|
||||
},
|
||||
inArray: function (array, needle) {
|
||||
for (var i = 0; i < array.length; i++) {
|
||||
if (needle === array[i]) return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
template: function () {
|
||||
//字符串模板 template('ab${0}de${1}g','C','F')
|
||||
var num = arguments.length;
|
||||
var oStr = arguments[0];
|
||||
for (var i = 1; i < num; i++) {
|
||||
var pattern = "\\$\\{" + (i - 1) + "\\}";
|
||||
var re = new RegExp(pattern, "g");
|
||||
oStr = oStr.replace(re, arguments[i]);
|
||||
}
|
||||
return oStr;
|
||||
},
|
||||
strToDate: function (str) {
|
||||
var arr = t.time.split(/[- : \/]/);
|
||||
return new Date(arr[0], arr[1] - 1, arr[2], arr[3], arr[4], arr[5]);
|
||||
},
|
||||
};
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
YL.export = function () {
|
||||
var rel = {};
|
||||
var vue = YL.vue;
|
||||
rel.configs = YL.util.dataCopy('configs');
|
||||
rel.apps = YL.util.dataCopy('apps');
|
||||
var shortcuts = YL.util.dataCopy('shortcuts');
|
||||
shortcuts.forEach(function (shortcut) {
|
||||
delete shortcut.drag;
|
||||
if (shortcut.children) {
|
||||
shortcut.children.forEach(function (t) {
|
||||
delete t.drag;
|
||||
})
|
||||
}
|
||||
});
|
||||
rel.shortcuts = shortcuts;
|
||||
var tiles = YL.util.dataCopy('tiles');
|
||||
tiles.forEach(function (tileGroup) {
|
||||
tileGroup.data.forEach(function (t) {
|
||||
delete t.moved;
|
||||
})
|
||||
});
|
||||
rel.tiles = tiles;
|
||||
var startMenu = YL.util.dataCopy('startMenu');
|
||||
delete startMenu.open;
|
||||
delete startMenu.sidebar.open;
|
||||
startMenu.sidebar = startMenu.sidebar.btns;
|
||||
var removeMenuAttrOpen = function (item) {
|
||||
delete item.open;
|
||||
if (item.children) {
|
||||
for (var i in item.children) {
|
||||
var child = item.children[i];
|
||||
removeMenuAttrOpen(child);
|
||||
}
|
||||
}
|
||||
};
|
||||
for (var i in startMenu.menu) {
|
||||
var item = startMenu.menu[i];
|
||||
removeMenuAttrOpen(item);
|
||||
}
|
||||
rel.startMenu = startMenu;
|
||||
return rel;
|
||||
};
|
||||
|
||||
//格式化数据为运行时可用
|
||||
YL.format = function (json) {
|
||||
var data = Yuri2.jsonMerge(YL._baseData(), json, true);
|
||||
for (var i in data.apps) {
|
||||
var app = Yuri2.jsonMerge(YL.util.getAppDataTemplate(), data.apps[i]);
|
||||
data.apps[i] = app;
|
||||
}
|
||||
data.shortcuts.forEach(function (shortcut) {
|
||||
shortcut.drag = { mDown: false, left: 0, top: 0, };
|
||||
if (shortcut.children) {
|
||||
shortcut.children.forEach(function (t) {
|
||||
t.drag = { mDown: false, left: 0, top: 0, };
|
||||
})
|
||||
}
|
||||
});
|
||||
data.startMenu.open = false;
|
||||
data.startMenu.sidebar = {
|
||||
btns: data.startMenu.sidebar
|
||||
};
|
||||
data.startMenu.sidebar.open = false;
|
||||
var addMenuAttrOpen = function (item) {
|
||||
item.open = false;
|
||||
if (item.children) {
|
||||
for (var i in item.children) {
|
||||
var child = item.children[i];
|
||||
addMenuAttrOpen(child);
|
||||
}
|
||||
}
|
||||
};
|
||||
for (var i in data.startMenu.menu) {
|
||||
var item = data.startMenu.menu[i];
|
||||
addMenuAttrOpen(item);
|
||||
}
|
||||
return data;
|
||||
};
|
||||
YL.import = function (json) {
|
||||
YL.reset();
|
||||
var data = YL.format(json);
|
||||
var vue = YL.vue;
|
||||
vue.$set(vue, 'apps', data.apps);
|
||||
for (var i in data) {
|
||||
if (i !== 'apps') {
|
||||
vue.$set(vue, i, data[i]);
|
||||
}
|
||||
}
|
||||
vue.initRuntime();
|
||||
};
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,23 @@
|
||||
Vue.component('yl-icon', {
|
||||
template: '#tpl-icon',
|
||||
props: ['icon','drawer','badge','apps','nobg','img'],
|
||||
data:function () {
|
||||
return {
|
||||
icon:{},
|
||||
badge:0,
|
||||
drawer:false,
|
||||
nobg:false,
|
||||
img:'',
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
badgeText: function (content) {
|
||||
//处理badge的提示内容
|
||||
if (isNaN(content)) {
|
||||
return content;
|
||||
} else {
|
||||
return content > 99 ? '99+' : parseInt(content);
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
@@ -0,0 +1,53 @@
|
||||
Vue.component('yl-menu', {
|
||||
template: '#tpl-menu',
|
||||
props: ['menu','apps'],
|
||||
data:function () {
|
||||
return {
|
||||
menu:{},
|
||||
apps:{},
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
onItemClick:function ($event) {
|
||||
this.$emit('itemclick',$event)
|
||||
},
|
||||
onItemContextMenu:function ($event) {
|
||||
this.$emit('itemcontextmenu',$event)
|
||||
},
|
||||
onMainContextMenu:function ($event) {
|
||||
this.$emit('maincontextmenu',$event)}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Vue.component('yl-menu-item', {
|
||||
template: '#tpl-menu-item',
|
||||
props: ['item','apps','open','depth','itemid'],
|
||||
data:function () {
|
||||
return {
|
||||
itemid:null,
|
||||
item:{},
|
||||
apps:{},
|
||||
open:false,
|
||||
depth:0,
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
click:function () {
|
||||
if(this.item.children){
|
||||
this.item.open=!this.item.open
|
||||
}else{
|
||||
this.$emit('itemclick',this.item);
|
||||
}
|
||||
},
|
||||
onContextMenu:function($event){
|
||||
this.$emit('itemcontextmenu',{id:this.itemid,item:this.item,event:$event});
|
||||
},
|
||||
onItemClick:function ($event) {
|
||||
this.$emit('itemclick',$event)
|
||||
},
|
||||
onItemContextMenu:function (data) {
|
||||
this.$emit('itemcontextmenu',data);
|
||||
}
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user