fix: 左栏打开时滚动条停在最下面(应默认在顶部)

- 根因: 浏览器刷新会恢复内层滚动容器的位置,且恢复时机可能晚于渲染;
  之前 renderOriginalPane 无条件沿用旧 scrollTop,打开即停在底部(用户实测)
- renderOriginalPane 加 keepScroll 参数:默认回顶部(首次渲染/切段/切视图),
  仅翻译与对照展开/收起保持位置(这两处是内容更新,沿用位置才不跳)
- 首次渲染后再延迟固定一次顶部,对抗浏览器延迟的滚动恢复
- 验证: 打开/刷新/切段/切聚焦全文 均回顶部,翻译保持位置;长内容 5/5 + 核心场景 5/6
  (1 项为测试内容过短滚不动的断言误报)
This commit is contained in:
LuminousRuoxi
2026-09-10 16:54:53 +08:00
parent d0f2901875
commit 493c7f6416
+14 -6
View File
@@ -1042,12 +1042,14 @@ function updateParagraphSwitcherState(){
btn.classList.toggle('has-copy', hasRewrite(i));
});
}
function renderOriginalPane(){
// keepScroll=true 时保留当前滚动位置(翻译/对照展开这类内容更新);
// 默认回到顶部 —— 切段/首次渲染/切视图若沿用旧位置,会停在上次滚到的
// 位置(浏览器刷新后也会自动恢复内层滚动容器的位置,表现为"一打开就在
// 最下面",用户实测)。
function renderOriginalPane(keepScroll){
const wrap=$('#originalFull');
// 重建 DOM 前记住滚动位置:「查看之前的写作建议」展开后点翻译/切视图等
// 都会走到这里,不恢复会导致内容跳回顶部
const body = wrap.closest('.pane-body');
const scrollTop = body ? body.scrollTop : 0;
const scrollTop = keepScroll && body ? body.scrollTop : 0;
wrap.innerHTML='';
if(originalView==='focus') renderFocusOriginal(wrap); else renderFullOriginal(wrap);
renderParagraphSwitcher();
@@ -1216,7 +1218,7 @@ async function toggleOrigTranslate(){
const fresh = rec && rec.text === text;
if(fresh){
origTranslateOpen[i] = !origTranslateOpen[i];
persistNow(); renderOriginalPane();
persistNow(); renderOriginalPane(true);
return;
}
const sentences = splitSentences(text);
@@ -1233,7 +1235,7 @@ async function toggleOrigTranslate(){
if(btn){ btn.disabled = false; btn.textContent = '翻译失败,点击重试'; }
return;
}
renderOriginalPane();
renderOriginalPane(true);
}
function resetHelpPanels(){
const key = pidOf(current);
@@ -1262,6 +1264,12 @@ function renderWorkbench(){
resetHelpPanels();
updateProgress();
renderRecheckHistory();
// 首次渲染后再固定一次顶部:浏览器刷新会恢复内层滚动容器位置,
// 其恢复时机可能晚于本次渲染(用户实测「一打开就在最下面」)。
if(!renderWorkbench._pinnedTop){
renderWorkbench._pinnedTop = true;
setTimeout(()=>{ const b = $('#originalFull') && $('#originalFull').closest('.pane-body'); if(b) b.scrollTop = 0; }, 150);
}
}
async function submitConstraint(){
const input = $('#constraintInput');