27 lines
1.5 KiB
TypeScript
27 lines
1.5 KiB
TypeScript
// 全局错误浮层:捕获会导致白屏的致命错误并显示在屏幕上,
|
|
// 便于远程定位(点击浮层空白处关闭,可叠加多条)
|
|
export function showFatalError(title: string, detail: string): void {
|
|
try {
|
|
let el = document.getElementById('fatal-overlay')
|
|
if (!el) {
|
|
el = document.createElement('div')
|
|
el.id = 'fatal-overlay'
|
|
el.style.cssText = 'position:fixed;inset:0;z-index:99999;background:#FFFFFF;color:#1D2129;padding:20px;overflow:auto;font:13px/1.7 -apple-system,PingFang SC,Microsoft YaHei,sans-serif;'
|
|
el.addEventListener('click', e => {
|
|
if (e.target === el && el.parentElement) el.parentElement.removeChild(el)
|
|
})
|
|
document.body.appendChild(el)
|
|
}
|
|
const box = document.createElement('div')
|
|
box.style.cssText = 'border:1px solid #E5484D;border-radius:8px;padding:12px;margin-bottom:12px;word-break:break-all;white-space:pre-wrap;'
|
|
box.textContent = title + '\n' + detail
|
|
// 重试入口:纯在线模式下连不上服务器时(如启动失败),一键重载而不是干等着重启应用
|
|
const retry = document.createElement('button')
|
|
retry.textContent = '重新加载'
|
|
retry.style.cssText = 'margin:-4px 0 12px;padding:6px 16px;border:1px solid #E5484D;border-radius:6px;background:#FFFFFF;color:#E5484D;font-size:13px;cursor:pointer;'
|
|
retry.addEventListener('click', () => { try { location.reload() } catch { /* 忽略 */ } })
|
|
el.appendChild(box)
|
|
el.appendChild(retry)
|
|
} catch { /* 浮层失败时保持静默 */ }
|
|
}
|