代码优化
This commit is contained in:
parent
003aa52781
commit
471b0f777a
|
@ -1,11 +1,15 @@
|
|||
const unsupportFeatures = (()=>{
|
||||
function runCodeWithFunction(obj) {
|
||||
return Function('"use strict";return (' + obj + ")")();
|
||||
}
|
||||
|
||||
const features = [
|
||||
{name: "Optional chaining (?.) / 可选链操作符(?.)", version:{firefox:74,chrome:80,safari:13.4}, url: "https://caniuse.com/mdn-javascript_operators_optional_chaining", test: ()=>Boolean(eval("undefined?.undefined || true"))},
|
||||
{name: "Nullish coalescing operator (??) / 空值合并操作符(??)", version:{firefox:72,chrome:80,safari:13.4}, url: "https://caniuse.com/mdn-javascript_operators_nullish_coalescing", test: ()=>Boolean(eval("undefined ?? true"))},
|
||||
{name: "BigInt value (1n) / BigInt 数据类型(1n)", version:{firefox:79,chrome:67,safari:14}, url: "https://caniuse.com/bigint", test: ()=>Boolean(eval("1n"))},
|
||||
{name: "Optional chaining (?.) / 可选链操作符(?.)", version:{firefox:74,chrome:80,safari:13.4}, url: "https://caniuse.com/mdn-javascript_operators_optional_chaining", test: ()=>Boolean(runCodeWithFunction("undefined?.undefined || true"))},
|
||||
{name: "Nullish coalescing operator (??) / 空值合并操作符(??)", version:{firefox:72,chrome:80,safari:13.4}, url: "https://caniuse.com/mdn-javascript_operators_nullish_coalescing", test: ()=>Boolean(runCodeWithFunction("undefined ?? true"))},
|
||||
{name: "BigInt value (1n) / BigInt 数据类型(1n)", version:{firefox:79,chrome:67,safari:14}, url: "https://caniuse.com/bigint", test: ()=>Boolean(runCodeWithFunction("1n"))},
|
||||
// {name: "CSS selector: :is() / CSS选择器: :is()", version:{firefox:78,chrome:88,safari:14}, url: "https://caniuse.com/css-matches-pseudo", test: ()=>Boolean(eval("document.querySelector(':is()') || true"))},
|
||||
// {name: "CSS selector: :where() / CSS选择器: :where()", version:{firefox:78,chrome:88,safari:14}, url: "https://caniuse.com/mdn-css_selectors_where", test: ()=>Boolean(eval("document.querySelector(':where()') || true"))},
|
||||
{name: "CSS selector: :not() / CSS选择器: :not()", version:{firefox:84,chrome:88,safari:9}, url: "https://caniuse.com/css-not-sel-list", test: ()=>Boolean(eval("document.querySelector(':not(html)') || true"))},
|
||||
{name: "CSS selector: :not() / CSS选择器: :not()", version:{firefox:84,chrome:88,safari:9}, url: "https://caniuse.com/css-not-sel-list", test: ()=>Boolean(runCodeWithFunction("document.querySelector(':not(html)') || true"))},
|
||||
// {name: "Private class fields (#name) / 类私有域(#name)", version:{firefox:90,chrome:74,safari:14.5}, url: "https://caniuse.com/mdn-javascript_classes_private_class_fields", test: ()=>Boolean(eval("class test {#v = 0;}; true;"))},
|
||||
// {name: "Dialog element / Dialog 元素", version:{firefox:98,chrome:37,safari:15.4}, url: "https://caniuse.com/dialog", test: ()=>Boolean(eval("HTMLDialogElement"))},
|
||||
]
|
||||
|
@ -64,10 +68,7 @@ Please update your browser core to Firefox ≥ ${needBrowserVersion.firefox} or
|
|||
document.write(alertStr);
|
||||
}
|
||||
|
||||
let denied = ((UA)=>{
|
||||
return /\b(?:MicroMessenger|WeChat|Weixin|QQ|AliApp)\b/.test(UA);
|
||||
})(navigator.userAgent);
|
||||
if (denied) {
|
||||
if (/\b(?:MicroMessenger|WeChat|Weixin|QQ|AliApp)\b/.test(navigator.userAgent)) {
|
||||
const mask = document.createElement("div");
|
||||
mask.id = "denied-mask";
|
||||
const css = `
|
||||
|
@ -89,12 +90,11 @@ if (denied) {
|
|||
const style = mask.appendChild(document.createElement("style"));
|
||||
style.appendChild(document.createTextNode(css));
|
||||
const alertDiv = mask.appendChild(document.createElement("div"));
|
||||
alertDiv.className = "alert"
|
||||
alertDiv.appendChild(document.createTextNode("请勿使用内置浏览"));
|
||||
alertDiv.appendChild(document.createElement("br"));
|
||||
alertDiv.appendChild(document.createTextNode("点击菜单使用正常浏览器打开↗"));
|
||||
alertDiv.className = "alert";
|
||||
alertDiv.innerHTML = `请勿使用内置浏览<br>点击菜单使用正常浏览器打开↗`;
|
||||
|
||||
window.addEventListener("load", ()=>{
|
||||
const event = window.addEventListener("load", ()=>{
|
||||
document.body.appendChild(mask);
|
||||
window.removeEventListener(event);
|
||||
});
|
||||
}
|
|
@ -1,22 +1,20 @@
|
|||
|
||||
const PADDFguideURL = function(id) {
|
||||
let url = new URL(location);
|
||||
url.searchParams.set("guide",1);
|
||||
url.searchParams.set("id",id);
|
||||
return url;
|
||||
}
|
||||
const languageList = [
|
||||
const languageList = [
|
||||
{
|
||||
name:"English",i18n:"en",searchlist:["en","ja"],
|
||||
guideURL:id=>`https://ilmina.com/#/CARD/${id}` //or (id,name)=>`http://www.puzzledragonx.com/en/search.asp?q=${name}`
|
||||
},
|
||||
{
|
||||
name:"中文(繁體)",i18n:"zh-TW",i18n_RegExp:/^zh-(?:hant-)?TW/i,searchlist:["cht","ja"],
|
||||
guideURL:PADDFguideURL
|
||||
name:"中文(傳統)",i18n:"zh-TW",i18n_RegExp:/^zh-(?:hant-)?TW/i,searchlist:["cht","ja"],
|
||||
guideURL:id=>`https://pad.chesterip.cc/${id}/`
|
||||
},
|
||||
{
|
||||
name:"中文(简体)",i18n:"zh",i18n_RegExp:/^zh-(?:hans-)?/i,searchlist:["chs","ja"],
|
||||
guideURL:PADDFguideURL
|
||||
guideURL:id=>{
|
||||
const url = new URL(location);
|
||||
url.searchParams.set("guide",1);
|
||||
url.searchParams.set("id",id);
|
||||
return url;
|
||||
}
|
||||
},
|
||||
{
|
||||
name:"日本語",i18n:"ja",searchlist:["ja"],
|
||||
|
|
|
@ -32,25 +32,26 @@ const GM_xmlhttpRequest = function(GM_param) {
|
|||
function getQueryString(name, url) {
|
||||
const urlObj = new URL(url || document.location);
|
||||
if (!Array.isArray(name)) name = [name];
|
||||
let n_e = name.entries(), n;
|
||||
let value;
|
||||
do
|
||||
{
|
||||
const n_e = name.entries();
|
||||
let n, value;
|
||||
do {
|
||||
n = n_e.next();
|
||||
if (!n.done)
|
||||
{
|
||||
value = urlObj.searchParams.get(n.value[1]);
|
||||
}
|
||||
}while(!n.done && value == undefined)
|
||||
}while(!n.done && value === undefined)
|
||||
return value;
|
||||
}
|
||||
|
||||
function localStorage_getBoolean(name, defaultValue = false){
|
||||
let value = localStorage.getItem(name);
|
||||
if (value === "true") return true;
|
||||
else return Boolean(Number(localStorage.getItem(name) ?? defaultValue));
|
||||
localStorage_getBoolean = function(name, defaultValue = false) {
|
||||
const value = localStorage.getItem(name);
|
||||
if (value === null) return defaultValue;
|
||||
else if (typeof value === 'string' && /^\s*true\s*$/i.test(value)) return true;
|
||||
else return Boolean(Number(value));
|
||||
}
|
||||
|
||||
/* 写了,但是暂时不用
|
||||
// 将字符串转为二进制字符串
|
||||
String.prototype.toUTF8Blob = function() {
|
||||
return new Blob([this.valueOf()], {
|
||||
|
@ -175,15 +176,25 @@ const Base64 = {
|
|||
Uint8Array.prototype.toHex = function() {
|
||||
return [...this].map(n=>n.toString(16).padStart(2,'0')).join('');
|
||||
}
|
||||
*/
|
||||
|
||||
//大数字缩短长度
|
||||
/**
|
||||
* 大数字以数字量级分隔符形式输出
|
||||
* @param {Array} separators 数字量级分隔符数组,从低到高排列
|
||||
* @param {number} splitDigits 分隔位数
|
||||
* @returns {function} 数字量级分隔符形式输出数字的函数
|
||||
*/
|
||||
function BigNumberToStringLocalise(separators, splitDigits = 3 ) {
|
||||
if (!Array.isArray(separators)) throw new TypeError('分隔符需要使用数组列出数字量级');
|
||||
if (!Number.isInteger(splitDigits)) throw new TypeError('数字分隔位数必须为整数');
|
||||
if (splitDigits < 1) throw new RangeError('数字分隔位数至少是1位');
|
||||
|
||||
const grouping = 10 ** splitDigits;
|
||||
separators = separators.map(s=>s.toString());
|
||||
|
||||
return function(){
|
||||
if (splitDigits < 1) throw new Error('数字分割数量至少是1位');
|
||||
if (Number.isNaN(this)) return 0..bigNumberToString();
|
||||
if (this === Infinity || this === -Infinity) return this.toLocaleString();
|
||||
const grouping = 10 ** splitDigits;
|
||||
const numParts = [];
|
||||
let numTemp = Math.abs(this);
|
||||
do {
|
||||
|
@ -193,24 +204,19 @@ function BigNumberToStringLocalise(separators, splitDigits = 3 ) {
|
|||
if (numTemp > 0) {
|
||||
numParts.push(numTemp);
|
||||
}
|
||||
let numPartsStr = numParts.map((num, idx) => {
|
||||
if (num > 0) {
|
||||
return num + separators[idx];
|
||||
} else
|
||||
return '';
|
||||
});
|
||||
|
||||
numPartsStr.reverse(); //反向
|
||||
let outStr = numPartsStr.join('');
|
||||
const negative = this < 0;
|
||||
return (negative ? "-" : "") + outStr;
|
||||
|
||||
let outStr = this < 0 ? '-' : '';
|
||||
for (let i = numParts.length; i--; ) {
|
||||
outStr += numParts[i].toString() + separators[i];
|
||||
}
|
||||
|
||||
return outStr;
|
||||
}
|
||||
}
|
||||
Number.prototype.bigNumberToString = BigNumberToStringLocalise(['', 'K ', 'M ', 'G ', 'T ', 'P ', 'E ', 'Z ', 'Y ', 'R ', 'Q '], 3);
|
||||
|
||||
//最多保留N位小数,不留0
|
||||
Number.prototype.keepCounts = function(decimalDigits = 2, plusSign = false)
|
||||
{
|
||||
Number.prototype.keepCounts = function(decimalDigits = 2, plusSign = false) {
|
||||
let newNumber = Number(this.toFixed(decimalDigits));
|
||||
return (plusSign && this > 0 ? '+' : '') + newNumber.bigNumberToString();
|
||||
}
|
||||
|
@ -254,6 +260,7 @@ Array.prototype.shuffle = function() {
|
|||
}
|
||||
return this;
|
||||
}
|
||||
//数组随机移除元素
|
||||
Array.prototype.randomShift = function() {
|
||||
return this.splice(Math.random() * this.length, 1)?.[0];
|
||||
}
|
||||
|
@ -297,11 +304,12 @@ Array.prototype.nodeJoin = function(separator)
|
|||
return frg;
|
||||
}
|
||||
|
||||
Math.randomInteger = function(max, min = 0) {
|
||||
Math.randomInteger = function(num1, num2 = 0) {
|
||||
let max = Math.max(num1, num2), min = Math.min(num1, num2);
|
||||
return this.floor(this.random() * (max - min + 1) + min);
|
||||
}
|
||||
Math.isPowerOfTwo = function(n) {
|
||||
if (Number.isInteger(0) && n > 0)
|
||||
if (Number.isInteger(n) && n > 0)
|
||||
return (n & (n - 1)) === 0;
|
||||
else
|
||||
return false;
|
||||
|
@ -320,26 +328,30 @@ function flags(num) {
|
|||
function reflags(arr) {
|
||||
return arr.reduce((pre,cur)=>pre | 1 << cur, 0);
|
||||
}
|
||||
|
||||
function aaa(...args) {
|
||||
console.log(args);
|
||||
}
|
||||
//带标签的模板字符串
|
||||
function tp(strings, ...keys) {
|
||||
return (function(...values) {
|
||||
let dict = values[values.length - 1] || {};
|
||||
let fragment = document.createDocumentFragment();
|
||||
fragment.append(strings[0]);
|
||||
keys.forEach(function(key, i, arr) {
|
||||
let value = Number.isInteger(key) ? values[key] : dict[key];
|
||||
if (value != undefined)
|
||||
{
|
||||
try{
|
||||
fragment.append(arr.lastIndexOf(key) === i ? value : value.cloneNode(true)); //如果是最后一个匹配的标签,就插入原始的DOM(保留行为),否则插入克隆的DOM
|
||||
}catch(e)
|
||||
{
|
||||
console.log("模板字符串错误: %o,", e, values, keys, value);
|
||||
function tp(stringsArr, ...keys) {
|
||||
return ((...values)=>{
|
||||
const dict = values[values.length - 1] || {};
|
||||
const fragment = document.createDocumentFragment();
|
||||
for (let i = 0; i < keys.length; i++) {
|
||||
fragment.append(stringsArr[i]);
|
||||
const key = keys[i];
|
||||
const value = Number.isInteger(key) ? values[key] : dict[key];
|
||||
if (value !== undefined) {
|
||||
try {
|
||||
fragment.append((value instanceof Node && keys.lastIndexOf(key) !== i) ? value.cloneNode(true) : value); //如果是不最后一个匹配的标签,就插入克隆的DOM,否则可以插入原始的DOM(保留行为)
|
||||
}
|
||||
catch(e) {
|
||||
console.error("模板字符串错误: %o,", e, values, keys, value);
|
||||
}
|
||||
}
|
||||
fragment.append(strings[i + 1]);
|
||||
});
|
||||
}
|
||||
//补上最后一个字符串
|
||||
fragment.append(stringsArr[keys.length]);
|
||||
|
||||
return fragment;
|
||||
});
|
||||
}
|
||||
|
@ -420,7 +432,7 @@ fetch("library/jy4340132-aaa/adpcm.wasm").then((response) => response.arrayBuffe
|
|||
// 加载 image
|
||||
function loadImage(url) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var image = new Image();
|
||||
const image = new Image();
|
||||
|
||||
image.src = url;
|
||||
image.type = "svg"
|
||||
|
@ -486,12 +498,12 @@ function dbCount (db, tableName, key) {
|
|||
|
||||
function dbReadAll (db, tableName) {
|
||||
return new Promise(async function (resolve, reject) {
|
||||
let datas = [];
|
||||
const datas = [];
|
||||
const transaction = db.transaction([tableName]);
|
||||
const objectStore = transaction.objectStore(tableName);
|
||||
const request = objectStore.openCursor();
|
||||
request.onsuccess = function(event) {
|
||||
var cursor = event.target.result;
|
||||
const cursor = event.target.result;
|
||||
if (cursor) {
|
||||
// cursor.value 包含正在被遍历的当前记录
|
||||
// 这里你可以对 result 做些什么
|
||||
|
@ -529,7 +541,7 @@ function dbDelete (db, tableName, keys) {
|
|||
request.onerror = reject;
|
||||
});
|
||||
}
|
||||
|
||||
//1个潜觉需要用多少格子
|
||||
function latentUseHole(latentId) {
|
||||
switch (latentId) {
|
||||
case 12: case 16: case 17: case 18: case 19:
|
||||
|
|
|
@ -16631,7 +16631,7 @@ const cachesMap = new Map([
|
|||
],
|
||||
[
|
||||
"browser-compatibility.js",
|
||||
"36903e3a30e841cc2d1c6dc413fc1143"
|
||||
"0fccf68a8a042f8c5bd0377a1c15d2ef"
|
||||
],
|
||||
[
|
||||
"index.html",
|
||||
|
@ -16651,15 +16651,15 @@ const cachesMap = new Map([
|
|||
],
|
||||
[
|
||||
"script-skill-parser.js",
|
||||
"148d4fd3ab71399cea01eb11548c0bd4"
|
||||
"24075cb87d2395ca5548e38aa9ebf7e0"
|
||||
],
|
||||
[
|
||||
"script-universal_function.js",
|
||||
"5a312f7758524a38bc09bf9495dd6c14"
|
||||
"73b0bd945aeb65f9fa429418740b08d5"
|
||||
],
|
||||
[
|
||||
"script.js",
|
||||
"9b6df61154eecd71ab15ea4e58400bef"
|
||||
"ed3a8cbe4715d599e7bb8da52bb76244"
|
||||
],
|
||||
[
|
||||
"solo.html",
|
||||
|
@ -16687,7 +16687,7 @@ const cachesMap = new Map([
|
|||
],
|
||||
[
|
||||
"languages/en.js",
|
||||
"e4985277782847d8a82be1da633a4d3d"
|
||||
"de3e6b1956d37a8b05a7fca4096ad3ce"
|
||||
],
|
||||
[
|
||||
"languages/ja.css",
|
||||
|
@ -16695,7 +16695,7 @@ const cachesMap = new Map([
|
|||
],
|
||||
[
|
||||
"languages/ja.js",
|
||||
"d48cb875653cb3508091172f513ee559"
|
||||
"563ae58b4ef7d7da1b7cf4885d394964"
|
||||
],
|
||||
[
|
||||
"languages/ko.css",
|
||||
|
@ -16703,11 +16703,11 @@ const cachesMap = new Map([
|
|||
],
|
||||
[
|
||||
"languages/ko.js",
|
||||
"6cf0e875eb00bccbfbe8e201ee32eb82"
|
||||
"8caabae957475d3aa7a25dc53502aecb"
|
||||
],
|
||||
[
|
||||
"languages/language-list.js",
|
||||
"9a59f04647b0374444f50451c19d4198"
|
||||
"4ee169bd95215c947f826587100ac3c3"
|
||||
],
|
||||
[
|
||||
"languages/zh-TW.css",
|
||||
|
@ -16715,7 +16715,7 @@ const cachesMap = new Map([
|
|||
],
|
||||
[
|
||||
"languages/zh-TW.js",
|
||||
"7123be42813ea728dcfdf011062b8b9e"
|
||||
"29e8b2268e88f25cf5fb059539f03b38"
|
||||
],
|
||||
[
|
||||
"languages/zh.css",
|
||||
|
@ -16723,7 +16723,7 @@ const cachesMap = new Map([
|
|||
],
|
||||
[
|
||||
"languages/zh.js",
|
||||
"dce3627bb81fa574b3036f0d100f3abc"
|
||||
"7d4ad9f384cb71bced2ab1f8c88535b7"
|
||||
],
|
||||
[
|
||||
"images/attrs.png",
|
||||
|
|
Loading…
Reference in New Issue