我有以下兩個函數...
function sizeSearch(size) { const container = document.querySelector('ul.size-ranks'); const rankElems = container.querySelectorAll('li'); rankElems.forEach(e => { e.style.display = 'none'; e.classList.remove('active'); }); const sizeID = size.replace(/\D/g,'') + '-rank'; const sizeElem = document.getElementById(sizeID); if (sizeElem) { sizeElem.classList.add('active'); sizeElem.style.display = ''; } else { container.insertAdjacentHTML('beforeend', '<li class="empty-search">尺寸未找到</li>'); } } function clearSizeSearch() { document.querySelectorAll('li.empty-search').forEach(e => e.remove()); document.querySelectorAll('ul.size-ranks li').forEach(e => e.style.display = ''); document.querySelector('ul.size-ranks li.active').scrollIntoView(); }
sizeSearch()
函數正常運作。當呼叫clearSizeSearch()
函數時,所有的<li>
元素會如預期重新顯示出來,你可以很短暫地看到預期的.active
#元素滾動到視圖中,但隨後它立即滾動回容器元素的頂部(或者也許在DOM完成安定後重新渲染為此方式?)。
如果我在控制台中手動運行document.querySelector('ul.size-ranks li.active').scrollIntoView();
,然後運行clearSizeSearch()
,那麼它就正常工作。這一點,再加上當運行clearSizeSearch()
時我可以短暫地看到它滾動到視圖中,似乎表明它可能在前面的命令執行完成之前運行,但據我所知,forEach()
預設不是異步的,任何在其後的命令都不應該在它完成之前運行。
P粉6337331462023-09-17 17:56:18
這是我的解決方案。
function clearSizeSearch() { document.querySelectorAll('li.empty-search').forEach(e => e.remove()); document.querySelectorAll('ul.size-ranks li').forEach(e => e.style.display = ''); setTimeout(() => { document.querySelector('ul.size-ranks li.active').scrollIntoView(); }, 0); }