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));
|
btn.classList.toggle('has-copy', hasRewrite(i));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
function renderOriginalPane(){
|
// keepScroll=true 时保留当前滚动位置(翻译/对照展开这类内容更新);
|
||||||
|
// 默认回到顶部 —— 切段/首次渲染/切视图若沿用旧位置,会停在上次滚到的
|
||||||
|
// 位置(浏览器刷新后也会自动恢复内层滚动容器的位置,表现为"一打开就在
|
||||||
|
// 最下面",用户实测)。
|
||||||
|
function renderOriginalPane(keepScroll){
|
||||||
const wrap=$('#originalFull');
|
const wrap=$('#originalFull');
|
||||||
// 重建 DOM 前记住滚动位置:「查看之前的写作建议」展开后点翻译/切视图等
|
|
||||||
// 都会走到这里,不恢复会导致内容跳回顶部
|
|
||||||
const body = wrap.closest('.pane-body');
|
const body = wrap.closest('.pane-body');
|
||||||
const scrollTop = body ? body.scrollTop : 0;
|
const scrollTop = keepScroll && body ? body.scrollTop : 0;
|
||||||
wrap.innerHTML='';
|
wrap.innerHTML='';
|
||||||
if(originalView==='focus') renderFocusOriginal(wrap); else renderFullOriginal(wrap);
|
if(originalView==='focus') renderFocusOriginal(wrap); else renderFullOriginal(wrap);
|
||||||
renderParagraphSwitcher();
|
renderParagraphSwitcher();
|
||||||
@@ -1216,7 +1218,7 @@ async function toggleOrigTranslate(){
|
|||||||
const fresh = rec && rec.text === text;
|
const fresh = rec && rec.text === text;
|
||||||
if(fresh){
|
if(fresh){
|
||||||
origTranslateOpen[i] = !origTranslateOpen[i];
|
origTranslateOpen[i] = !origTranslateOpen[i];
|
||||||
persistNow(); renderOriginalPane();
|
persistNow(); renderOriginalPane(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const sentences = splitSentences(text);
|
const sentences = splitSentences(text);
|
||||||
@@ -1233,7 +1235,7 @@ async function toggleOrigTranslate(){
|
|||||||
if(btn){ btn.disabled = false; btn.textContent = '翻译失败,点击重试'; }
|
if(btn){ btn.disabled = false; btn.textContent = '翻译失败,点击重试'; }
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
renderOriginalPane();
|
renderOriginalPane(true);
|
||||||
}
|
}
|
||||||
function resetHelpPanels(){
|
function resetHelpPanels(){
|
||||||
const key = pidOf(current);
|
const key = pidOf(current);
|
||||||
@@ -1262,6 +1264,12 @@ function renderWorkbench(){
|
|||||||
resetHelpPanels();
|
resetHelpPanels();
|
||||||
updateProgress();
|
updateProgress();
|
||||||
renderRecheckHistory();
|
renderRecheckHistory();
|
||||||
|
// 首次渲染后再固定一次顶部:浏览器刷新会恢复内层滚动容器位置,
|
||||||
|
// 其恢复时机可能晚于本次渲染(用户实测「一打开就在最下面」)。
|
||||||
|
if(!renderWorkbench._pinnedTop){
|
||||||
|
renderWorkbench._pinnedTop = true;
|
||||||
|
setTimeout(()=>{ const b = $('#originalFull') && $('#originalFull').closest('.pane-body'); if(b) b.scrollTop = 0; }, 150);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
async function submitConstraint(){
|
async function submitConstraint(){
|
||||||
const input = $('#constraintInput');
|
const input = $('#constraintInput');
|
||||||
|
|||||||
Reference in New Issue
Block a user