// 匹配正整數
let isPositiveNum = val => {
return /^[1-9]d*$/.test(val);
};
console.log(isPositiveNum(9)) //true
console.log(isPositiveNum(2.2)) //false
複製代碼
// 匹配負整數
let isNegativeNum = val => {
return /^-[1-9]d*$/.test(val);
};
console.log(isNegativeNum(-9)) //true
console.log(isNegativeNum(2.2)) //false
複製代碼
// 匹配整數
let isInteger = val => {
return /^(-|\+)?\d+$/.test(val);
};
console.log(isInteger(-9)) //true
console.log(isInteger(2.2)) //false
複製代碼
// 匹配非負浮點數
let isNotNegativeFloatNum = val => {
return /^\d+(\.\d+)?$/.test(val);
};
console.log(isNotNegativeFloatNum(-9)) //false
console.log(isNotNegativeFloatNum(2.2)) //true
複製代碼
//匹配由 26 個英文字母組成的字符串
let isAZaz = val => {
return /^[A-Za-z]+$/.test(val);
};
console.log(isAZaz('122a')) //false
console.log(isAZaz('abc')) //true
複製代碼
//匹配由 26 個英文字母的大寫組成的字符串
let isAZ = val => {
return /^[A-Z]+$/.test(val);
};
console.log(isAZ('Acs')) //false
console.log(isAZ('ABC')) //true
複製代碼
//匹配由 26 個英文字母的小寫組成的字符串
let isaz = val => {
return /^[a-z]+$/.test(val);
};
console.log(isaz('Acs')) //false
console.log(isaz('abc')) //true
複製代碼
// 匹配電子郵件地址
let isEmailAddress = val => {
return /^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$/.test(val) || /w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*/.test(val);
};
console.log(isEmailAddress('Acs')) //false
console.log(isEmailAddress('133@qq.com')) //true
複製代碼
// arrayMax: 返回數組中的最大值
// 將Math.max()與擴展運算符 (...) 結合使用以獲取數組中的最大值。
let arrayMax = arr => Math.max(...arr);
let arr = [1,2,3,5];
console.log(arrayMax(arr)) //5
複製代碼
// arrayMin: 返回數組中的最小值
// 將Math.min()與擴展運算符 (...) 結合使用以獲取數組中的最小值。
let arrayMin = arr => Math.min(...arr);
let arr = [1, 2, 3, 5];
console.log(arrayMin(arr)) //1
複製代碼
// chunk: 將數組塊劃分爲指定大小的較小數組。
// 使用Array.from()建立新的數組, 這符合將生成的區塊數。使用Array.slice()將新數組的每一個元素映射到size長度的區塊。若是原始數組不能均勻拆分, 則最終的塊將包含剩餘的元素。
let chunk = (arr, size) => Array.from({
length: Math.ceil(arr.length / size)
}, (v, i) => arr.slice(i * size, i * size + size));
let arr = [1, 2, 3, 5];
console.log(chunk(arr,2)) //0: Array [ 1, 2 ],1: Array [ 3, 5 ],
複製代碼
// compact: 從數組中移除 falsey 值。
// 使用Array.filter()篩選出 falsey 值 (false、null、0、""、undefined和NaN).
let compact = arr => arr.filter(Boolean);
let arr = [false,null,0,"",undefined,NaN,1]
console.log(compact(arr)) //[ 1 ]
複製代碼
// countOccurrences: 計算數組中值的出現次數
// 使用Array.reduce()在每次遇到數組中的特定值時遞增計數器。
let countOccurrences = (arr, value) => arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
let arr = [1,2,1,2,3,3,3,3];
console.log(countOccurrences(arr,3))//4
複製代碼
// deepFlatten: 深拼合數組
// 使用遞歸。使用Array.concat()與空數組 ([]) 和跨頁運算符 (...) 來拼合數組。遞歸拼合做爲數組的每一個元素。
let deepFlatten= arr => [].concat(...arr.map(v => Array.isArray(v) ? deepFlatten(v) : v));
let arr = [1, 2, [1, 2, [1, 2, [2, 3]]]];
console.log(deepFlatten(arr)) // [ 1, 2, 1, 2, 1, 2, 2, 3 ]
複製代碼
// difference: 返回兩個數組之間的差別
// 從b建立Set, 而後使用Array.filter() on 只保留a b中不包含的值.
let difference = (a, b) => {
const s = new Set(b);
return a.filter(x => !s.has(x));
};
let arr = [1,2,3];
let arr2 = [2,3,4];
console.log(difference(arr,arr2))//[1]
console.log(difference(arr2,arr))//[4]
複製代碼
// distinctValuesOfArray: 返回數組的全部不一樣值
// 使用 ES6 Set和...rest運算符放棄全部重複的值。
let distinctValuesOfArray = arr => [...new Set(arr)];
let arr = [1, 2, 3, 1, 2];
console.log(distinctValuesOfArray(arr)) // [ 1, 2, 3 ]
複製代碼
// everyNth: 返回數組中的每一個第 n 個元素
// 使用Array.filter()建立一個包含給定數組的每一個第 n 個元素的新數組。
let everyNth = (arr, nth) => arr.filter((e, i) => i % nth === 0);
複製代碼
// filterNonUnique:篩選出數組中的非惟一值
// 對於只包含惟一值的數組, 請使用Array.filter()。
let filterNonUnique = arr => arr.filter(i => arr.indexOf(i) === arr.lastIndexOf(i));
複製代碼
// flatten: 拼合數組
// 使用Array.reduce()獲取數組中的全部元素和concat()以拼合它們
let flatten = arr => arr.reduce((a, v) => a.concat(v), []);
複製代碼
// falttenDepth: 將數組向上拼合到指定深度
// 使用遞歸, 遞減depth, 每層深度爲1。使用Array.reduce()和Array.concat()來合併元素或數組。基本狀況下, 對於等於1的depth中止遞歸。省略第二個元素,depth僅拼合到1的深度 (單個拼合)。
// falttenDepth: (arr, depth = 1) => depth != 1 ? arr.reduce((a, v) => a.concat(Array.isArray(v) ? flattenDepth(v, depth - 1) : v), []) : arr.reduce((a, v) => a.concat(v), []),
複製代碼
// groupby: 根據給定函數對數組元素進行分組
// 使用Array.map()將數組的值映射到函數或屬性名。使用Array.reduce()建立一個對象, 其中的鍵是從映射的結果生成的。
// groupBy: (arr, func) => arr.map(typeof func === 'function' ? func : val => val[func]).reduce((acc, val, i) => { acc[val] = (acc[val] || []).concat(arr[i]); return acc; }, {}),
複製代碼
// head: 返回列表的頭
// 使用arr[0]可返回傳遞的數組的第一個元素。
let head = arr => arr[0];
複製代碼
// initial: 返回除最後一個數組以外的全部元素
// 使用 "arr.slice(0,-1)" 返回數組的最後一個元素。
let initial = arr => arr.slice(0, -1);
複製代碼
// initializeArrayWithRange: 初始化並填充具備指定值的數組
// 使用Array(n)建立所需長度的數組,fill(v)以填充所需的值。能夠省略value以使用默認值0.
let initializeArrayWithRange = (end, start = 0) => Array.from({
length: end - start
}).map((v, i) => i + start);
複製代碼
// initializeArrayWithValues: 初始化並填充具備指定值的數組
// 使用Array(n)建立所需長度的數組,fill(v)以填充所需的值。能夠省略value以使用默認值0
let initializeArrayWithValues = (n, value = 0) => Array(n).fill(value);
複製代碼
// intersection: 返回兩個數組中存在的元素的列表
// 從b建立Set, 而後使用Array.filter()on a只保留b中包含的值.
let intersection = (a, b) => {
const s = new Set(b);
return a.filter(x => s.has(x));
};
複製代碼
// last: 返回數組中的最後一個元素
// 使用arr.length - 1可計算給定數組的最後一個元素的索引並返回它
let last = arr => arr[arr.length - 1];
複製代碼
// mapObject: 使用函數將數組的值映射到對象, 其中鍵值對由原始值做爲鍵和映射值組成
// 使用匿名內部函數範圍來聲明未定義的內存空間, 使用閉包來存儲返回值。使用新的Array可將該數組與函數的映射放在其數據集上, 而逗號運算符返回第二個步驟, 而不須要從一個上下文移動到另外一個環境 (因爲關閉和操做順序)。
let mapObject = (arr, fn) => (a => (a = [arr, arr.map(fn)], a[0].reduce((acc, val, ind) => (acc[val] = a[1][ind], acc), {})))
();
複製代碼
// nthElement: 返回數組的第 n 個元素
// 使用Array.slice()可獲取包含第 n 個元素的數組。若是索引超出界限, 則返回[]。省略第二個參數n, 以獲取數組的第一個元素
let nthElement = (arr, n = 0) => (n > 0 ? arr.slice(n, n + 1) : arr.slice(n))[0];
複製代碼
// pick: 從對象中選取對應於給定鍵的鍵值對
// 使用Array.reduce()將篩選/選取的密鑰轉換回具備相應鍵值對的對象 (若是在 obj 中存在該鍵)。
let pick = (obj, arr) => arr.reduce((acc, curr) => (curr in obj && (acc[curr] = obj[curr]), acc), {});
複製代碼
// pull: 對原始數組進行變異, 以篩選出指定的值
// 使用Array.filter()和Array.includes()來拉出不須要的值。使用Array.length = 0可將傳入的數組中的長度重置爲零, 並將其設置爲Array.push(), 以便僅使用所提取的值填充它。
let pull = (arr, ...args) => {
let pulled = arr.filter((v, i) => !args.includes(v));
arr.length = 0;
pulled.forEach(v => arr.push(v));
};
複製代碼
// remove: 從數組中移除給定函數返回false的元素
// 使用Array.filter()查找返回 truthy 值的數組元素和Array.reduce()以使用Array.splice()刪除元素。使用三參數 (func value, index, array調用函數).
let remove = (arr, func) => Array.isArray(arr) ? arr.filter(func).reduce((acc, val) => {
arr.splice(arr.indexOf(val), 1);
return acc.concat(val);
}, []) : [];
複製代碼
// sample: 返回數組中的隨機元素
// 使用Math.random()生成一個隨機數, 將它與length相乘, 並使用數學將其舍入到最接近的整數Math.floor()。此方法也適用於字符串
let sample = arr => arr[Math.floor(Math.random() * arr.length)];
複製代碼
// shuffle: 隨機數組值的順序
// 使用Array.sort()可在比較器中使用Math.random()從新排序元素。
let shuffle = arr => arr.sort(() => Math.random() - 0.5);
複製代碼
// similarity: 返回兩個數組中都顯示的元素的數組
// 使用filter()可刪除不屬於values的值, 使用includes()肯定.
let similarity = (arr, values) => arr.filter(v => values.includes(v));
複製代碼
// symmetricDifference: 返回兩個數組之間的對稱差
// 從每一個數組建立一個Set, 而後對它們中的每個都使用Array.filter(), 以便只保留其餘值中不包含的數值。
let symmetricDifference = (a, b) => {
const sA = new Set(a),
sB = new Set(b);
return [...a.filter(x => !sB.has(x)), ...b.filter(x => !sA.has(x))];
};
複製代碼
// tail: 返回數組中的全部元素, 除第一個
// 若是數組的length大於1, 則返回arr.slice(1), 不然返回整個數組。
let tail = arr => arr.length > 1 ? arr.slice(1) : arr;
複製代碼
// take: 返回一個數組, 其中 n 個元素從開始處移除
// 使用Array.slice()建立數組的切片, 其中包含從開始處取出的n元素
let take = (arr, n = 1) => arr.slice(0, n);
複製代碼
// takeRight: 返回一個數組, 其中 n 個元素從末尾移除
// 使用Array.slice()建立數組的切片, 其中包含從末尾取出的n元素
let takeRight = (arr, n = 1) => arr.slice(arr.length - n, arr.length);
複製代碼
// union: 返回在兩個數組中的任意一箇中存在的每一個元素
// 建立一個Set, 其中包含a和b的全部值, 並將其轉換爲數組。
let union = (a, b) => Array.from(new Set([...a, ...b]));
複製代碼
// without: 篩選出數組中具備指定值之一的元素
// 使用Array.filter()建立不包括的數組 (使用!Array.includes()) 全部給定值。
let without = (arr, ...args) => arr.filter(v => !args.includes(v));
複製代碼
// zip: 建立基於原始數組中的位置分組的元素數組
// 使用Math.max.apply()獲取參數中最長的數組。建立一個以該長度爲返回值的數組, 並使用 map 函數建立一個分組元素的數組Array.from()若是參數數組的長度不一樣, 則在未找到任何值的狀況下使用undefined。
let zip = (...arrays) => {
const maxLength = Math.max(...arrays.map(x => x.length));
return Array.from({
length: maxLength
}).map((_, i) => {
return Array.from({
length: arrays.length
}, (_, k) => arrays[k][i]);
})
};
複製代碼
// 從給定數組中移除一項
let removeArrayItem = function(arr, item) {
var i = 0;
while (i < arr.length) {
if (arr[i] == item) {
arr.splice(i, 1);
} else {
i++;
}
}
return arr;
};
複製代碼
// 檢查給定數組中是否包含某項
let contains = function(arr, item) {
var i = arr.length;
while (i--) {
if (arr[i] === item) {
return true;
}
}
return false;
};
複製代碼
/** * @param { string } value */
export const isNoWord = value => /^[^A-Za-z]*$/g.test(value);
複製代碼
/** @param { string } value */
export const isCHNAndEN = value => /^((?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])|(\d))+$/g.test(value);
複製代碼
/** @param { string } value */
export const isPostcode = value => /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/g.test(value);
複製代碼
/** @param { string } value */
export const isWeChatNum = value => /^[a-zA-Z][-_a-zA-Z0-9]{5,19}$/g.test(value);
複製代碼
/**
@param { string } value
*/
export const isColor16 = value => /^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/g.test(value);
複製代碼
/** @param { string } value */
export const isTrainNum = value => /^[GCDZTSPKXLY1-9]\d{1,4}$/g.test(value);
複製代碼
/** @param { string } value */
export const isIMEI = value => /^\d{15,17}$/g.test(value);
複製代碼
/** @param { string } value */
export const isHttpAndPort = value => /^((ht|f)tps?:\/\/)?[\w-]+(\.[\w-]+)+:\d{1,5}\/?$/g.test(value);
複製代碼
/** @param { string } value */
export const isRightWebsite = value => /^(((ht|f)tps?):\/\/)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-]*[\w@?^=%&/~+#-])?$/g.test(value);
複製代碼
/** @param { string } value */
export const isCreditCode = value => /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/g.test(value);
複製代碼
/** @param { string } value */
export const isThunderLink = value => /^thunderx?:\/\/[a-zA-Z\d]+=$/g.test(value);
複製代碼
/** @param { string } value */
export const ised2k = value => /^ed2k:\/\/\|file\|.+\|\/$/g.test(value);
複製代碼
/** @param { string } value */
export const isMagnet = value => /^magnet:\?xt=urn:btih:[0-9a-fA-F]{40,}.*$/g.test(value);
複製代碼
/** @param { string } value */
export const isSubnetMask = value => /^(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){3}$/g.test(value);
複製代碼
/** @param { string } value */
export const isLinuxFolderPath = value => /^(\/[^/]+)+\/?$/g.test(value);
複製代碼
/** @param { string } value */
export const isLinuxFilePath = value => /^(\/[^/]+)+$/g.test(value);
複製代碼
/** @param { string } value */
export const isWindowsFolderPath = value => /^[a-zA-Z]:\\(?:\w+\\?)*$/g.test(value);
複製代碼
/** @param { string } value */
export const isWindowsFilePath = value => /^[a-zA-Z]:\\(?:\w+\\)*\w+\.\w+$/g.test(value);
複製代碼
/** @param { string } value */
export const isAShare = value => /^(s[hz]|S[HZ])(000[\d]{3}|002[\d]{3}|300[\d]{3}|600[\d]{3}|60[\d]{4})$/g.test(value);
複製代碼
/** @param { string } value */
export const isVersion = value => /^\d+(?:\.\d+){2}$/g.test(value);
複製代碼
/** @param { string } value */
export const isVideoUrl = value => /^https?:\/\/(.+\/)+.+(\.(swf|avi|flv|mpg|rm|mov|wav|asf|3gp|mkv|rmvb|mp4))$/i.test(value);
複製代碼
/** @param { string } value */
export const isImageUrl = value => /^https?:\/\/(.+\/)+.+(\.(gif|png|jpg|jpeg|webp|svg|psd|bmp|tif))$/i.test(value);
複製代碼
/** @param { string } value */
export const isAccountNumber = value => /^[1-9]\d{9,29}$/g.test(value);
複製代碼
/** @param { string } value */
export const isChineseName = value => /^(?:[\u4e00-\u9fa5·]{2,16})$/g.test(value);
複製代碼
/** @param { string } value */
export const isEnglishName = value => /(^[a-zA-Z]{1}[a-zA-Z\s]{0,20}[a-zA-Z]{1}$)/g.test(value);
複製代碼
/** @param { string } value */
export const isLicensePlateNumberNER = value => /[京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領 A-Z]{1}[A-HJ-NP-Z]{1}(([0-9]{5}[DF])|([DF][A-HJ-NP-Z0-9][0-9]{4}))$/g.test(value);
複製代碼
/** @param { string } value */
export const isLicensePlateNumberNNER = value => /^[京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領 A-Z]{1}[A-HJ-NP-Z]{1}[A-Z0-9]{4}[A-Z0-9掛學警港澳]{1}$/g.test(value);
複製代碼
/** @param { string } value */
export const isLicensePlateNumber = value => /^(?:[京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領 A-Z]{1}[A-HJ-NP-Z]{1}(?:(?:[0-9]{5}[DF])|(?:[DF](?:[A-HJ-NP-Z0-9])[0-9]{4})))|(?:[京津滬渝冀豫雲遼黑湘皖魯新蘇浙贛鄂桂甘晉蒙陝吉閩貴粵青藏川寧瓊使領 A-Z]{1}[A-Z]{1}[A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9 掛學警港澳]{1})$/g.test(value);
複製代碼
/** @param { string } value */
export const isMPStrict = value => /^(?:(?:\+|00)86)?1(?:(?:3[\d])|(?:4[5-7|9])|(?:5[0-3|5-9])|(?:6[5-7])|(?:7[0-8])|(?:8[\d])|(?:9[1|8|9]))\d{8}$/g.test(value);
複製代碼
/** @param { string } value */
export const isMPRelaxed = value => /^(?:(?:\+|00)86)?1[3-9]\d{9}$/g.test(value);
複製代碼
/**
@param { string } value
*/
export const isEmail = value => /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/g.test(value);
複製代碼
/** @param { string } value */
export const isLandlineTelephone = value => /\d{3}-\d{8}|\d{4}-\d{7}/g.test(value);
複製代碼
/** @param { string } value */
export const isIDCardOld = value => /^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$/g.test(value);
複製代碼
/** @param { string } value */
export const isIDCardNew = value => /^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}[\dXx]$/g.test(value);
複製代碼
/** @param { string } value */
export const isIDCard = value => /(^\d{8}(0\d|10|11|12)([0-2]\d|30|31)\d{3}$)|(^\d{6}(18|19|20)\d{2}(0\d|10|11|12)([0-2]\d|30|31)\d{3}(\d|X|x)$)/g.test(value);
複製代碼
/** @param { string } value */
export const isPassport = value => /(^[EeKkGgDdSsPpHh]\d{8}$)|(^(([Ee][a-fA-F])|([DdSsPp][Ee])|([Kk][Jj])|([Mm][Aa])|(1[45]))\d{7}$)/g.test(value);
複製代碼
/** @param { string } value */
export const isWebAccount = value => /^[a-zA-Z]\w{4,15}$/g.test(value);
複製代碼
/** @param { string } value */
export const isChineseCharacter = value => /^(?:[\u3400-\u4DB5\u4E00-\u9FEA\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA1F\uFA21\uFA23\uFA24\uFA27-\uFA29]|[\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872\uD874-\uD879][\uDC00-\uDFFF]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1\uDEB0-\uDFFF]|\uD87A[\uDC00-\uDFE0])+$/g.test(value);
複製代碼
/** @param { string } value */
export const isDecimal = value => /^\d+\.\d+$/g.test(value);
複製代碼
/** @param { string } value */
export const isNumber = value => /^\d{1,}$/g.test(value);
複製代碼
/** @param { string } value */
export const isQQNum = value => /^[1-9][0-9]{4,10}$/g.test(value);
複製代碼
/** @param { string } value */
export const isNumAndStr = value => /^[A-Za-z0-9]+$/g.test(value);
複製代碼
/** @param { string } value */
export const isEnglish = value => /^[a-zA-Z]+$/g.test(value);
複製代碼
/** @param { string } value */
export const isCapital = value => /^[A-Z]+$/g.test(value);
複製代碼
/** @param { string } value */
export const isLowercase = value => /^[a-z]+$/g.test(value);
複製代碼
export const currentURL = () => window.location.href;
複製代碼
/** * @param {*} name * @param {*} origin */
export function getUrlParam(name, origin = null) {
let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
let r = null;
if (origin == null) {
r = window.location.search.substr(1).match(reg);
} else {
r = origin.substr(1).match(reg);
}
if (r != null) return decodeURIComponent(r[2]);
return null;
}
複製代碼
/** * @param {*} name * @param {*} origin */
export function getUrlParams(name, origin = null) {
let url = location.href;
let temp1 = url.split('?');
let pram = temp1[1];
let keyValue = pram.split('&');
let obj = {};
for (let i = 0; i < keyValue.length; i++) {
let item = keyValue[i].split('=');
let key = item[0];
let value = item[1];
obj[key] = value;
}
return obj[name];
}
複製代碼
/** * @param { string } paramName * @param { string } replaceWith */
export function replaceParamVal(paramName,replaceWith) {
var oUrl = location.href.toString();
var re=eval('/('+ paramName+'=)([^&]*)/gi');
location.href = oUrl.replace(re,paramName+'='+replaceWith);
return location.href;
}
複製代碼
/** * @param { string } name */
export function funcUrlDel(name){
var loca =location;
var baseUrl = loca.origin + loca.pathname + "?";
var query = loca.search.substr(1);
if (query.indexOf(name)>-1) {
var obj = {};
var arr = query.split("&");
for (var i = 0; i < arr.length; i++) {
arr[i] = arr[i].split("=");
obj[arr[i][0]] = arr[i][1];
}
delete obj[name];
var url = baseUrl + JSON.stringify(obj).replace(/[\"\{\}]/g,"").replace(/\:/g,"=").replace(/\,/g,"&");
return url
}
}
複製代碼
export function getClientHeight() {
let clientHeight = 0;
if (document.body.clientHeight && document.documentElement.clientHeight) {
clientHeight = (document.body.clientHeight < document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight;
}
else {
clientHeight = (document.body.clientHeight > document.documentElement.clientHeight) ? document.body.clientHeight : document.documentElement.clientHeight;
}
return clientHeight;
}
複製代碼
export function getPageViewWidth() {
let d = document,
a = d.compatMode == "BackCompat" ? d.body : d.documentElement;
return a.clientWidth;
}
複製代碼
export function getPageWidth() {
let g = document,
a = g.body,
f = g.documentElement,
d = g.compatMode == "BackCompat" ? a : g.documentElement;
return Math.max(f.scrollWidth, a.scrollWidth, d.clientWidth);
}
複製代碼
export function getViewportOffset() {
if (window.innerWidth) {
return {
w: window.innerWidth,
h: window.innerHeight
}
} else {
// ie8及其如下
if (document.compatMode === "BackCompat") {
// 怪異模式
return {
w: document.body.clientWidth,
h: document.body.clientHeight
}
} else {
// 標準模式
return {
w: document.documentElement.clientWidth,
h: document.documentElement.clientHeight
}
}
}
}
複製代碼
export function getPageScrollTop() {
let a = document;
return a.documentElement.scrollTop || a.body.scrollTop;
}
複製代碼
export function getPageScrollLeft() {
let a = document;
return a.documentElement.scrollLeft || a.body.scrollLeft;
}
複製代碼
/** * @param {*} element */
export function launchFullscreen(element) {
if (element.requestFullscreen) {
element.requestFullscreen()
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen()
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen()
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullScreen()
}
}
複製代碼
export function exitFullscreen() {
if (document.exitFullscreen) {
document.exitFullscreen()
} else if (document.msExitFullscreen) {
document.msExitFullscreen()
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen()
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen()
}
}
複製代碼
export const getScrollPosition = (el = window) => ({
x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});
複製代碼
export const smoothScroll = element =>{
document.querySelector(element).scrollIntoView({
behavior: 'smooth'
});
};
複製代碼
export const scrollToTop = () => {
const c = document.documentElement.scrollTop || document.body.scrollTop;
if (c > 0) {
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0, c - c / 8);
}
};
複製代碼
export const httpsRedirect = () => {
if (location.protocol !== 'https:') location.replace('https://' + location.href.split('//')[1]);
};
複製代碼
export const bottomVisible = () =>{
return document.documentElement.clientHeight + window.scrollY >=
(document.documentElement.scrollHeight || document.documentElement.clientHeight);
};
複製代碼
/** * @param { string } url * @param { string } windowName * @param { number } width * @param { number } height */
export function openWindow(url, windowName, width, height) {
var x = parseInt(screen.width / 2.0) - width / 2.0;
var y = parseInt(screen.height / 2.0) - height / 2.0;
var isMSIE = navigator.appName == "Microsoft Internet Explorer";
if (isMSIE) {
var p = "resizable=1,location=no,scrollbars=no,width=";
p = p + width;
p = p + ",height=";
p = p + height;
p = p + ",left=";
p = p + x;
p = p + ",top=";
p = p + y;
window.open(url, windowName, p);
} else {
var win = window.open(
url,
"ZyiisPopup",
"top=" +
y +
",left=" +
x +
",scrollbars=" +
scrollbars +
",dialog=yes,modal=yes,width=" +
width +
",height=" +
height +
",resizable=no"
);
eval("try { win.resizeTo(width, height); } catch(e) { }");
win.focus();
}
}
複製代碼
/** * @param { number } width */
export function AutoResponse(width = 750) {
const target = document.documentElement;
target.clientWidth >= 600
? (target.style.fontSize = "80px")
: (target.style.fontSize = target.clientWidth / width * 100 + "px");
}
複製代碼
主要爲瀏覽器存儲方面的工具函數,大部分搬運自大神火狼1javascript
/** * 目前對象值若是是函數 、RegExp等特殊對象存貯會被忽略 * @param { String } key 屬性 * @param { string } value 值 */
export const localStorageSet = (key, value) => {
if (typeof (value) === 'object') value = JSON.stringify(value);
localStorage.setItem(key, value)
};
複製代碼
/** * @param {String} key 屬性 */
export const localStorageGet = (key) => {
return localStorage.getItem(key)
};
複製代碼
/** * @param {String} key 屬性 */
export const localStorageRemove = (key) => {
localStorage.removeItem(key)
};
複製代碼
/** * @param {String} key 屬性 * @param {*} value 存貯值 * @param { number } expire 過時時間,毫秒數 */
export const localStorageSetExpire = (key, value, expire) => {
if (typeof (value) === 'object') value = JSON.stringify(value);
localStorage.setItem(key, value);
setTimeout(() => {
localStorage.removeItem(key)
}, expire)
};
複製代碼
/** * @param {String} key 屬性 * @param {*} value 值 */
export const sessionStorageSet = (key, value) => {
if (typeof (value) === 'object') value = JSON.stringify(value);
sessionStorage.setItem(key, value)
};
複製代碼
/** * @param {String} key 屬性 */
export const sessionStorageGet = (key) => {
return sessionStorage.getItem(key)
};
複製代碼
/** * @param {String} key 屬性 */
export const sessionStorageRemove = (key) => {
sessionStorage.removeItem(key)
};
複製代碼
/** * @param {String} key 屬性 * @param {*} value 存貯值 * @param {String} expire 過時時間,毫秒數 */
export const sessionStorageSetExpire = (key, value, expire) => {
if (typeof (value) === 'object') value = JSON.stringify(value);
sessionStorage.setItem(key, value);
setTimeout(() => {
sessionStorage.removeItem(key)
}, expire)
};
複製代碼
/** * @param {String} key 屬性 * @param {*} value 值 * @param { String } expire 過時時間,單位天 */
export const cookieSet = (key, value, expire) => {
const d = new Date();
d.setDate(d.getDate() + expire);
document.cookie = `${key}=${value};expires=${d.toUTCString()}`
};
複製代碼
/** * @param {String} key 屬性 */
export const cookieGet = (key) => {
const cookieStr = unescape(document.cookie);
const arr = cookieStr.split('; ');
let cookieValue = '';
for (let i = 0; i < arr.length; i++) {
const temp = arr[i].split('=');
if (temp[0] === key) {
cookieValue = temp[1];
break
}
}
return cookieValue
};
複製代碼
/** * @param {String} key 屬性 */
export const cookieRemove = (key) => {
document.cookie = `${encodeURIComponent(key)}=;expires=${new Date()}`
};
複製代碼
這裏包含了平時可能經常使用的工具函數,包含數字,字符串,數組和對象等等操做。css
/** * @param { number } num */
export const formatMoney = num => num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
複製代碼
export function subText(str, length) {
if (str.length === 0) {
return '';
}
if (str.length > length) {
return str.substr(0, length) + "...";
} else {
return str;
}
}
複製代碼
/** * @param file * @param format 指定文件格式 * @param size 指定文件大小(字節) * @param formatMsg 格式錯誤提示 * @param sizeMsg 大小超出限制提示 * @returns {Promise<any>} */
export function fileToBase64String(file, format = ['jpg', 'jpeg', 'png', 'gif'], size = 20 * 1024 * 1024, formatMsg = '文件格式不正確', sizeMsg = '文件大小超出限制') {
return new Promise((resolve, reject) => {
// 格式過濾
let suffix = file.type.split('/')[1].toLowerCase();
let inFormat = false;
for (let i = 0; i < format.length; i++) {
if (suffix === format[i]) {
inFormat = true;
break;
}
}
if (!inFormat) {
reject(formatMsg);
}
// 大小過濾
if (file.size > size) {
reject(sizeMsg);
}
// 轉base64字符串
let fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onload = () => {
let res = fileReader.result;
resolve({base64String: res, suffix: suffix});
reject('異常文件,請從新選擇');
}
})
}
複製代碼
/** * @param { number } fileSize */
export function formatFileSize(fileSize) {
let temp;
if (fileSize < 1024) {
return fileSize + 'B';
} else if (fileSize < (1024 * 1024)) {
temp = fileSize / 1024;
temp = temp.toFixed(2);
return temp + 'KB';
} else if (fileSize < (1024 * 1024 * 1024)) {
temp = fileSize / (1024 * 1024);
temp = temp.toFixed(2);
return temp + 'MB';
} else {
temp = fileSize / (1024 * 1024 * 1024);
temp = temp.toFixed(2);
return temp + 'GB';
}
}
複製代碼
/** * @param { base64 } base64 * @param { string } filename 轉換後的文件名 */
export const base64ToFile = (base64, filename )=> {
let arr = base64.split(',');
let mime = arr[0].match(/:(.*?);/)[1];
let suffix = mime.split('/')[1] ;// 圖片後綴
let bstr = atob(arr[1]);
let n = bstr.length;
let u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n)
}
return new File([u8arr], `${filename}.${suffix}`, { type: mime })
};
複製代碼
/** * @param { base64 } base64 */
export const base64ToBlob = base64 => {
let arr = base64.split(','),
mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
n = bstr.length,
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
};
複製代碼
/** * @param { blob } blob * @param { string } fileName */
export const blobToFile = (blob, fileName) => {
blob.lastModifiedDate = new Date();
blob.name = fileName;
return blob;
};
複製代碼
/** * @param { * } file 圖片文件 */
export const fileToBase64 = file => {
let reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = function (e) {
return e.target.result
};
};
複製代碼
export function getTreeData(data, pid, pidName = 'parentId', idName = 'id', childrenName = 'children', key) {
let arr = [];
for (let i = 0; i < data.length; i++) {
if (data[i][pidName] == pid) {
data[i].key = data[i][idName];
data[i][childrenName] = getTreeData(data, data[i][idName], pidName, idName, childrenName);
arr.push(data[i]);
}
}
return arr;
}
複製代碼
export function foreachTree(data, childrenName = 'children', callback) {
for (let i = 0; i < data.length; i++) {
callback(data[i]);
if (data[i][childrenName] && data[i][childrenName].length > 0) {
foreachTree(data[i][childrenName], childrenName, callback);
}
}
}
複製代碼
export function traceParentNode(pid, data, rootPid, pidName = 'parentId', idName = 'id', childrenName = 'children') {
let arr = [];
foreachTree(data, childrenName, (node) => {
if (node[idName] == pid) {
arr.push(node);
if (node[pidName] != rootPid) {
arr = arr.concat(traceParentNode(node[pidName], data, rootPid, pidName, idName));
}
}
});
return arr;
}
複製代碼
export function traceChildNode(id, data, pidName = 'parentId', idName = 'id', childrenName = 'children') {
let arr = [];
foreachTree(data, childrenName, (node) => {
if (node[pidName] == id) {
arr.push(node);
arr = arr.concat(traceChildNode(node[idName], data, pidName, idName, childrenName));
}
});
return arr;
}
複製代碼
/** * @param { object } items 後臺獲取的數據 * @param { * } id 數據中的id * @param { * } link 生成樹形結構的依據 */
export const createTree = (items, id = null, link = 'pid') =>{
items.filter(item => item[link] === id).map(item => ({ ...item, children: createTree(items, item.id) }));
};
複製代碼
/** * @param {*} item * @param { array } data */
export function inArray(item, data) {
for (let i = 0; i < data.length; i++) {
if (item === data[i]) {
return i;
}
}
return -1;
}
複製代碼
/** * @param { string } osVersion */
export function OutOsName(osVersion) {
if(!osVersion){
return
}
let str = osVersion.substr(0, 3);
if (str === "5.0") {
return "Win 2000"
} else if (str === "5.1") {
return "Win XP"
} else if (str === "5.2") {
return "Win XP64"
} else if (str === "6.0") {
return "Win Vista"
} else if (str === "6.1") {
return "Win 7"
} else if (str === "6.2") {
return "Win 8"
} else if (str === "6.3") {
return "Win 8.1"
} else if (str === "10.") {
return "Win 10"
} else {
return "Win"
}
}
複製代碼
/** * 0: ios * 1: android * 2: 其它 */
export function getOSType() {
let u = navigator.userAgent, app = navigator.appVersion;
let isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
let isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
if (isIOS) {
return 0;
}
if (isAndroid) {
return 1;
}
return 2;
}
複製代碼
/** * @param { function } func * @param { number } wait 延遲執行毫秒數 * @param { boolean } immediate true 表當即執行,false 表非當即執行 */
export function debounce(func,wait,immediate) {
let timeout;
return function () {
let context = this;
let args = arguments;
if (timeout) clearTimeout(timeout);
if (immediate) {
let callNow = !timeout;
timeout = setTimeout(() => {
timeout = null;
}, wait);
if (callNow) func.apply(context, args)
}
else {
timeout = setTimeout(() => {
func.apply(context, args)
}, wait);
}
}
}
複製代碼
/** * @param { function } func 函數 * @param { number } wait 延遲執行毫秒數 * @param { number } type 1 表時間戳版,2 表定時器版 */
export function throttle(func, wait ,type) {
let previous, timeout;
if(type===1){
previous = 0;
}else if(type===2){
timeout = null;
}
return function() {
let context = this;
let args = arguments;
if(type===1){
let now = Date.now();
if (now - previous > wait) {
func.apply(context, args);
previous = now;
}
}else if(type===2){
if (!timeout) {
timeout = setTimeout(() => {
timeout = null;
func.apply(context, args)
}, wait)
}
}
}
}
複製代碼
/** * @param {*} target */
export function type(target) {
let ret = typeof(target);
let template = {
"[object Array]": "array",
"[object Object]":"object",
"[object Number]":"number - object",
"[object Boolean]":"boolean - object",
"[object String]":'string-object'
};
if(target === null) {
return 'null';
}else if(ret == "object"){
let str = Object.prototype.toString.call(target);
return template[str];
}else{
return ret;
}
}
複製代碼
/** * @param { number } min * @param { number } max */
export const RandomNum = (min, max) => Math.floor(Math.random() * (max - min + 1)) + min;
複製代碼
/** * @param {array} arr */
export function arrScrambling(arr) {
let array = arr;
let index = array.length;
while (index) {
index -= 1;
let randomIndex = Math.floor(Math.random() * index);
let middleware = array[index];
array[index] = array[randomIndex];
array[randomIndex] = middleware
}
return array
}
複製代碼
/** * @param { array} arr1 * @param { array } arr2 */
export const similarity = (arr1, arr2) => arr1.filter(v => arr2.includes(v));
複製代碼
/** * @param { array } arr * @param {*} value */
export function countOccurrences(arr, value) {
return arr.reduce((a, v) => v === value ? a + 1 : a + 0, 0);
}
複製代碼
/** * @param { number } arg1 * @param { number } arg2 */
export function add(arg1, arg2) {
let r1, r2, m;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2));
return (arg1 * m + arg2 * m) / m
}
複製代碼
/** * @param { number } arg1 * @param { number } arg2 */
export function sub(arg1, arg2) {
let r1, r2, m, n;
try { r1 = arg1.toString().split(".")[1].length } catch (e) { r1 = 0 }
try { r2 = arg2.toString().split(".")[1].length } catch (e) { r2 = 0 }
m = Math.pow(10, Math.max(r1, r2));
n = (r1 >= r2) ? r1 : r2;
return Number(((arg1 * m - arg2 * m) / m).toFixed(n));
}
複製代碼
/** * @param { number } num1 * @param { number } num2 */
export function division(num1,num2){
let t1,t2,r1,r2;
try{
t1 = num1.toString().split('.')[1].length;
}catch(e){
t1 = 0;
}
try{
t2=num2.toString().split(".")[1].length;
}catch(e){
t2=0;
}
r1=Number(num1.toString().replace(".",""));
r2=Number(num2.toString().replace(".",""));
return (r1/r2)*Math.pow(10,t2-t1);
}
複製代碼
/** * @param { number } num1 * @param { number } num2 */
export function mcl(num1,num2){
let m=0,s1=num1.toString(),s2=num2.toString();
try{m+=s1.split(".")[1].length}catch(e){}
try{m+=s2.split(".")[1].length}catch(e){}
return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m);
}
複製代碼
/** * @param { function } f */
export function tco(f) {
let value;
let active = false;
let accumulated = [];
return function accumulator() {
accumulated.push(arguments);
if (!active) {
active = true;
while (accumulated.length) {
value = f.apply(this, accumulated.shift());
}
active = false;
return value;
}
};
}
複製代碼
export function randomNumInteger(min, max) {
switch (arguments.length) {
case 1:
return parseInt(Math.random() * min + 1, 10);
case 2:
return parseInt(Math.random() * (max - min + 1) + min, 10);
default:
return 0
}
}
複製代碼
/** * @param { string } str 待處理字符串 * @param { number } type 去除空格類型 1-全部空格 2-先後空格 3-前空格 4-後空格 默認爲1 */
export function trim(str, type = 1) {
if (type && type !== 1 && type !== 2 && type !== 3 && type !== 4) return;
switch (type) {
case 1:
return str.replace(/\s/g, "");
case 2:
return str.replace(/(^\s)|(\s*$)/g, "");
case 3:
return str.replace(/(^\s)/g, "");
case 4:
return str.replace(/(\s$)/g, "");
default:
return str;
}
}
複製代碼
/** * @param { string } str 待轉換的字符串 * @param { number } type 1-全大寫 2-全小寫 3-首字母大寫 其餘-不轉換 */
export function turnCase(str, type) {
switch (type) {
case 1:
return str.toUpperCase();
case 2:
return str.toLowerCase();
case 3:
return str[0].toUpperCase() + str.substr(1).toLowerCase();
default:
return str;
}
}
複製代碼
/** * 方法一 */
export function hexColor() {
let str = '#';
let arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'A', 'B', 'C', 'D', 'E', 'F'];
for (let i = 0; i < 6; i++) {
let index = Number.parseInt((Math.random() * 16).toString());
str += arr[index]
}
return str;
}
複製代碼
/** * 方法二 */
export const randomHexColorCode = () => {
let n = (Math.random() * 0xfffff * 1000000).toString(16);
return '#' + n.slice(0, 6);
};
複製代碼
export const escapeHTML = str =>{
str.replace(
/[&<>'"]/g,
tag =>
({
'&': '&',
'<': '<',
'>': '>',
"'": ''',
'"': '"'
}[tag] || tag)
);
};
複製代碼
export const detectDeviceType = () => { return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ? 'Mobile' : 'Desktop'; };
複製代碼
/** * 例: hide(document.querySelectorAll('img')) */
export const hideTag = (...el) => [...el].forEach(e => (e.style.display = 'none'));
複製代碼
/** * @param { element} el 元素節點 * @param { string } ruleName 指定元素的名稱 */
export const getStyle = (el, ruleName) => getComputedStyle(el)[ruleName];
複製代碼
/** * @param { element } parent * @param { element } child * 例:elementContains(document.querySelector('head'), document.querySelector('title')); // true */
export const elementContains = (parent, child) => parent !== child && parent.contains(child);
複製代碼
/** * @param { number } val 輸入的數字 * @param { number } maxNum 數字規定界限 */
export const outOfNum = (val, maxNum) =>{
val = val ? val-0 :0;
if (val > maxNum ) {
return `${maxNum}+`
}else{
return val;
}
};
複製代碼
const hide = (el) => Array.from(el).forEach(e => (e.style.display = 'none'));
// 事例:隱藏頁面上全部`<img>`元素?
hide(document.querySelectorAll('img'))
複製代碼
頁面DOM裏的每一個節點上都有一個classList對象,程序員可使用裏面的方法新增、刪除、修改節點上的CSS類。使用classList,程序員還能夠用它來判斷某個節點是否被賦予了某個CSS類。html
const hasClass = (el, className) => el.classList.contains(className)
// 事例
hasClass(document.querySelector('p.special'), 'special') // true
複製代碼
const toggleClass = (el, className) => el.classList.toggle(className)
// 事例 移除 p 具備類`special`的 special 類
toggleClass(document.querySelector('p.special'), 'special')
複製代碼
const getScrollPosition = (el = window) => ({
x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop
});
// 事例
getScrollPosition(); // {x: 0, y: 200}
複製代碼
const scrollToTop = () => {
const c = document.documentElement.scrollTop || document.body.scrollTop;
if (c > 0) {
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0, c - c / 8);
}
}
// 事例
scrollToTop()
複製代碼
window.requestAnimationFrame() 告訴瀏覽器——你但願執行一個動畫,而且要求瀏覽器在下次重繪以前調用指定的回調函數更新動畫。該方法須要傳入一個回調函數做爲參數,該回調函數會在瀏覽器下一次重繪以前執行。
requestAnimationFrame:優點:由系統決定回調函數的執行時機。60Hz的刷新頻率,那麼每次刷新的間隔中會執行一次回調函數,不會引發丟幀,不會卡頓。
window.requestAnimationFrame() 告訴瀏覽器——你但願執行一個動畫,而且要求瀏覽器在下次重繪以前調用指定的回調函數更新動畫。該方法須要傳入一個回調函數做爲參數,該回調函數會在瀏覽器下一次重繪以前執行。
requestAnimationFrame:優點:由系統決定回調函數的執行時機。60Hz的刷新頻率,那麼每次刷新的間隔中會執行一次回調函數,不會引發丟幀,不會卡頓。
複製代碼
const elementContains = (parent, child) => parent !== child && parent.contains(child);
// 事例
elementContains(document.querySelector('head'), document.querySelector('title'));
// true
elementContains(document.querySelector('body'), document.querySelector('body'));
// false
複製代碼
const elementIsVisibleInViewport = (el, partiallyVisible = false) => {
const { top, left, bottom, right } = el.getBoundingClientRect();
const { innerHeight, innerWidth } = window;
return partiallyVisible
? ((top > 0 && top < innerHeight) || (bottom > 0 && bottom < innerHeight)) &&
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
};
// 事例
elementIsVisibleInViewport(el); // 須要左右可見
elementIsVisibleInViewport(el, true); // 須要全屏(上下左右)能夠見
複製代碼
const getImages = (el, includeDuplicates = false) => {
const images = [...el.getElementsByTagName('img')].map(img => img.getAttribute('src'));
return includeDuplicates ? images : [...new Set(images)];
};
// 事例:includeDuplicates 爲 true 表示須要排除重複元素
getImages(document, true); // ['image1.jpg', 'image2.png', 'image1.png', '...']
getImages(document, false); // ['image1.jpg', 'image2.png', '...']
複製代碼
const detectDeviceType = () =>
/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)
? 'Mobile'
: 'Desktop';
// 事例
detectDeviceType(); // "Mobile" or "Desktop"
複製代碼
const currentURL = () => window.location.href
// 事例
currentURL() // 'https://google.com'
複製代碼
const getURLParameters = url =>
(url.match(/([^?=&]+)(=([^&]*))/g) || []).reduce(
(a, v) => ((a[v.slice(0, v.indexOf('='))] = v.slice(v.indexOf('=') + 1)), a),
{}
);
// 事例
getURLParameters('http://url.com/page?n=Adam&s=Smith'); // {n: 'Adam', s: 'Smith'}
getURLParameters('google.com'); // {}
複製代碼
const formToObject = form =>
Array.from(new FormData(form)).reduce(
(acc, [key, value]) => ({
...acc,
[key]: value
}),
{}
);
// 事例
formToObject(document.querySelector('#form'));
// { email: 'test@email.com', name: 'Test Name' }
複製代碼
const get = (from, ...selectors) =>
[...selectors].map(s =>
s
.replace(/\[([^\[\]]*)\]/g, '.$1.')
.split('.')
.filter(t => t !== '')
.reduce((prev, cur) => prev && prev[cur], from)
);
const obj = { selector: { to: { val: 'val to select' } }, target: [1, 2, { a: 'test' }] };
// Example
get(obj, 'selector.to.val', 'target[0]', 'target[2].a');
// ['val to select', 1, 'test']
複製代碼
const delay = (fn, wait, ...args) => setTimeout(fn, wait, ...args);
delay(
function(text) {
console.log(text);
},
1000,
'later'
);
// 1秒後打印 'later'
複製代碼
const triggerEvent = (el, eventType, detail) =>
el.dispatchEvent(new CustomEvent(eventType, { detail }));
// 事例
triggerEvent(document.getElementById('myId'), 'click');
triggerEvent(document.getElementById('myId'), 'click', { username: 'bob' });
自定義事件的函數有 Event、CustomEvent 和 dispatchEvent
// 向 window派發一個resize內置事件
window.dispatchEvent(new Event('resize'))
// 直接自定義事件,使用 Event 構造函數:
var event = new Event('build');
var elem = document.querySelector('#id')
// 監聽事件
elem.addEventListener('build', function (e) { ... }, false);
// 觸發事件.
elem.dispatchEvent(event);
CustomEvent 能夠建立一個更高度自定義事件,還能夠附帶一些數據,具體用法以下:
var myEvent = new CustomEvent(eventname, options);
其中 options 能夠是:
{
detail: {
...
},
bubbles: true, //是否冒泡
cancelable: false //是否取消默認事件
}
其中 detail 能夠存放一些初始化的信息,能夠在觸發的時候調用。其餘屬性就是定義該事件是否具備冒泡等等功能。
內置的事件會由瀏覽器根據某些操做進行觸發,自定義的事件就須要人工觸發。
dispatchEvent 函數就是用來觸發某個事件:
element.dispatchEvent(customEvent);
上面代碼表示,在 element 上面觸發 customEvent 這個事件。
// add an appropriate event listener
obj.addEventListener("cat", function(e) { process(e.detail) });
// create and dispatch the event
var event = new CustomEvent("cat", {"detail":{"hazcheeseburger":true}});
obj.dispatchEvent(event);
使用自定義事件須要注意兼容性問題,而使用 jQuery 就簡單多了:
// 綁定自定義事件
$(element).on('myCustomEvent', function(){});
// 觸發事件
$(element).trigger('myCustomEvent');
// 此外,你還能夠在觸發自定義事件時傳遞更多參數信息:
$( "p" ).on( "myCustomEvent", function( event, myName ) {
$( this ).text( myName + ", hi there!" );
});
$( "button" ).click(function () {
$( "p" ).trigger( "myCustomEvent", [ "John" ] );
});
複製代碼
const off = (el, evt, fn, opts = false) => el.removeEventListener(evt, fn, opts);
const fn = () => console.log('!');
document.body.addEventListener('click', fn);
off(document.body, 'click', fn);
複製代碼
const formatDuration = ms => {
if (ms < 0) ms = -ms;
const time = {
day: Math.floor(ms / 86400000),
hour: Math.floor(ms / 3600000) % 24,
minute: Math.floor(ms / 60000) % 60,
second: Math.floor(ms / 1000) % 60,
millisecond: Math.floor(ms) % 1000
};
return Object.entries(time)
.filter(val => val[1] !== 0)
.map(([key, val]) => `${val} ${key}${val !== 1 ? 's' : ''}`)
.join(', ');
};
// 事例
formatDuration(1001); // '1 second, 1 millisecond'
formatDuration(34325055574);
// '397 days, 6 hours, 44 minutes, 15 seconds, 574 milliseconds'
複製代碼
const getDaysDiffBetweenDates = (dateInitial, dateFinal) =>
(dateFinal - dateInitial) / (1000 * 3600 * 24);
// 事例
getDaysDiffBetweenDates(new Date('2017-12-13'), new Date('2017-12-22')); // 9
複製代碼
const httpGet = (url, callback, err = console.error) => {
const request = new XMLHttpRequest();
request.open('GET', url, true);
request.onload = () => callback(request.responseText);
request.onerror = () => err(request);
request.send();
};
httpGet(
'https://jsonplaceholder.typicode.com/posts/1',
console.log
);
// {"userId": 1, "id": 1, "title": "sample title", "body": "my text"}
複製代碼
const httpPost = (url, data, callback, err = console.error) => {
const request = new XMLHttpRequest();
request.open('POST', url, true);
request.setRequestHeader('Content-type', 'application/json; charset=utf-8');
request.onload = () => callback(request.responseText);
request.onerror = () => err(request);
request.send(data);
};
const newPost = {
userId: 1,
id: 1337,
title: 'Foo',
body: 'bar bar bar'
};
const data = JSON.stringify(newPost);
httpPost(
'https://jsonplaceholder.typicode.com/posts',
data,
console.log
);
// {"userId": 1, "id": 1337, "title": "Foo", "body": "bar bar bar"}
複製代碼
const counter = (selector, start, end, step = 1, duration = 2000) => {
let current = start,
_step = (end - start) * step < 0 ? -step : step,
timer = setInterval(() => {
current += _step;
document.querySelector(selector).innerHTML = current;
if (current >= end) document.querySelector(selector).innerHTML = end;
if (current >= end) clearInterval(timer);
}, Math.abs(Math.floor(duration / (end - start))));
return timer;
};
// 事例
counter('#my-id', 1, 1000, 5, 2000);
// 讓 `id=「my-id」`的元素建立一個2秒計時器
複製代碼
const el = document.createElement('textarea');
el.value = str;
el.setAttribute('readonly', '');
el.style.position = 'absolute';
el.style.left = '-9999px';
document.body.appendChild(el);
const selected =
document.getSelection().rangeCount > 0 ? document.getSelection().getRangeAt(0) : false;
el.select();
document.execCommand('copy');
document.body.removeChild(el);
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
};
// 事例
copyToClipboard('Lorem ipsum');
// 'Lorem ipsum' copied to clipboard
複製代碼
const isBrowserTabFocused = () => !document.hidden;
// 事例
isBrowserTabFocused(); // true
複製代碼
const fs = require('fs');
const createDirIfNotExists = dir => (!fs.existsSync(dir) ? fs.mkdirSync(dir) : undefined);
// 事例
createDirIfNotExists('test');
這裏面的方法大都挺實用,能夠解決不少開發過程問題,你們就好好利用起來吧。
複製代碼
function formatTime(date) {
if(!!date){
if(!(date instanceof Date))
date = new Date(date);
var month = date.getMonth() + 1
var day = date.getDate()
return `${month}月${day}日`;
}
}
function formatDay(date) {
if(!!date){
var year = date.getFullYear()
var month = date.getMonth() + 1
var day = date.getDate()
return [year, month, day].map(formatNumber).join('-');
}
}
function formatDay2(date) {
if(!!date){
var year = date.getFullYear()
var month = date.getMonth() + 1
var day = date.getDate()
return [year, month, day].map(formatNumber).join('/');
}
}
function formatWeek(date){
if(!!date){
var day = date.getDay();
switch (day) {
case 0:
return '週日'
break;
case 1:
return '週一'
break;
case 2:
return '週二'
break;
case 3:
return '週三'
break;
case 4:
return '週四'
break;
case 5:
return '週五'
break;
case 6:
return '週六'
break;
}
}
}
function formatHour(date){
if(!!date){
var hour = new Date(date).getHours();
var minute = new Date(date).getMinutes();
return [hour, minute].map(formatNumber).join(':');
}
}
function timestamp(date, divisor=1000){
if(date == undefined){
return;
}else if(typeof date == 'number'){
return Math.floor(date/divisor);
}else if(typeof date == 'string'){
var strs = date.split(/[^0-9]/);
return Math.floor(+new Date(strs[0] || 0,(strs[1] || 0)-1,strs[2] || 0,strs[3] || 0,strs[4] || 0,strs[5] || 0)/divisor);
}else if(Date.prototype.isPrototypeOf(date)){
return Math.floor(+date/divisor);
}
}
function detimestamp(date){
if(!!date){
return new Date(date*1000);
}
}
function formatNumber(n) {//給在0-9的日期加上0
n = n.toString()
return n[1] ? n : '0' + n
}
module.exports = {
formatTime: formatTime,
formatDay: formatDay,
formatDay2: formatDay2,
formatHour: formatHour,
formatWeek: formatWeek,
timestamp: timestamp,
detimestamp: detimestamp
}
複製代碼
/** * 時間戳轉化爲年 月 日 時 分 秒 * number: 傳入時間戳 * format:返回格式,支持自定義,但參數必須與formateArr裏保持一致 */
function formatTime(number,format) {
var formateArr = ['Y','M','D','h','m','s'];
var returnArr = [];
var date = new Date(number * 1000);
returnArr.push(date.getFullYear());
returnArr.push(formatNumber(date.getMonth() + 1));
returnArr.push(formatNumber(date.getDate()));
returnArr.push(formatNumber(date.getHours()));
returnArr.push(formatNumber(date.getMinutes()));
returnArr.push(formatNumber(date.getSeconds()));
for (var i in returnArr)
{
format = format.replace(formateArr[i], returnArr[i]);
}
return format;
}
//數據轉化
function formatNumber(n) {
n = n.toString()
return n[1] ? n : '0' + n
}
調用示例:
var sjc = 1488481383;//時間戳
console.log(time.formatTime(sjc,'Y/M/D h:m:s'));//轉換爲日期:2017/03/03 03:03:03
console.log(time.formatTime(sjc, 'h:m'));//轉換爲日期:03:03
複製代碼
js中獲取上下文路徑
//js獲取項目根路徑,如: http://localhost:8083/uimcardprj
function getRootPath(){
//獲取當前網址,如: http://localhost:8083/uimcardprj/share/meun.jsp
var curWwwPath=window.document.location.href;
//獲取主機地址以後的目錄,如: uimcardprj/share/meun.jsp
var pathName=window.document.location.pathname;
var pos=curWwwPath.indexOf(pathName);
//獲取主機地址,如: http://localhost:8083
var localhostPaht=curWwwPath.substring(0,pos);
//獲取帶"/"的項目名,如:/uimcardprj
var projectName=pathName.substring(0,pathName.substr(1).indexOf('/')+1);
return(localhostPaht+projectName);
}
複製代碼
function conver(limit){
var size = "";
if( limit < 0.1 * 1024 ){ //若是小於0.1KB轉化成B
size = limit.toFixed(2) + "B";
}else if(limit < 0.1 * 1024 * 1024 ){//若是小於0.1MB轉化成KB
size = (limit / 1024).toFixed(2) + "KB";
}else if(limit < 0.1 * 1024 * 1024 * 1024){ //若是小於0.1GB轉化成MB
size = (limit / (1024 * 1024)).toFixed(2) + "MB";
}else{ //其餘轉化成GB
size = (limit / (1024 * 1024 * 1024)).toFixed(2) + "GB";
}
var sizestr = size + "";
var len = sizestr.indexOf("\.");
var dec = sizestr.substr(len + 1, 2);
if(dec == "00"){//當小數點後爲00時 去掉小數部分
return sizestr.substring(0,len) + sizestr.substr(len + 3,2);
}
return sizestr;
}
複製代碼
function fullScreen() {
var el = document.documentElement;
var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullScreen;
//typeof rfs != "undefined" && rfs
if (rfs) {
rfs.call(el);
} else if (typeof window.ActiveXObject !== "undefined") {
//for IE,這裏其實就是模擬了按下鍵盤的F11,使瀏覽器全屏
var wscript = new ActiveXObject("WScript.Shell");
if (wscript != null) {
wscript.SendKeys("{F11}");
}
}
}
//退出全屏
function exitScreen() {
var el = document;
var cfs = el.cancelFullScreen || el.webkitCancelFullScreen || el.mozCancelFullScreen || el.exitFullScreen;
//typeof cfs != "undefined" && cfs
if (cfs) {
cfs.call(el);
} else if (typeof window.ActiveXObject !== "undefined") {
//for IE,這裏和fullScreen相同,模擬按下F11鍵退出全屏
var wscript = new ActiveXObject("WScript.Shell");
if (wscript != null) {
wscript.SendKeys("{F11}");
}
}
}
複製代碼
/** * 格式化時間,轉化爲幾分鐘前,幾秒鐘前 * @param timestamp 時間戳,單位是毫秒 */
function timeFormat(timestamp) {
var mistiming = Math.round((Date.now() - timestamp) / 1000);
var arrr = ['年', '個月', '星期', '天', '小時', '分鐘', '秒'];
var arrn = [31536000, 2592000, 604800, 86400, 3600, 60, 1];
for (var i = 0; i < arrn.length; i++) {
var inm = Math.floor(mistiming / arrn[i]);
if (inm != 0) {
return inm + arrr[i] + '前';
}
}
}
複製代碼
/** * 獲取n天以前的日期 getDaysBeforeDate(10) 10天前 * @param day 天數 */
function getDaysBeforeDate(day) {
var date = new Date(),
timestamp, newDate;
timestamp = date.getTime();
// 獲取三天前的日期
newDate = new Date(timestamp - day * 24 * 3600 * 1000);
var year = newDate.getFullYear();
// 月+1是由於js中月份是按0開始的
var month = newDate.getMonth() + 1;
var day = newDate.getDate();
if (day < 10) { // 若是日小於10,前面拼接0
day = '0' + day;
}
if (month < 10) { // 若是月小於10,前面拼接0
month = '0' + month;
}
return [year, month, day].join('/');
}
複製代碼
/** * 獲取跳轉的classId,經過hash方式獲取 * @return 返回值 */
$scope.getQueryString = function() {
var url= {},
a = '';
(a = window.location.search.substr(1)) || (a = window.location.hash.split('?')[1])
a.split(/&/g).forEach(function(item) {
url[(item = item.split('='))[0]] = item[1];
})
return url
}
複製代碼
function filterArrBySex(data, name) {
if (!name) {
console.log(name)
return data;
} else {
return data.filter(function(ele, index, self) {
if (ele.name.includes(name)) {
return ele
}
})
}
}
複製代碼
/** * 根據身份證獲取出生年月 * @param idCard */
function getBirthdayFromIdCard(idCard) {
var birthday = "";
if (idCard != null && idCard != "") {
if (idCard.length == 15) {
birthday = "19" + idCard.substr(6, 6);
} else if (idCard.length == 18) {
birthday = idCard.substr(6, 8);
}
birthday = birthday.replace(/(.{4})(.{2})/, "$1-$2-");
}
return birthday;
}
複製代碼
/** * 根據身份證獲取年齡 * @param UUserCard */
function IdCard(UUserCard) {
//獲取年齡
var myDate = new Date();
var month = myDate.getMonth() + 1;
var day = myDate.getDate();
var age = myDate.getFullYear() - UUserCard.substring(6, 10) - 1;
if (UUserCard.substring(10, 12) < month || UUserCard.substring(10, 12) == month && UUserCard.substring(12, 14) <= day) {
age++;
}
return age
}
複製代碼
//vue購物車金額結算
window.onload = function() {
var vm = new Vue({
el: '#app',
data: {
items: [{
id: 1,
name: "蘋果",
price: 10,
count: 1,
url: "http://www.jq22.com/img/cs/500x500-1.png"
},
{
id: 2,
name: "蝴蝶",
price: 8,
count: 5,
url: "http://www.jq22.com/img/cs/500x500-2.png"
},
{
id: 3,
name: "小狗",
price: 100,
count: 1,
url: "http://www.jq22.com/img/cs/500x500-3.png"
},
{
id: 4,
name: "鮮花",
price: 10,
count: 1,
url: "http://www.jq22.com/img/cs/500x500-4.png"
}
],
search: ""
},
methods: {
},
filters: { //過濾器
numFilter: function(data, n) { //data==item.price 當前過濾的數據 n==2
return "¥" + data.toFixed(n)
}
},
computed: { //計算屬性
totalCount: function() {
var n = 0;
this.items.forEach((v, i) => {
n += v.count
});
return n;
},
totalPrice: function() {
var money = 0;
this.items.forEach((v, i) => {
money += v.count * v.price
});
return money;
},
searchFor: function() {
if (!this.search) {
return this.items
}
return this.items.filter((v, i) => {
if (v.name.indexOf(this.search) !== -1) { //匹配成功
return v
}
})
}
}
})
}
//設置iframe高度
function setIframeHeight(sonH) { //debugger;
var height = 0;
//比較父子頁面高度,以高度更大的爲準
var parentH = $(window).height(); //iframe最小高度應爲瀏覽器視口高度,不然門戶管理頁面彈窗大小會受限制
height = parentH > sonH ? parentH : sonH;
$('#mainIframe').height(height);
//子頁面有傳值過來,覆蓋iframe的最小高度-2000px
$("#mainIframe").css("min-height", 'auto');
$(".body-bg").css("height", height + 200);
try {
var childBody = $("#mainIframe")[0].contentWindow.document.getElementsByTagName("body")[0];
//childBody.style.minHeight = height + "px";
} catch (error) {
if (error.message.indexOf("Blocked from frame") > -1) console.warn("當前頁面存在跨域!");
}
}
(function($) {
$("#username").keyup(function(event) {
if (event.keyCode == 13) $("#password").focus().select();
});
$("#password").keyup(function(event) {
if (event.keyCode == 13) $("#login-button").click();
});
})(jQuery);
//回到頂部
function goTop() {
window.scrollTo({
top: 0,
behavior: 'smooth',
});
}
window.onscroll = function() {
var t = document.documentElement.scrollTop;
if (t > 50) {
$(".toTop").fadeIn();
} else {
$(".toTop").fadeOut();
}
}
function urlAnalysis() {
var url = window.location.href;
var paraString = url.substring(url.indexOf("?") + 1, url.length);
var indexFirst = paraString.indexOf("&");
var paraStringTitle = paraString.slice(0, indexFirst);
paraStringElse = paraString.slice(indexFirst + 1, paraString.length);
var paraStringUrl = paraStringElse;
//區分是否傳參:functionId
if (paraString.indexOf("functionId") > -1) {
var indexSecond = paraStringElse.indexOf("&");
var paraStringFId = paraStringElse.slice(0, indexSecond);
var functionId = paraStringFId.split("=")[1];
var $body = angular.element(document.body);
var $rootScope = $body.scope().$root;
$rootScope.navFunctionId = functionId;
paraStringUrl = paraStringElse.slice(indexSecond + 1, paraStringElse.length);
}
var title = paraStringTitle.split("=")[1] === "undefined" ? "" : decodeURI(paraStringTitle.split("=")[1]);
var indexUrl = paraStringUrl.indexOf("=");
var iframeUrl = paraStringUrl.slice(indexUrl + 1, paraStringUrl.length);
document.title = title;
$("#mainIframe").attr("src", iframeUrl);
}
// 監聽enter按下事件,頁面跳轉
$scope.enterEvent = function(e) {
var keycode = window.event ? e.keyCode : e.which;
if (keycode == 13) {
console.log($scope.searchVal)
console.log('監聽成功')
var baseUrl = '#/pages/knowlege/knowlegeSeach.html'
window.open(baseUrl)
}
};
function showDate() {
var myDate = new Date();
var year = myDate.getFullYear();
var month = myDate.getMonth() + 1;
month = month < 10 ? '0' + month : month;
var date = myDate.getDate();
date = date < 10 ? '0' + date : date;
var weekDay = myDate.getDay();
switch (weekDay) {
case 0:
weekDay = "天";
break;
case 1:
weekDay = "一";
break;
case 2:
weekDay = "二";
break;
case 3:
weekDay = "三";
break;
case 4:
weekDay = "四";
break;
case 5:
weekDay = "五";
break;
case 6:
weekDay = "六";
break;
"name"
}
$scope.year = year;
$scope.month = month;
$scope.date = date;
$scope.weekDay = weekDay;
}
//獲取跳轉的classId,經過hash方式獲取
$scope.getQueryString = function() {
var obg = {},
a = '';
(a = window.location.search.substr(1)) || (a = window.location.hash.split('?')[1])
a.split(/&/g).forEach(function(item) {
obg[(item = item.split('='))[0]] = item[1];
})
return obg
}
var classId = $scope.getQueryString();
複製代碼
//event.clientX:鼠標點下的點到左側x軸的距離
window.onload = function() {
//事件處理 onmousedown onmousemove onmouseup
var box = document.querySelector(".box")
var btn = document.querySelector(".btn")
var bg = document.querySelector(".bg")
var text1 = document.querySelector(".text")
//封裝的選擇器 聲明式函數能夠提高
// function fun(){
//
// }
var flag = false; //標記
btn.onmousedown = function(event) {
var downx = event.clientX; //按下後獲取的與x軸的距離
btn.onmousemove = function(e) {
var movex = e.clientX - downx; //滑塊滑動的距離
//移動的範圍
if (movex > 0) {
this.style.left = movex + "px";
bg.style.width = movex + "px";
if (movex >= box.offsetWidth - 40) {
//驗證成功
flag = true
text1.innerHTML = "驗證成功"
text1.style.color = "#fff"
//清除事件
btn.onmousedown = null;
btn.onmousemove = null;
}
}
}
}
//鬆開事件
btn.onmouseup = function() {
//清除事件
btn.onmousemove = null;
if (flag) return;
this.style.left = 0;
bg.style.width = 0 + "px";
}
}
複製代碼
//隨機[m,n]之間的整數 封裝
function randomNumber(m, n) {
return Math.floor(Math.random() * (n - m + 1) + m);
}
//隨機顏色 封裝
function randomColor() {
return "rgb(" + randomNumber(0, 255) + "," + randomNumber(0, 255) + "," + randomNumber(0, 255) + ")";
}
//獲取當前的scrollTop
var scrollTopDistance;
//獲取全部的ul
var uls = document.querySelectorAll("ul");
var i = 0;
var k = i;
function waterFall() {
for (i = k; i < k + 4; i++) {
//建立li
var li = document.createElement("li");
//隨機顏色
li.style.backgroundColor = randomColor();
//隨機高度
li.style.height = randomNumber(120, 400) + "px";
//手動轉換爲字符串
li.innerHTML = i + 1 + "";
//插入到對應的ul中
//判斷哪一個ul的高度低,該次建立的li就插入到此ul中
var index = 0; //記錄下標
for (var j = 0; j < uls.length; j++) {
if (uls[j].offsetHeight < uls[index].offsetHeight) {
index = j;
}
}
//將元素節點插入文檔中
uls[index].appendChild(li);
}
k = i;
return uls[index].offsetHeight;
}
waterFall();
//鼠標滾輪事件,因爲右側沒有滾輪,因此使用onmousewheel事件
window.onmousewheel = function() {
//獲取窗口的高度,要兼容瀏覽器
var windowH = document.documentElement.clientHeight;
//滾輪於top的距離,要兼容瀏覽器
var scrollH = document.documentElement.scrollTop ||
document.body.scrollTop;
//獲取窗口的可見高度
var documentH = document.documentElement.scrollHeight ||
document.body.scrollHeight;
//窗口的高度 + 滾輪與頂部的距離 > 窗口的可見高度-200
if (windowH + scrollH > documentH - 200) {
//執行此函數
waterFall()
}
}
複製代碼
$(*function* () {
*var* w_max = 0;
*//求最大高度*
$("#MenuNavigation li").each(*function* () {
*var* w = $(*this*).innerWidth();
w_max = w > w_max ? w : w_max;
})
$("#MenuNavigation li").width(w_max)
*//將最大高度賦值給全部元素,*
})
複製代碼
// 封裝本地存儲的方法
export const storage = {
set: function(variable, value, ttl_ms) {
var data = { value: value, expires_at: new Date(ttl_ms).getTime() };
localStorage.setItem(variable.toString(), JSON.stringify(data));
},
get: function(variable) {
var data = JSON.parse(localStorage.getItem(variable.toString()));
if (data !== null) {
debugger
if (data.expires_at !== null && data.expires_at < new Date().getTime()) {
localStorage.removeItem(variable.toString());
} else {
return data.value;
}
}
return null;
},
remove(key) {
localStorage.removeItem(key);
}
}
複製代碼
//數組降維
reduceDimension(arr) {
var reduced = [];
for (var i = 0; i < arr.length; i++) {
reduced = reduced.concat(arr[i]);
}
return reduced;
}
複製代碼
var cookieUtil = {
getCookie: function (name) {
var arrCookie = document.cookie.split("; ");
for (var i = 0; i < arrCookie.length; i++) {
var cookieItem = arrCookie[i].split('=');
if (cookieItem[0] == name) {
return cookieItem[1];
}
}
return undefined;
},
setCookie: function (name, value, expires, path, domain, secure) {
var cookieText = encodeURIComponent(name) + "=" +
encodeURIComponent(value);
if (expires instanceof Date) {
cookieText += "; expires=" + expires.toGMTString();
}
if (path) {
cookieText += "; path=" + path;
}
if (domain) {
cookieText += "; domain=" + domain;
}
if (secure) {
cookieText += "; secure";
}
document.cookie = cookieText;
},
removeCookie: function (name, path, domain, secure) {
this.set(name, "", new Date(0), path, domain, secure);
}
}
複製代碼
/** * @description 判讀是否爲外鏈 * @param path * @returns {boolean} */
export function isExternal(path) {
return /^(https?:|mailto:|tel:)/.test(path);
}
複製代碼
/** * @description 校驗密碼是否小於6位 * @param str * @returns {boolean} */
export function isPassword(str) {
return str.length >= 6;
}
複製代碼
/** * @description 判斷是否爲數字 * @param value * @returns {boolean} */
export function isNumber(value) {
const reg = /^[0-9]*$/;
return reg.test(value);
}
複製代碼
/** * @description 判斷是不是名稱 * @param value * @returns {boolean} */
export function isName(value) {
const reg = /^[\u4e00-\u9fa5a-zA-Z0-9]+$/;
return reg.test(value);
}
複製代碼
/** * @description 判斷是否爲IP * @param ip * @returns {boolean} */
export function isIP(ip) {
const reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
return reg.test(ip);
}
複製代碼
/** * @description 判斷是不是傳統網站 * @param url * @returns {boolean} */
export function isUrl(url) {
const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/;
return reg.test(url);
}
複製代碼
/** * @description 判斷是不是小寫字母 * @param str * @returns {boolean} */
export function isLowerCase(str) {
const reg = /^[a-z]+$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是不是大寫字母 * @param str * @returns {boolean} */
export function isUpperCase(str) {
const reg = /^[A-Z]+$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是不是大寫字母開頭 * @param str * @returns {boolean} */
export function isAlphabets(str) {
const reg = /^[A-Za-z]+$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是不是字符串 * @param str * @returns {boolean} */
export function isString(str) {
return typeof str === "string" || str instanceof String;
}
複製代碼
/** * @description 判斷是不是數組 * @param arg * @returns {arg is any[]|boolean} */
export function isArray(arg) {
if (typeof Array.isArray === "undefined") {
return Object.prototype.toString.call(arg) === "[object Array]";
}
return Array.isArray(arg);
}
複製代碼
/** * @description 判斷是不是端口號 * @param str * @returns {boolean} */
export function isPort(str) {
const reg = /^([0-9]|[1-9]\d|[1-9]\d{2}|[1-9]\d{3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是不是手機號 * @param str * @returns {boolean} */
export function isPhone(str) {
const reg = /^1\d{10}$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是不是身份證號(第二代) * @param str * @returns {boolean} */
export function isIdCard(str) {
const reg = /^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是不是郵箱 * @param str * @returns {boolean} */
export function isEmail(str) {
const reg = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是否中文 * @param str * @returns {boolean} */
export function isChina(str) {
const reg = /^[\u4E00-\u9FA5]{2,4}$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是否爲空 * @param str * @returns {boolean} */
export function isBlank(str) {
return (
str == null ||
false ||
str === "" ||
str.trim() === "" ||
str.toLocaleLowerCase().trim() === "null"
);
}
複製代碼
/** * @description 判斷是否爲固話 * @param str * @returns {boolean} */
export function isTel(str) {
const reg = /^(400|800)([0-9\\-]{7,10})|(([0-9]{4}|[0-9]{3})(-| )?)?([0-9]{7,8})((-| |轉)*([0-9]{1,4}))?$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷是否爲數字且最多兩位小數 * @param str * @returns {boolean} */
export function isNum(str) {
const reg = /^\d+(\.\d{1,2})?$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷經度 -180.0~+180.0(整數部分爲0~180,必須輸入1到5位小數) * @param str * @returns {boolean} */
export function isLongitude(str) {
const reg = /^[-|+]?(0?\d{1,2}\.\d{1,5}|1[0-7]?\d{1}\.\d{1,5}|180\.0{1,5})$/;
return reg.test(str);
}
複製代碼
/** * @description 判斷緯度 -90.0~+90.0(整數部分爲0~90,必須輸入1到5位小數) * @param str * @returns {boolean} */
export function isLatitude(str) {
const reg = /^[-|+]?([0-8]?\d{1}\.\d{1,5}|90\.0{1,5})$/;
return reg.test(str);
}
複製代碼
/** * @description rtsp校驗,只要有rtsp:// * @param str * @returns {boolean} */
export function isRTSP(str) {
const reg = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
const reg1 = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5]):[0-9]{1,5}/;
const reg2 = /^rtsp:\/\/([a-z]{0,10}:.{0,10}@)?(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\//;
return reg.test(str) || reg1.test(str) || reg2.test(str);
}
複製代碼
function IEVersion() {
var userAgent = navigator.userAgent; //取得瀏覽器的userAgent字符串
var isIE = userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1; //判斷是否IE<11瀏覽器
var isEdge = userAgent.indexOf("Edge") > -1 && !isIE; //判斷是否IE的Edge瀏覽器
var isIE11 = userAgent.indexOf('Trident') > -1 && userAgent.indexOf("rv:11.0") > -1;
if (isIE) {
var reIE = new RegExp("MSIE (\\d+\\.\\d+);");
reIE.test(userAgent);
var fIEVersion = parseFloat(RegExp["$1"]);
if (fIEVersion == 7) {
return 7;
} else if (fIEVersion == 8) {
return 8;
} else if (fIEVersion == 9) {
return 9;
} else if (fIEVersion == 10) {
return 10;
} else {
return 6; //IE版本<=7
}
} else if (isEdge) {
return 'edge'; //edge
} else if (isIE11) {
return 11; //IE11
} else {
return -1; //不是ie瀏覽器
}
}
複製代碼
Set + ...
function noRepeat(arr) {
return [...new Set(arr)];
}
noRepeat([1,2,3,1,2,3])
複製代碼
Set + Array.from
function noRepeat(arr) {
return Array.from(new Set(arr));
}
noRepeat([1,2,3,1,2,3])
複製代碼
function noRepeat(arr) {
return arr.filter((v, idx)=>idx == arr.lastIndexOf(v))
}
noRepeat([1,2,3,1,2,3])
複製代碼
Object 的特性是 Key 不會重複。 這裏使用 values 是由於能夠保留類型,keys 會變成字符串。vue
function noRepeat(arr) {
return Object.values(arr.reduce((s,n)=>{
s[n] = n;
return s
},{}))
}
noRepeat([1,2,3,1,2,3])
複製代碼
針對於上述的方案,還有其餘變種實現。java
Math.max + ...
function arrayMax(arr) {
return Math.max(...arr);
}
arrayMax([-1,-4,5,2,0])
複製代碼
Math.max + apply
function arrayMax(arr) {
return Math.max.apply(Math, arr)
}
arrayMax([-1,-4,5,2,0])
複製代碼
Math.max
+ 遍歷function arrayMax(arr) {
return arr.reduce((s,n)=>Math.max(s, n))
}
arrayMax([-1,-4,5,2,0])
複製代碼
function arrayMax(arr) {
return arr.reduce((s,n)=>s>n?s:n)
}
arrayMax([-1,-4,5,2,0])
複製代碼
function arrayMax(arr) {
return arr.sort((n,m)=>m-n)[0]
}
arrayMax([-1,-4,5,2,0])
複製代碼
同上,不明白爲何要分紅兩個題目。node
Math.max
換成 Math.min
s>n?s:n
換成 `s(n,m)=>m-n
換成 (n,m)=>n-m
,或者直接取最後一個元素function chunk(arr, size = 1) {
return Array.from(
{
length: Math.ceil(arr.length / size),
},
(v, i) => arr.slice(i * size, i * size + size)
);
}
chunk([1,2,3,4,5,6,7,8],3)
複製代碼
function chunk(arr, size = 1) {
return Array.from(
{
length: Math.ceil(arr.length / size),
},
(v, i) => arr.splice(0, size)
);
}
chunk([1,2,3,4,5,6,7,8],3)
複製代碼
function chunk(arr, size = 1) {
var _returnArr = [];
while(arr.length){
_returnArr.push(arr.splice(0, size))
}
return _returnArr
}
chunk([1,2,3,4,5,6,7,8],3)
複製代碼
function countOccurrences(arr, value) {
return arr.reduce((a, v) => (v === value ? a + 1 : a + 0), 0);
}
countOccurrences([1,2,3,4,5,1,2,1,2,3], 1)
複製代碼
function countOccurrences(arr, value) {
return arr.filter(v=>v===value).length
}
countOccurrences([1,2,3,4,5,1,2,1,2,3], 1)
複製代碼
function flatten(arr, depth = -1) {
if (depth === -1) {
return [].concat(
...arr.map((v) => (Array.isArray(v) ? this.flatten(v) : v))
);
}
if (depth === 1) {
return arr.reduce((a, v) => a.concat(v), []);
}
return arr.reduce(
(a, v) => a.concat(Array.isArray(v) ? this.flatten(v, depth - 1) : v),
[]
);
}
flatten([1,[2,[3]]])
複製代碼
function flatten(arr, depth = Infinity) {
return arr.flat(depth)
}
flatten([1,[2,[3]]])
複製代碼
他原文有問題,如下方法的 4,5
沒有返回linux
function diffrence(arrA, arrB) {
return arrA.filter((v) => !arrB.includes(v));
}
diffrence([1,2,3], [3,4,5,2])
複製代碼
須要再操做一遍android
function diffrence(arrA, arrB) {
return arrA.filter((v) => !arrB.includes(v))
.concat(arrB.filter((v) => !arrA.includes(v)));
}
diffrence([1,2,3], [3,4,5,2])
複製代碼
算是方案1的變種吧,優化了 includes
的性能。ios
function intersection(arr1, arr2) {
return arr2.filter((v) => arr1.includes(v));
}
intersection([1,2,3], [3,4,5,2])
複製代碼
function intersection(arr1, arr2) {
var set = new Set(arr2)
return arr1.filter((v) => set.has(v));
}
intersection([1,2,3], [3,4,5,2])
複製代碼
function dropRight(arr, n = 0) {
return n < arr.length ? arr.slice(0, arr.length - n) : [];
}
dropRight([1,2,3,4,5], 2)
複製代碼
function dropRight(arr, n = 0) {
return arr.splice(0, arr.length - n)
}
dropRight([1,2,3,4,5], 2)
複製代碼
function dropRight(arr, n = 0) {
return arr.slice(0, -n)
}
dropRight([1,2,3,4,5], 2)
複製代碼
function dropRight(arr, n = 0) {
arr.length = Math.max(arr.length - n, 0)
return arr
}
dropRight([1,2,3,4,5], 2)
複製代碼
function dropElements(arr, fn) {
while (arr.length && !fn(arr[0])) arr = arr.slice(1);
return arr;
}
dropElements([1,2,3,4,5,1,2,3], (v) => v == 2)
複製代碼
function dropElements(arr, fn) {
return arr.slice(Math.max(arr.findIndex(fn), 0));
}
dropElements([1,2,3,4,5,1,2,3], (v) => v === 3)
複製代碼
function dropElements(arr, fn) {
while (arr.length && !fn(arr[0])) arr.splice(0,1);
return arr;
}
dropElements([1,2,3,4,5,1,2,3], (v) => v == 2)
複製代碼
function everyNth(arr, nth) {
return arr.filter((v, i) => i % nth === nth - 1);
}
everyNth([1,2,3,4,5,6,7,8], 2)
複製代碼
function everyNth(arr, nth) {
return arr.filter((v, i) => (i+1) % nth === 0);
}
everyNth([1,2,3,4,5,6,7,8], 2)
複製代碼
function nthElement(arr, n = 0) {
return (n >= 0 ? arr.slice(n, n + 1) : arr.slice(n))[0];
}
nthElement([1,2,3,4,5], 0)
nthElement([1,2,3,4,5], -1)
複製代碼
function nthElement(arr, n = 0) {
return (n >= 0 ? arr[0] : arr[arr.length + n])
}
nthElement([1,2,3,4,5], 0)
nthElement([1,2,3,4,5], -1)
複製代碼
function head(arr) {
return arr[0];
}
head([1,2,3,4])
複製代碼
function head(arr) {
return arr.slice(0,1)[0];
}
head([1,2,3,4])
複製代碼
function last(arr) {
return arr[arr.length - 1];
}
複製代碼
function last(arr) {
return arr.slice(-1)[0];
}
last([1,2,3,4,5])
複製代碼
function shuffle(arr) {
let array = arr;
let index = array.length;
while (index) {
index -= 1;
let randomInedx = Math.floor(Math.random() * index);
let middleware = array[index];
array[index] = array[randomInedx];
array[randomInedx] = middleware;
}
return array;
}
shuffle([1,2,3,4,5])
複製代碼
function shuffle(arr) {
return arr.sort((n,m)=>Math.random() - .5)
}
shuffle([1,2,3,4,5])
複製代碼
Array.from({length: 2})
複製代碼
Array.prototype.slice.call({length: 2,1:1})
複製代碼
Array.prototype.splice.call({length: 2,1:1},0)
複製代碼
/** * 告知瀏覽器支持的指定css屬性狀況 * @param {String} key - css屬性,是屬性的名字,不須要加前綴 * @returns {String} - 支持的屬性狀況 */
function validateCssKey(key) {
const jsKey = toCamelCase(key); // 有些css屬性是連字符號造成
if (jsKey in document.documentElement.style) {
return key;
}
let validKey = "";
// 屬性名爲前綴在js中的形式,屬性值是前綴在css中的形式
// 經嘗試,Webkit 也但是首字母小寫 webkit
const prefixMap = {
Webkit: "-webkit-",
Moz: "-moz-",
ms: "-ms-",
O: "-o-",
};
for (const jsPrefix in prefixMap) {
const styleKey = toCamelCase(`${jsPrefix}-${jsKey}`);
if (styleKey in document.documentElement.style) {
validKey = prefixMap[jsPrefix] + key;
break;
}
}
return validKey;
}
/** * 把有連字符號的字符串轉化爲駝峯命名法的字符串 */
function toCamelCase(value) {
return value.replace(/-(\w)/g, (matched, letter) => {
return letter.toUpperCase();
});
}
/** * 檢查瀏覽器是否支持某個css屬性值(es6版) * @param {String} key - 檢查的屬性值所屬的css屬性名 * @param {String} value - 要檢查的css屬性值(不要帶前綴) * @returns {String} - 返回瀏覽器支持的屬性值 */
function valiateCssValue(key, value) {
const prefix = ["-o-", "-ms-", "-moz-", "-webkit-", ""];
const prefixValue = prefix.map((item) => {
return item + value;
});
const element = document.createElement("div");
const eleStyle = element.style;
// 應用每一個前綴的狀況,且最後也要應用上沒有前綴的狀況,看最後瀏覽器起效的何種狀況
// 這就是最好在prefix裏的最後一個元素是''
prefixValue.forEach((item) => {
eleStyle[key] = item;
});
return eleStyle[key];
}
/** * 檢查瀏覽器是否支持某個css屬性值 * @param {String} key - 檢查的屬性值所屬的css屬性名 * @param {String} value - 要檢查的css屬性值(不要帶前綴) * @returns {String} - 返回瀏覽器支持的屬性值 */
function valiateCssValue(key, value) {
var prefix = ["-o-", "-ms-", "-moz-", "-webkit-", ""];
var prefixValue = [];
for (var i = 0; i < prefix.length; i++) {
prefixValue.push(prefix[i] + value);
}
var element = document.createElement("div");
var eleStyle = element.style;
for (var j = 0; j < prefixValue.length; j++) {
eleStyle[key] = prefixValue[j];
}
return eleStyle[key];
}
function validCss(key, value) {
const validCss = validateCssKey(key);
if (validCss) {
return validCss;
}
return valiateCssValue(key, value);
}
複製代碼
segmentfault.com/a/11... 它裏面有 forEach。git
function currentURL() {
return window.location.href;
}
currentURL()
複製代碼
function currentURL() {
var el = document.createElement('a')
el.href = ''
return el.href
}
currentURL()
複製代碼
function getScrollPosition(el = window) {
return {
x: el.pageXOffset !== undefined ? el.pageXOffset : el.scrollLeft,
y: el.pageYOffset !== undefined ? el.pageYOffset : el.scrollTop,
};
}
複製代碼
function getURLParameters(url) {
return url
.match(/([^?=&]+)(=([^&]*))/g)
.reduce(
(a, v) => (
(a[v.slice(0, v.indexOf("="))] = v.slice(v.indexOf("=") + 1)), a
),
{}
);
}
getURLParameters(location.href)
複製代碼
function getURLParameters(url) {
return url
.split('?') //取?分割
.slice(1) //不要第一部分
.join() //拼接
.split('&')//&分割
.map(v=>v.split('=')) //=分割
.reduce((s,n)=>{s[n[0]] = n[1];return s},{})
}
getURLParameters(location.href)
// getURLParameters('')
複製代碼
function redirect(url, asLink = true) {
asLink ? (window.location.href = url) : window.location.replace(url);
}
複製代碼
function redirect(url, asLink = true) {
asLink ? window.location.assign(url) : window.location.replace(url);
}
複製代碼
c 沒有定義
function scrollToTop() {
const scrollTop =
document.documentElement.scrollTop || document.body.scrollTop;
if (scrollTop > 0) {
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0, c - c / 8);
} else {
window.cancelAnimationFrame(scrollToTop);
}
}
scrollToTop()
複製代碼
修正以後
function scrollToTop() {
const scrollTop =
document.documentElement.scrollTop || document.body.scrollTop;
if (scrollTop > 0) {
window.requestAnimationFrame(scrollToTop);
window.scrollTo(0, scrollTop - scrollTop / 8);
} else {
window.cancelAnimationFrame(scrollToTop);
}
}
scrollToTop()
複製代碼
function copy(str) {
const el = document.createElement("textarea");
el.value = str;
el.setAttribute("readonly", "");
el.style.position = "absolute";
el.style.left = "-9999px";
el.style.top = "-9999px";
document.body.appendChild(el);
const selected =
document.getSelection().rangeCount > 0
? document.getSelection().getRangeAt(0)
: false;
el.select();
document.execCommand("copy");
document.body.removeChild(el);
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
}
複製代碼
function detectDeviceType() {
return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(
navigator.userAgent
)
? "Mobile"
: "Desktop";
}
detectDeviceType()
複製代碼
function detectDeviceType() {
return ("ontouchstart" in window || navigator.msMaxTouchPoints)
? "Mobile"
: "Desktop";
}
detectDeviceType()
複製代碼
function setCookie(key, value, expiredays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + expiredays);
document.cookie =
key +
"=" +
escape(value) +
(expiredays == null ? "" : ";expires=" + exdate.toGMTString());
}
複製代碼
function delCookie(name) {
var exp = new Date();
exp.setTime(exp.getTime() - 1);
var cval = getCookie(name);
if (cval != null) {
document.cookie = name + "=" + cval + ";expires=" + exp.toGMTString();
}
}
複製代碼
function getCookie(name) {
var arr,
reg = new RegExp("(^| )" + name + "=([^;]*)(;|$)");
if ((arr = document.cookie.match(reg))) {
return arr[2];
} else {
return null;
}
}
複製代碼
有時候咱們想清空,可是又沒法獲取到全部的cookie。 這個時候咱們能夠了利用寫滿,而後再清空的辦法。
function timestampToTime(timestamp = Date.parse(new Date()), isMs = true) {
const date = new Date(timestamp * (isMs ? 1 : 1000));
return `${date.getFullYear()}-${ date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1 }-${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}`;
}
複製代碼
若是作海外的話,還會有時區問題,通常我用moment解決。若是想看原生的
基於上一個想到的問題
/** * 功能描述:一些業務場景,如彈框出現時,須要禁止頁面滾動,這是兼容安卓和 iOS 禁止頁面滾動的解決方案 */
let scrollTop = 0;
function preventScroll() {
// 存儲當前滾動位置
scrollTop = window.scrollY;
// 將可滾動區域固定定位,可滾動區域高度爲 0 後就不能滾動了
document.body.style["overflow-y"] = "hidden";
document.body.style.position = "fixed";
document.body.style.width = "100%";
document.body.style.top = -scrollTop + "px";
// document.body.style['overscroll-behavior'] = 'none'
}
function recoverScroll() {
document.body.style["overflow-y"] = "auto";
document.body.style.position = "static";
// document.querySelector('body').style['overscroll-behavior'] = 'none'
window.scrollTo(0, scrollTop);
}
複製代碼
function bottomVisible() {
return (
document.documentElement.clientHeight + window.scrollY >=
(document.documentElement.scrollHeight ||
document.documentElement.clientHeight)
);
}
複製代碼
function elementIsVisibleInViewport(el, partiallyVisible = false) {
const { top, left, bottom, right } = el.getBoundingClientRect();
return partiallyVisible
? ((top > 0 && top < innerHeight) ||
(bottom > 0 && bottom < innerHeight)) &&
((left > 0 && left < innerWidth) || (right > 0 && right < innerWidth))
: top >= 0 && left >= 0 && bottom <= innerHeight && right <= innerWidth;
}
複製代碼
function getStyle(el, ruleName) {
return getComputedStyle(el, null).getPropertyValue(ruleName);
}
複製代碼
function launchFullscreen(element) {
if (element.requestFullscreen) {
element.requestFullscreen();
} else if (element.mozRequestFullScreen) {
element.mozRequestFullScreen();
} else if (element.msRequestFullscreen) {
element.msRequestFullscreen();
} else if (element.webkitRequestFullscreen) {
element.webkitRequestFullScreen();
}
}
launchFullscreen(document.documentElement);
launchFullscreen(document.getElementById("id")); //某個元素進入全屏
複製代碼
function exitFullscreen() {
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.msExitFullscreen) {
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) {
document.mozCancelFullScreen();
} else if (document.webkitExitFullscreen) {
document.webkitExitFullscreen();
}
}
exitFullscreen();
複製代碼
document.addEventListener("fullscreenchange", function (e) {
if (document.fullscreenElement) {
console.log("進入全屏");
} else {
console.log("退出全屏");
}
});
複製代碼
function commafy(num) {
return num.toString().indexOf(".") !== -1
? num.toLocaleString()
: num.toString().replace(/(\d)(?=(?:\d{3})+$)/g, "$1,");
}
commafy(1000)
複製代碼
function randomNum(min, max) {
switch (arguments.length) {
case 1:
return parseInt(Math.random() * min + 1, 10);
case 2:
return parseInt(Math.random() * (max - min + 1) + min, 10);
default:
return 0;
}
}
randomNum(1,10)
複製代碼
/* 時間戳轉時間 */
function timestampToTime(cjsj) {
var date = new Date(cjsj); //時間戳爲10位需*1000,時間戳爲13位的話不需乘1000
var Y = date.getFullYear() + '-';
var M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var D = (date.getDate() + 1 < 10 ? '0' + (date.getDate()) : date.getDate()) + ' ';
return Y + M + D
}
複製代碼
/* 過濾富文本和空格爲純文本 */
function filterHtml(str) {
return str.replace(/<[^<>]+>/g, '').replace(/ /ig, '');
}
複製代碼
/*指定顯示的文字數量多餘的使用省略號代替*/
function strEllp(str, num = str.length) {
var subStr = str.substring(0, num);
return subStr + (str.length > num ? '...' : '');
}
複製代碼
// 獲取滾動條當前的位置
function getScrollTop() {
var scrollTop = 0
if (document.documentElement && document.documentElement.scrollTop) {
scrollTop = document.documentElement.scrollTop;
} else if (document.body) {
scrollTop = document.body.scrollTop;
}
return scrollTop
}
複製代碼
// 獲取當前可視範圍的高度
function getClientHeight() {
var clientHeight = 0
if (document.body.clientHeight && document.documentElement.clientHeight) {
clientHeight = Math.min(document.body.clientHeight, document.documentElement.clientHeight)
} else {
clientHeight = Math.max(document.body.clientHeight, document.documentElement.clientHeight)
}
return clientHeight
}
複製代碼
// 獲取文檔完整的高度
function getScrollHeight() {
return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight)
}
複製代碼