推拿小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

146 lines
3.8 KiB

// 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