fix: use permanent DOM elements for progress instead of innerHTML reset

innerHTML reset in startSession was destroying #phase-label and
#progress-fill elements, then recreating them with same IDs. XHR
progress events fired asynchronously but getElementById might
return stale references or fail during the DOM update window.

Now #phase-label, #progress-fill, and #session-error are permanent
elements in the static HTML. startSession clears them via
textContent/style instead of innerHTML — no DOM destruction.
showError appends to #session-error instead of #session-status.
This commit is contained in:
Claus Lohmar 2026-07-22 05:19:13 +00:00
parent d8d301a13f
commit 6519fc1cf7

View file

@ -49,6 +49,7 @@
<div class="progress-bar">
<div class="progress-fill" id="progress-fill" style="width:0%">0%</div>
</div>
<div id="session-error"></div>
</div>
</div>
@ -75,8 +76,8 @@ function setPhase(label, pct, isSpinner) {
}
function showError(msg) {
const status = document.getElementById('session-status');
if (status) status.innerHTML += '<div class="error" style="margin-top:0.5rem;">' + msg + '</div>';
const el = document.getElementById('session-error');
if (el) el.innerHTML += '<div class="error" style="margin-top:0.5rem;">' + msg + '</div>';
}
function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); }
@ -91,12 +92,11 @@ async function startSession(e) {
btn.disabled = true;
analysis.innerHTML = '';
polling.innerHTML = '';
status.innerHTML = `
<div id="phase-label" style="margin-bottom:0.5rem;"></div>
<div class="progress-bar">
<div class="progress-fill" id="progress-fill" style="width:0%">0%</div>
</div>
`;
// Reset permanent elements (no innerHTML — keeps DOM references alive)
document.getElementById('phase-label').textContent = '';
var pf = document.getElementById('progress-fill');
pf.style.width = '0%'; pf.textContent = '0%';
document.getElementById('session-error').textContent = '';
status.classList.remove('hidden');
const vmid = document.getElementById('vmid').value;