Fix full page reload when clicking internal links in SPA apps

This commit is contained in:
Tw93
2025-10-13 19:42:19 +08:00
parent e7c10f6527
commit 94ffceed53
2 changed files with 28 additions and 42 deletions

View File

@@ -15,19 +15,19 @@ crate-type = ["staticlib", "cdylib", "lib"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[build-dependencies]
tauri-build = { version = "2.4.0", features = [] }
tauri-build = { version = "2.4.1", features = [] }
[dependencies]
serde_json = "1.0.143"
serde = { version = "1.0.219", features = ["derive"] }
serde_json = "1.0.145"
serde = { version = "1.0.228", features = ["derive"] }
tokio = { version = "1.47.1", features = ["full"] }
tauri = { version = "2.8.4", features = ["tray-icon", "image-ico", "image-png", "macos-proxy"] }
tauri = { version = "2.8.5", features = ["tray-icon", "image-ico", "image-png", "macos-proxy"] }
tauri-plugin-window-state = "2.4.0"
tauri-plugin-oauth = "2.0.0"
tauri-plugin-http = "2.5.2"
tauri-plugin-global-shortcut = { version = "2.3.0" }
tauri-plugin-shell = "2.3.1"
tauri-plugin-single-instance = "2.3.3"
tauri-plugin-single-instance = "2.3.4"
tauri-plugin-notification = "2.3.1"
[features]

View File

@@ -385,20 +385,21 @@ document.addEventListener("DOMContentLoaded", () => {
// Handle _blank links: same domain navigates in-app, cross-domain opens new window
if (target === "_blank") {
if (isSameDomain(absoluteUrl)) {
// For same-domain links, let the browser/SPA handle it naturally
// This prevents full page reload in SPA apps like Discord
return;
}
e.preventDefault();
e.stopImmediatePropagation();
if (isSameDomain(absoluteUrl)) {
window.location.href = absoluteUrl;
} else {
const newWindow = originalWindowOpen.call(
window,
absoluteUrl,
"_blank",
"width=1200,height=800,scrollbars=yes,resizable=yes",
);
if (!newWindow) handleExternalLink(absoluteUrl);
}
const newWindow = originalWindowOpen.call(
window,
absoluteUrl,
"_blank",
"width=1200,height=800,scrollbars=yes,resizable=yes",
);
if (!newWindow) handleExternalLink(absoluteUrl);
return;
}
@@ -448,39 +449,24 @@ document.addEventListener("DOMContentLoaded", () => {
// Rewrite the window.open function.
const originalWindowOpen = window.open;
window.open = function (url, name, specs) {
// Apple login and google login
if (name === "AppleAuthentication") {
//do nothing
} else if (
specs &&
(specs.includes("height=") || specs.includes("width="))
) {
location.href = url;
} else {
return originalWindowOpen.call(window, url, name, specs);
}
try {
const baseUrl = window.location.origin + window.location.pathname;
const hrefUrl = new URL(url, baseUrl);
const absoluteUrl = hrefUrl.href;
// Apply same domain logic as anchor links
if (isSameDomain(absoluteUrl)) {
// Same domain: navigate in app or open new window based on specs
if (name === "_blank" || !name) {
return originalWindowOpen.call(
window,
absoluteUrl,
"_blank",
"width=1200,height=800,scrollbars=yes,resizable=yes",
);
} else {
location.href = absoluteUrl;
}
} else {
// Cross domain: open in external browser
if (!isSameDomain(absoluteUrl)) {
handleExternalLink(absoluteUrl);
return null;
}
return originalWindowOpen.call(window, absoluteUrl, name, specs);
} catch (error) {
return originalWindowOpen.call(window, url, name, specs);
}
// Call the original window.open function to maintain its normal functionality.
return originalWindowOpen.call(window, url, name, specs);
};
// Set the default zoom, There are problems with Loop without using try-catch.