diff --git a/index.html b/index.html index 4851280..b84da7f 100644 --- a/index.html +++ b/index.html @@ -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');