// H5 路由和环境修复
|
|
// #ifdef H5
|
|
|
|
// 存储原始方法
|
|
let originalGetCurrentPages;
|
|
let originalHistoryReplaceState;
|
|
let isFixed = false;
|
|
|
|
// 修复H5环境路由问题的主函数
|
|
export function fixH5Router() {
|
|
if (isFixed) return;
|
|
|
|
try {
|
|
// 1. 修复 getCurrentPages 方法
|
|
if (typeof getCurrentPages === 'function') {
|
|
originalGetCurrentPages = getCurrentPages;
|
|
window.getCurrentPages = function() {
|
|
try {
|
|
const pages = originalGetCurrentPages();
|
|
if (pages && Array.isArray(pages)) {
|
|
// 确保每个页面对象有必要的属性
|
|
pages.forEach((page, index) => {
|
|
if (!page.route) {
|
|
page.route = page.$page?.fullPath || `page_${index}`;
|
|
}
|
|
if (!page.options) {
|
|
page.options = {};
|
|
}
|
|
// 确保页面有 meta 属性
|
|
if (page.$page && !page.$page.meta) {
|
|
page.$page.meta = {};
|
|
}
|
|
});
|
|
}
|
|
return pages || [];
|
|
} catch(e) {
|
|
console.warn('getCurrentPages 执行失败:', e);
|
|
return [{
|
|
route: '/',
|
|
options: {},
|
|
$page: { meta: {} }
|
|
}];
|
|
}
|
|
};
|
|
}
|
|
|
|
// 2. 修复 History API
|
|
if (window.history && window.history.replaceState) {
|
|
originalHistoryReplaceState = window.history.replaceState;
|
|
window.history.replaceState = function(state, title, url) {
|
|
try {
|
|
// 修复 URL 格式问题
|
|
if (url && typeof url === 'string') {
|
|
// 处理错误的 URL 格式
|
|
if (url.includes('https:/#/')) {
|
|
url = url.replace(/https:\/+#\//, window.location.origin + '/#/');
|
|
}
|
|
// 确保相对路径的正确性
|
|
if (url.startsWith('#/')) {
|
|
url = window.location.origin + window.location.pathname + url;
|
|
}
|
|
// 处理双斜杠问题
|
|
url = url.replace(/([^:]\/)\/+/g, '$1');
|
|
}
|
|
return originalHistoryReplaceState.call(this, state, title, url);
|
|
} catch(e) {
|
|
console.warn('History.replaceState 修复执行失败:', e);
|
|
// 忽略错误,不执行原方法
|
|
return null;
|
|
}
|
|
};
|
|
}
|
|
|
|
// 3. 添加全局错误处理
|
|
const originalOnError = window.onerror;
|
|
window.onerror = function(message, source, lineno, colno, error) {
|
|
// 过滤已知的H5兼容性错误
|
|
if (typeof message === 'string') {
|
|
if (message.includes("Cannot read property 'meta'") ||
|
|
message.includes('replaceState') ||
|
|
message.includes('showTabBar') ||
|
|
message.includes('History')) {
|
|
console.warn('H5兼容性错误已忽略:', message);
|
|
return true; // 阻止默认错误处理
|
|
}
|
|
}
|
|
|
|
// 其他错误交给原处理器
|
|
if (originalOnError) {
|
|
return originalOnError(message, source, lineno, colno, error);
|
|
}
|
|
return false;
|
|
};
|
|
|
|
// 4. 修复 URL 哈希处理
|
|
if (window.location.hash === '' || window.location.hash === '#') {
|
|
window.location.hash = '#/';
|
|
}
|
|
|
|
// 5. 监听 hashchange 事件,确保路由正常
|
|
window.addEventListener('hashchange', function(e) {
|
|
try {
|
|
const hash = window.location.hash;
|
|
if (!hash || hash === '#') {
|
|
window.location.hash = '#/';
|
|
}
|
|
} catch(e) {
|
|
console.warn('hashchange 处理失败:', e);
|
|
}
|
|
});
|
|
|
|
isFixed = true;
|
|
console.log('H5 路由修复完成');
|
|
|
|
} catch(e) {
|
|
console.warn('H5 路由修复失败:', e);
|
|
}
|
|
}
|
|
|
|
// 恢复原始方法(用于调试)
|
|
export function restoreH5Router() {
|
|
if (!isFixed) return;
|
|
|
|
try {
|
|
if (originalGetCurrentPages) {
|
|
window.getCurrentPages = originalGetCurrentPages;
|
|
}
|
|
if (originalHistoryReplaceState) {
|
|
window.history.replaceState = originalHistoryReplaceState;
|
|
}
|
|
|
|
isFixed = false;
|
|
console.log('H5 路由修复已恢复');
|
|
} catch(e) {
|
|
console.warn('H5 路由恢复失败:', e);
|
|
}
|
|
}
|
|
|
|
// 页面加载完成后自动执行修复
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', fixH5Router);
|
|
} else {
|
|
fixH5Router();
|
|
}
|
|
|
|
// #endif
|