代码优化

This commit is contained in:
枫谷剑仙 2023-09-06 19:06:35 +08:00
parent 003aa52781
commit 471b0f777a
4 changed files with 92 additions and 82 deletions

View File

@ -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);
});
}

View File

@ -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"],

View File

@ -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:

View File

@ -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",