fix(收藏/聊天记录检索): 切换页内tab不再污染浏览器历史记录

用户反馈"我的收藏"页面点击tabs切换(全部/图片/视频/文件/语音/文本/链接)会记录到浏览器
历史记录里,导致点击返回一直在这个页面内切换tab,而不是真正返回上一页。

根因:content-library-view.jsx的Favorites/HistoryNav每次切tab都调用navigate(),
即HashNavigation.navigateTo() -> location.hash = ...,每次赋值都会被浏览器记为一条
新的历史记录。切N次tab就push N条记录,无论是系统返回键还是应用自己的"返回"按钮
(HashNavigation.goBack()),都要先把这N条tab切换记录走完才能真正离开页面。

修复:新增HashNavigation.navigateReplace(),用history.replaceState替换当前历史记录
而不是新增一条(hash该更新还是更新,刷新/复制链接不受影响),并手动派发hashchange事件
供tinode-web.jsx现有的监听器捕获——replaceState本身不会自动触发该事件。Favorites的
TYPE_LABELS tabs和HistoryNav("查找聊天记录"页的聊天记录/图片/视频/文件/链接tabs)
两处tab切换都改用这个新方法,不再计入navigationCount。

已在浏览器实测两处:连续切3次tab后,无论是原生history.back()还是应用返回按钮,都能
一次性返回到进入这个页面之前的真实上一页,不再卡在tab切换历史里。
This commit is contained in:
Your Name
2026-09-06 10:45:24 +08:00
parent 01325ad009
commit e61eb40250
4 changed files with 33 additions and 5 deletions
+7 -2
View File
@@ -4583,6 +4583,10 @@ class HashNavigation {
navigationCount++;
window.location.hash = url;
}
static navigateReplace(url) {
window.history.replaceState(null, '', '#' + url);
window.dispatchEvent(new Event('hashchange'));
}
static goBack() {
if (navigationCount > 0) {
navigationCount--;
@@ -8931,6 +8935,7 @@ const navigate = (view, params) => {
});
_lib_navigation_js__WEBPACK_IMPORTED_MODULE_3__["default"].navigateTo(hash);
};
const navigateReplace = view => _lib_navigation_js__WEBPACK_IMPORTED_MODULE_3__["default"].navigateReplace(_lib_navigation_js__WEBPACK_IMPORTED_MODULE_3__["default"].setUrlSidePanel(window.location.hash, view));
const CONTENT_LIBRARY_VIEWS = ['favorites', 'favorites-mixed', 'favorites-files', 'favorites-text', 'favorites-voice', 'favorites-links', 'favorites-image', 'favorites-video', 'favorites-select', 'favorite-share', 'file-download', 'file-downloading', 'file-downloaded', 'history-search', 'history-files', 'history-links', 'history-images', 'history-videos'];
function Icon({
children
@@ -9432,7 +9437,7 @@ function Favorites({
className: type === id ? 'active' : '',
onClick: () => {
setType(id);
if (TYPE_ROUTE[id] && !selecting) navigate(TYPE_ROUTE[id]);
if (TYPE_ROUTE[id] && !selecting) navigateReplace(TYPE_ROUTE[id]);
},
children: label
}, id, false))
@@ -9797,7 +9802,7 @@ function HistoryNav({
children: tabs.map(item => (0,react_jsx_dev_runtime__WEBPACK_IMPORTED_MODULE_8__.jsxDEV)("button", {
type: "button",
className: active === item[0] ? 'active' : '',
onClick: () => navigate(item[0]),
onClick: () => navigateReplace(item[0]),
children: item[1]
}, item[0], false))
}, void 0, false);