From 19d9410c9b048361ca83ee703c43747e39ff7432 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=AB=E8=B0=B7=E5=89=91=E4=BB=99?= Date: Thu, 11 Aug 2022 16:42:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A0=E5=85=A5editing=E8=BF=99=E4=B8=AA?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E6=AD=A3=E5=9C=A8=E7=BC=96=E8=BE=91=E5=AF=B9?= =?UTF-8?q?=E8=B1=A1=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script-skill-parser.js | 24 +++++------ script-universal_function.js | 34 ++++++--------- script.js | 80 +++++++++++++++++++++--------------- service-worker.js | 10 ++--- 4 files changed, 76 insertions(+), 72 deletions(-) diff --git a/script-skill-parser.js b/script-skill-parser.js index bb00547a..2b3414e5 100644 --- a/script-skill-parser.js +++ b/script-skill-parser.js @@ -1492,20 +1492,18 @@ const parsers = { }; //将内容添加到代码片段 -DocumentFragment.prototype.ap = function(arg) +DocumentFragment.prototype.ap = function(...args) { - if (Array.isArray(arg)) //数组,递归自身 - { - arg.forEach(element=>this.ap(element)); - } - else if (arg instanceof Node) //属于Node的直接添加 - { - this.appendChild(arg); - } - else //其他内容的转换为文字添加 - { - this.appendChild(document.createTextNode(arg)); - } + args.forEach(arg=>{ + if (Array.isArray(arg)) //数组,递归自身 + { + arg.forEach(item=>this.ap(item)); + } + else //其他内容的转换为文字添加 + { + this.append(arg); + } + }, this); return this; } diff --git a/script-universal_function.js b/script-universal_function.js index 64337a2f..2757b22f 100644 --- a/script-universal_function.js +++ b/script-universal_function.js @@ -142,28 +142,19 @@ function tp(strings, ...keys) { return (function(...values) { let dict = values[values.length - 1] || {}; let fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(strings[0])); - //let result = [strings[0]]; + fragment.append(strings[0]); keys.forEach(function(key, i, arr) { let value = Number.isInteger(key) ? values[key] : dict[key]; - if (value == undefined) + if (value != undefined) { - //console.debug("模板字符串中 %s 未找到输入数据",key); - }else - { - if (!(value instanceof Node)) //这里需要用 Node 而不是 HTMLElement,因为 DocumentFragment 从属于 Node - { - value = document.createTextNode(value); - } try{ - fragment.appendChild(arr.lastIndexOf(key) === i ? value : value.cloneNode(true)); //如果是最后一个匹配的标签,就插入原始的DOM(保留行为),否则插入克隆的DOM + fragment.append(arr.lastIndexOf(key) === i ? value : value.cloneNode(true)); //如果是最后一个匹配的标签,就插入原始的DOM(保留行为),否则插入克隆的DOM }catch(e) { - console.log(value, e); - console.log(keys, values); + console.log("模板字符串错误: %o,", e, values, keys, value); } } - fragment.appendChild(document.createTextNode(strings[i + 1])); + fragment.append(strings[i + 1]); }); return fragment; }); @@ -899,7 +890,7 @@ function parseSkillDescription(skill) { //const span = document.createElement("span"); //span.innerHTML = descriptionToHTML(skill.description); - return descriptionToHTML(skill.description); + return descriptionToHTML(skill?.description); } //大数字缩短长度,默认返回本地定义字符串 function parseBigNumber(number) { @@ -923,8 +914,8 @@ function getAllowLatent(card) { //计算队伍中有多少血量 function countTeamHp(team, leader1id, leader2id, solo, noAwoken = false) { let memberArr = team[0], assistArr = team[1]; - const ls1 = Skills[(Cards[leader1id] || Cards[0]).leaderSkillId]; - const ls2 = Skills[(Cards[leader2id] || Cards[0]).leaderSkillId]; + const ls1 = Skills[(Cards[leader1id] || Cards[0])?.leaderSkillId]; + const ls2 = Skills[(Cards[leader2id] || Cards[0])?.leaderSkillId]; const mHpArr = memberArr.map((member, idx) => { const ability = noAwoken ? member.abilityNoAwoken : member.ability; let hp = ability ? ability[0] : 0; @@ -954,9 +945,9 @@ function countTeamHp(team, leader1id, leader2id, solo, noAwoken = false) { } return 1; } - const sk = ls.params; + const sk = ls?.params; let scale = 1; - switch (ls.type) { + switch (ls?.type) { case 23: case 30: case 62: @@ -1087,6 +1078,7 @@ function getCardActiveSkills(card, skillTypes, searchRandom = false) { } //查找到真正起作用的那一个技能 function getActuallySkills(skill, skillTypes, searchRandom = true) { + if (!skill) return []; if (skillTypes.includes(skill.type)) { return [skill]; @@ -1209,10 +1201,10 @@ function countTeamSB(team, solo) { const assist = team[1][mi]; if (member.id < 0) continue; const memberCard = henshinBase(member); - let enableAwoken = memberCard.awakenings.slice(0, member.awoken); + let enableAwoken = memberCard?.awakenings?.slice(0, member.awoken) || []; //单人、3人时,大于等于100级且297时增加超觉醒 if ((solo || teamsCount === 3) && member.sawoken >= 0 && member.level >= 100 && member.plus.every(p=>p>=99)) { - const sAwokenT = memberCard.superAwakenings[member.sawoken]; + const sAwokenT = memberCard?.superAwakenings?.[member.sawoken]; if (sAwokenT >= 0) enableAwoken = enableAwoken.concat(sAwokenT); } diff --git a/script.js b/script.js index 0a8489e1..c2329ffc 100644 --- a/script.js +++ b/script.js @@ -1250,13 +1250,9 @@ function loadData(force = false) //重新读取URL中的Data数据并刷新页面 function reloadFormationData(event) { let formationData; - if (event && event.state && event.state.outForm) - { - //直接使用现有数据 - formationData = event.state.outForm; - //console.log("直接读取",formationData); - }else + if (!(formationData = event?.state?.outForm)) { + //如果没有现有数据 try { const parameterDataString = getQueryString(["d","data"]); formationData = JSON.parse(parameterDataString); @@ -1292,6 +1288,21 @@ function reloadFormationData(event) { showSearch(event.state.searchArr.map(id=>Cards[id])); } } + //编辑模式直接打开编辑框 + let editingTarget = event?.state?.editing || ((str)=>{ + try { + const arr = JSON.parse(str); + return (Array.isArray(arr) && arr.length >= 3 && arr.slice(0,3).every(n=>typeof n == "number")) ? arr : null; + } catch (error) { + return null; + } + })(getQueryString("editing")); + if (editingTarget) + { + editMon(editingTarget[0], editingTarget[1], editingTarget[2]); + } else { + editBox.hide(); + } } window.addEventListener('popstate',reloadFormationData); //前进后退时修改页面 //创建新的分享地址 @@ -2376,7 +2387,7 @@ function initialize(event) { const hpRangeMin = hpRange.appendChild(document.createElement("span")); hpRangeMin.className = "hp-range-min"; hpRangeMin.textContent = range.min; - hpRange.appendChild(document.createTextNode(" ~ ")); + hpRange.append(" ~ "); const hpRangeMax = hpRange.appendChild(document.createElement("span")); hpRangeMax.className = "hp-range-max"; hpRangeMax.textContent = range.max; @@ -2393,11 +2404,11 @@ function initialize(event) { if (range.probability < 1) { - reduce.appendChild(document.createTextNode("(")); + reduce.append("("); const reduceProb = reduce.appendChild(document.createElement("span")); reduceProb.className = "reduce-probability"; reduceProb.textContent = `${(range.probability * 100).toFixed(0)}`; - reduce.appendChild(document.createTextNode(")")); + reduce.append(")"); } const reduceGeneral = reduceHpRow.insertCell(); @@ -2520,6 +2531,10 @@ function initialize(event) { this.classList.add(className_displayNone); formationBox.classList.remove("blur-bg"); controlBox.classList.remove("blur-bg"); + //删除编辑模式,不改变页面 + const locationURL = new URL(location); + locationURL.searchParams.delete('editing'); + history.replaceState(null, null, locationURL); }; const smonsterinfoBox = editBox.querySelector(".monsterinfo-box"); @@ -2752,11 +2767,7 @@ function initialize(event) { const c_addition = cli.appendChild(document.createElement("div")); c_addition.className = "custom-addition"; let content = func(card); - if (typeof content == "string" || typeof content == "number") - { - content = document.createTextNode(content); - } - content && c_addition.appendChild(content); + content && c_addition.append(content); }); } @@ -3500,7 +3511,7 @@ function initialize(event) { skillLevel.onchange = function() { const card = Cards[editBox.mid] || Cards[0]; //怪物固定数据 const skill = Skills[card.activeSkillId]; - skillCD.textContent = skill.initialCooldown - this.value + 1; + skillCD.textContent = skill?.initialCooldown - this.value + 1; }; skillLevel_1.ipt = skillLevel; skillLevel_1.onclick = setIptToMyValue; @@ -4058,6 +4069,11 @@ function editMon(teamNum, isAssist, indexInTeam) { //数据 const mon = formation.teams[teamNum][isAssist][indexInTeam]; + //传入编辑模式,不改变页面 + const locationURL = new URL(location); + locationURL.searchParams.set('editing', JSON.stringify([teamNum, isAssist, indexInTeam])); + history.replaceState({editing: [teamNum, isAssist, indexInTeam]}, null, locationURL); + const teamBigBox = teamBigBoxs[teamNum]; const teamBox = teamBigBox.querySelector(".team-box"); const memberBox = teamBox.querySelector(isAssist ? ".team-assist" : ".team-members"); @@ -4283,17 +4299,17 @@ function editBoxChangeMonId(id) { let frg1 = document.createDocumentFragment(); //创建节点用的临时空间 frg1.appendChild(skillBox); - skillTitle.textContent = activeskill.name; - skillTitle.setAttribute("data-skillid", activeskill.id); + skillTitle.textContent = activeskill?.name; + skillTitle.setAttribute("data-skillid", activeskill?.id); skillDetailOriginal.innerHTML = ""; skillDetailOriginal.appendChild(parseSkillDescription(activeskill)); - const t_maxLevel = card.overlay ? 1 : activeskill.maxLevel; //遇到不能升技的,最大等级强制为1 + const t_maxLevel = card.overlay ? 1 : activeskill?.maxLevel; //遇到不能升技的,最大等级强制为1 skillLevel.max = t_maxLevel; skillLevel.value = t_maxLevel; skillLevel_Max.value = t_maxLevel; //skillLevel_Max.textContent = activeskill.maxLevel; - skillCD.textContent = activeskill.initialCooldown - t_maxLevel + 1; + skillCD.textContent = activeskill?.initialCooldown - t_maxLevel + 1; //怪物队长技能 const rowLederSkill = settingBox.querySelector(".row-mon-leader-skill"); @@ -4305,8 +4321,8 @@ function editBoxChangeMonId(id) { let frg2 = document.createDocumentFragment(); //创建节点用的临时空间 frg2.appendChild(lskillBox); - lskillTitle.textContent = leaderSkill.name; - lskillTitle.setAttribute("data-skillid", leaderSkill.id); + lskillTitle.textContent = leaderSkill?.name; + lskillTitle.setAttribute("data-skillid", leaderSkill?.id); lskillDetailOriginal.innerHTML = ""; lskillDetailOriginal.appendChild(parseSkillDescription(leaderSkill)); @@ -4355,9 +4371,7 @@ function refreshAll(formationData) { const formationAwokenDom = formationBox.querySelector(".formation-awoken"); //所有队伍觉醒合计 const dungeonEnchanceDom = formationBox.querySelector(".dungeon-enchance"); //地下城强化 - while (formationBox.childNodes.length > 0) { - fragment.appendChild(formationBox.childNodes[0]); - } + fragment.append(...formationBox.childNodes); const txtTitle = titleBox.querySelector(".title"); const txtDetail = detailBox.querySelector(".detail"); @@ -4605,12 +4619,12 @@ function refreshMenberAwoken(menberAwokenDom, assistAwokenDom, team, idx) { const memberCard = Cards[memberData.id] || Cards[0]; const assistCard = Cards[assistData.id] || Cards[0]; //队员觉醒 - let menberAwokens = memberCard.awakenings.slice(0,memberData.awoken); + let menberAwokens = memberCard?.awakenings?.slice(0,memberData.awoken) || []; //单人和三人为队员增加超觉醒 if ((solo || teamsCount === 3) && memberData.sawoken != null && //怪物设定了超觉醒 memberData.sawoken >= 0 && //怪物超觉醒编号大于0 - memberCard.superAwakenings.length >= 0 && //卡片有超觉醒 + memberCard?.superAwakenings?.length >= 0 && //卡片有超觉醒 memberData.level >= 100 && //怪物大于100级 memberData.plus.every(p=>p>=99) //怪物297了 ) { @@ -4618,8 +4632,8 @@ function refreshMenberAwoken(menberAwokenDom, assistAwokenDom, team, idx) { } //menberAwokens.sort(); //武器觉醒 - let assistAwokens = assistCard.awakenings.slice(0,assistData.awoken); - if (!assistAwokens.includes(49)) assistAwokens = []; //清空非武器的觉醒 + let assistAwokens = assistCard?.awakenings?.slice(0,assistData?.awoken); + if (!assistAwokens?.includes(49)) assistAwokens = []; //清空非武器的觉醒 //assistAwokens.sort(); /*if (assistAwokens.includes(49)) { @@ -4834,7 +4848,7 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) { const rarityCount = team[0].slice(0,5).reduce((pre,member)=>{ if (member.id <= 0) return pre; const card = Cards[member.id] || Cards[0]; - return pre + card.rarity; + return pre + (card?.rarity ?? 0); },0); rarityDoms.setAttribute(dataAttrName, rarityCount); } @@ -5048,9 +5062,9 @@ function refreshMemberSkillCD(teamDom, team, idx) { const assist = team[1][idx]; const memberCard = Cards[member.id] || Cards[0]; - const memberSkill = Skills[memberCard.activeSkillId]; + const memberSkill = Skills[memberCard?.activeSkillId]; const assistCard = Cards[assist.id] || Cards[0]; - const assistSkill = Skills[assistCard.activeSkillId]; + const assistSkill = Skills[assistCard?.activeSkillId]; const memberSkillCdDom = memberMonDom.querySelector(".skill-cd"); const assistSkillCdDom = assistMonDom.querySelector(".skill-cd"); @@ -5060,12 +5074,12 @@ function refreshMemberSkillCD(teamDom, team, idx) { memberSkillCdDom.textContent = memberSkillCd; assistSkillCdDom.textContent = memberSkillCd + assistSkillCd; - if (member.skilllevel != undefined && member.skilllevel < memberSkill.maxLevel) { + if (member?.skilllevel != undefined && member?.skilllevel < memberSkill?.maxLevel) { memberSkillCdDom.classList.remove("max-skill"); } else { memberSkillCdDom.classList.add("max-skill"); } - if (assist.skilllevel != undefined && assist.skilllevel < assistSkill.maxLevel) { + if (assist?.skilllevel != undefined && assist?.skilllevel < assistSkill?.maxLevel) { assistSkillCdDom.classList.remove("max-skill"); } else { assistSkillCdDom.classList.add("max-skill"); diff --git a/service-worker.js b/service-worker.js index e560be1b..1355b48c 100644 --- a/service-worker.js +++ b/service-worker.js @@ -6047,7 +6047,7 @@ const cachesMap = new Map([ ], [ "multi.html", - "80dbae798d47c80ea85a16cc1d59de38" + "e18e48eb9c1ae0f38736582ab0e02d4e" ], [ "script-custom_elements.js", @@ -6059,15 +6059,15 @@ const cachesMap = new Map([ ], [ "script-skill-parser.js", - "e037dcf8114679968ddd88770411a28b" + "339597e08ba284485cb2207e2d8f6f78" ], [ "script-universal_function.js", - "f0625fb4538d49510db46991032b1472" + "ab8eb5095c920772ff925a2c8fbbf069" ], [ "script.js", - "df4625d20571646d6bf151e1da4e6dee" + "77f22488ac4b3fdc02507d25dfc41251" ], [ "solo.html", @@ -6087,7 +6087,7 @@ const cachesMap = new Map([ ], [ "triple.html", - "7efa50aa0483859147e7879cc20e6808" + "85818d0e5c2f518efbda39f02a2968e1" ], [ "languages/en.css",