// 主函数:拦截所有跳转行为并处理 function interceptRedirects() { // 拦截点击和 JavaScript 触发的跳转 document.addEventListener('click', function (event) { if (event.target.tagName === 'A' && event.target.href && !isJavascriptUrl(event.target.href)) { event.preventDefault(); // 阻止默认跳转 handleRedirect(event.target.href); // 处理跳转 } }); // 拦截 location.href 或其他形式的直接跳转 const originalPushState = history.pushState; const originalReplaceState = history.replaceState; // 重写 pushState 以监听 pushState 跳转 history.pushState = function () { originalPushState.apply(history, arguments); handleRedirect(location.href); // 处理跳转 }; // 重写 replaceState 以监听 replaceState 跳转 history.replaceState = function () { originalReplaceState.apply(history, arguments); handleRedirect(location.href); // 处理跳转 }; // 监听 hash 变化的跳转 window.addEventListener('hashchange', function () { handleRedirect(location.href); // 处理跳转 }); // 处理通过 标签的跳转 (http-equiv="refresh") function observeMetaTags() { const metaObserver = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { // 检查添加的节点及其子节点中是否包含 标签 if (node.nodeType === 1) { // 确保是元素节点 // 检查当前节点是否是 标签 if (node.tagName === 'META' && node.httpEquiv === 'refresh') { handleMetaRefresh(node); } // 检查子节点中是否包含 标签 node.querySelectorAll('meta[http-equiv="refresh"]').forEach(meta => { handleMetaRefresh(meta); }); } }); }); }); // 监听整个文档的变化,捕捉 标签的插入 metaObserver.observe(document.documentElement, { childList: true, subtree: true }); } // 处理 标签的刷新 function handleMetaRefresh(meta) { const content = meta.content; const timeout = parseInt(content.split(';')[0].trim()) * 1000 || 0; const url = content.split('url=')[1]?.trim(); if (url && !isJavascriptUrl(url)) { // 使用 setTimeout 延时处理跳转 setTimeout(() => { handleRedirect(url); // 处理跳转 }, timeout); } } observeMetaTags(); // 开始监听 标签 // 处理跳转逻辑 function handleRedirect(url) { // 给 body 添加 class document.body.classList.add('rk-jump-out'); // 延迟 0.5 秒后执行跳转 setTimeout(() => { window.location.href = url; // 跳转到目标 URL }, 500); // 在跳转后移除类名 setTimeout(() => { document.body.classList.remove('rk-jump-out'); }, 2000); // 确保跳转完成后移除类名 } // 判断 URL 是否以 "javascript:" 开头 function isJavascriptUrl(url) { return url.trim().toLowerCase().startsWith("javascript:"); } // 监听动态生成的元素(包括 和其他可能的跳转元素) const observer = new MutationObserver(function (mutations) { mutations.forEach(function (mutation) { mutation.addedNodes.forEach(function (node) { // 动态生成的 标签 if (node.tagName === 'A' && node.href && !isJavascriptUrl(node.href)) { node.addEventListener('click', function (event) { event.preventDefault(); handleRedirect(node.href); // 处理跳转 }); } // 动态生成的其他元素(可能包含跳转逻辑的元素) if (node.nodeType === 1) { node.querySelectorAll('a').forEach(a => { if (!isJavascriptUrl(a.href)) { a.addEventListener('click', function (event) { event.preventDefault(); handleRedirect(a.href); // 处理跳转 }); } }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); // 专门监听 mdui-dialog 的展示和链接点击行为 function observeDialogLinks() { const dialogs = document.querySelectorAll('.mdui-dialog'); dialogs.forEach(dialog => { dialog.addEventListener('open.mdui.dialog', function() { // 在对话框打开时,绑定其内的 标签的点击事件 dialog.querySelectorAll('a').forEach(a => { if (!isJavascriptUrl(a.href)) { a.addEventListener('click', function(event) { event.preventDefault(); handleRedirect(a.href); // 处理跳转 }); } }); }); }); } // 初始化时调用一次,监听所有 .mdui-dialog observeDialogLinks(); } // 在页面加载完成时初始化拦截器 document.addEventListener('DOMContentLoaded', function () { interceptRedirects(); });