# 頁面載入

頁面何時算載入完成、捲動迴圈如何擷取動態載入的內容，以及何時停止。

## 等待穩定

萃取前頁面分兩段等待穩定：

1. `WaitDOMStable`，視窗為 `min(400ms, IdleWait)`、變動比例門檻 0.01，整體上限 `IdleWait`
2. `SettleJS`，上限 `IdleWait`；預設的 `listener.js` 在一次 `requestIdleCallback`（逾時 250ms）或 1 秒後結束，以先到者為準

每輪同意橫幅處理後、每次捲動後都會再等待一次。這裡的逾時不算錯誤：萃取以當下 DOM 的內容繼續。

## 捲動迴圈

同意橫幅處理完後，第一份快照是整頁 HTML。接著最多執行 `ScrollCount` 次：

| 步驟 | 細節 |
|---|---|
| 檢查 | 文件高度不再超過視窗高度加 4px 時停止 |
| 等待 | 150ms 加 0–300ms 隨機抖動；context 結束時停止 |
| 捲動 | 以 `requestAnimationFrame` 在 300ms 內平滑捲到底 |
| 等待穩定 | 同上兩段 |
| 快照 | 新 HTML 與前一份完全相同時停止 |

`ScrollCount` 預設 3；傳負值完全不捲動，只留第一份快照。

## 為何要多份快照

無限捲動的動態牆與延遲載入的文章會在捲動時替換或追加內容。每份快照記錄一個狀態，輸出階段再合併：`TypeHTML` 合併各份的 `<body>` 子節點，`TypeMarkdown` 與 `TypeJSON` 對每份快照各跑一次 readability 再串接內容。快照重疊造成的重複段落之後會被移除。見 [輸出格式](/zh/configuration-output-formats)。

## Viewport

頁面使用 `Option.Viewport`，預設 1280 × 960，`DeviceScaleFactor` 為 0 時視為 1。viewport 越高，每份快照載入的內容越多。
