This commit is contained in:
2026-08-26 15:10:25 +08:00
parent 06debfd1fc
commit fc9613197b
202 changed files with 28919 additions and 5551 deletions
@@ -8,6 +8,10 @@ const commonUtil = {
"x-requested-with": "XMLHttpRequest"
}
})
// H5 页面按需注入统一的 Loading 与请求延迟处理,其他端保持原有行为。
if (typeof window !== "undefined" && typeof window.bindH5AxiosLoading === "function") {
window.bindH5AxiosLoading(axiosService)
}
//axios拦截器
axiosService.interceptors.response.use(
(response) => {
@@ -0,0 +1,79 @@
/**
* H5 弹框浏览器历史栈管理器。
* 页面只注册关闭回调;本文件全局统一监听 popstate,避免每个页面重复绑定返回事件。
*/
;((global) => {
const callbacks = new Map()
const popupStack = []
let tokenSeed = 0
let stateSeed = 0
let pendingClear = null
const invokeClose = (entry) => {
const callback = callbacks.get(entry.token)
if (callback) callback(entry.popupKey)
}
global.addEventListener("popstate", (event) => {
if (pendingClear) {
event.stopImmediatePropagation()
const clear = pendingClear
pendingClear = null
clear.resolve()
return
}
if (!popupStack.length) return
// 有弹框历史时消费本次返回事件,阻止 PJAX 将页面直接切回上一个业务页面。
event.stopImmediatePropagation()
const entry = popupStack.pop()
invokeClose(entry)
}, true)
global.h5PopupHistory = {
register(closeCallback) {
tokenSeed += 1
const token = "h5-popup-page-" + tokenSeed
callbacks.set(token, closeCallback)
return token
},
unregister(token) {
callbacks.delete(token)
for (let index = popupStack.length - 1; index >= 0; index -= 1) {
if (popupStack[index].token === token) popupStack.splice(index, 1)
}
},
open(token, popupKey) {
if (!callbacks.has(token)) return
const current = popupStack[popupStack.length - 1]
if (current && current.token === token && current.popupKey === popupKey) return
stateSeed += 1
const entry = {token:token,popupKey:popupKey,stateId:stateSeed}
popupStack.push(entry)
const state = Object.assign({}, global.history.state || {}, {
__h5PopupHistory: {token:token,popupKey:popupKey,stateId:stateSeed}
})
global.history.pushState(state, global.document.title, global.location.href)
},
close(token, popupKey) {
const current = popupStack[popupStack.length - 1]
if (!current || current.token !== token || current.popupKey !== popupKey) return false
global.history.back()
return true
},
clear(token) {
const entries = popupStack.filter((entry) => entry.token === token)
if (!entries.length) return Promise.resolve()
entries.forEach((entry) => invokeClose(entry))
for (let index = popupStack.length - 1; index >= 0; index -= 1) {
if (popupStack[index].token === token) popupStack.splice(index, 1)
}
return new Promise((resolve) => {
pendingClear = {resolve:resolve}
global.history.go(-entries.length)
})
}
}
})(window)