提案审核提交增加转圈圈、如果域名解析失败,不缓存,等待两秒重新读取,共三次,域名解析成功缓存一分钟;手机端审核撤回失败,审核下拉选择参数自动弹出审核页等bug

This commit is contained in:
2026-10-29 15:44:01 +08:00
parent 986faea6b3
commit 909aaa291c
41 changed files with 1762 additions and 1162 deletions
@@ -99,6 +99,8 @@
let active = null
let serial = 0
let pending = null
let registered = null
let releasing = Promise.resolve()
let skippingClosedHistory = false
const sync = (closedKeys) => {
if (active) active.onChange(active.keys.slice(), closedKeys)
@@ -146,37 +148,55 @@
return {
/** 注册页面同步回调,参数为仍打开的弹框 key 数组;返回页面专用操作句柄。 */
register(onChange) {
if (active) throw new Error("上一个页面的弹框历史尚未注销")
const owner = { id: Date.now() + "-" + (++serial), keys: [], onChange }
active = owner
if (registered) throw new Error("上一个页面的弹框历史尚未注销")
const owner = { id: Date.now() + "-" + (++serial), keys: [], onChange, disposed: false }
registered = owner
// 旧页面注销时先释放注册资格;新页面的弹框操作等待旧历史回退完成,不能接管其 popstate。
const ready = active ? releasing.then(() => {
if (!owner.disposed) active = owner
}) : Promise.resolve()
if (!active) active = owner
const runOwned = (work) => {
const run = () => active === owner && !owner.disposed ? work() : undefined
return active === owner ? run() : ready.then(run)
}
let destroyed = null
return {
// key 是页面内唯一弹框名称;相同弹框重复打开不会重复压栈。
open(key) {
const open = () => {
if (active !== owner || owner.keys.includes(key)) return
if (active !== owner || owner.disposed || owner.keys.includes(key)) return
owner.keys.push(key)
window.history.pushState({ h5Popup: { owner: owner.id, depth: owner.keys.length } }, "", window.location.href)
}
return pending ? pending.promise.then(open) : Promise.resolve(open())
return Promise.resolve(runOwned(() => pending ? pending.promise.then(open) : open()))
},
// 关闭指定弹框及其上层弹框,返回 Promise<void>,保持后进先出。
close(key) {
if (active !== owner) return Promise.resolve()
const index = owner.keys.indexOf(key)
return index < 0 ? Promise.resolve() : rewind(index)
return Promise.resolve(runOwned(() => {
const index = owner.keys.indexOf(key)
return index < 0 ? undefined : rewind(index)
}))
},
clear() {
return active === owner ? rewind(0) : Promise.resolve()
return Promise.resolve(runOwned(() => rewind(0)))
},
destroy() {
if (destroyed) return destroyed
owner.disposed = true
if (registered === owner) registered = null
// 无弹框时同步注销,保证 PJAX 同次替换中下一个页面可以立即注册。
if (active === owner && !owner.keys.length && !pending) {
active = null
return Promise.resolve()
destroyed = Promise.resolve()
return destroyed
}
return this.clear().then(() => {
// 新页面可能尚在等待更早页面释放历史;连续切换也必须按顺序完成注销。
destroyed = ready.then(() => active === owner ? rewind(0) : undefined).then(() => {
if (active === owner) active = null
})
releasing = destroyed
return destroyed
}
}
},
@@ -215,27 +235,17 @@
$(document).on("pjax:complete", function () {
if (window.customStyleList) {
window.customStyleList.forEach((style) => {
style.parentNode.removeChild(style)
// 页面替换或前一次清理可能已移除节点,仅清理仍挂载的旧样式。
if (style.parentNode) style.parentNode.removeChild(style)
})
window.customStyleList = null
}
NProgress.done()
toggleShowBar()
})
// 监听浏览器的前进和后退操作
$(window).on("popstate", function (event) {
if (event.originalEvent.state) {
// 如果存在历史记录状态,触发 Pjax 加载对应内容
$.pjax({
url: event.originalEvent.state.url,
container: "#container",
fragment: "#container",
timeout: 8000,
push: false,
scrollTo: false
})
}
})
// 普通页面前进/后退交给 PJAX 自带的 popstate.pjax 处理。
// 弹框历史只有 h5Popup 标记,没有页面 url/container,不能再次发起页面请求。
}
})()