fix: 左栏打开时滚动条停在最下面(应默认在顶部)
- 根因: 浏览器刷新会恢复内层滚动容器的位置,且恢复时机可能晚于渲染; 之前 renderOriginalPane 无条件沿用旧 scrollTop,打开即停在底部(用户实测) - renderOriginalPane 加 keepScroll 参数:默认回顶部(首次渲染/切段/切视图), 仅翻译与对照展开/收起保持位置(这两处是内容更新,沿用位置才不跳) - 首次渲染后再延迟固定一次顶部,对抗浏览器延迟的滚动恢复 - 验证: 打开/刷新/切段/切聚焦全文 均回顶部,翻译保持位置;长内容 5/5 + 核心场景 5/6 (1 项为测试内容过短滚不动的断言误报)
This commit is contained in:
+14
-6
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user