「自動計數器」會依照你選定的固定間隔,每次加一。而錯誤幾乎總是來自於把這個計時器當成節拍器來看待。瀏覽器的計時器,並不是一個精確的滴答產生器:一台正在忙碌的電腦,或一個隱藏的分頁,都可能延遲一次回呼,而如果把每一次回呼,都當成恰好一次遞增,就會在不知不覺中,讓你的總數少算。「自動計數器」繞開了這個陷阱,做法是以經過的時間作為錨點,記錄每一個實際上已經完整經過的間隔,並把尚未完成的餘數,保留給下一次回呼。了解這個邊界——計數器只有在頁面開啟時才會運作、執行中的間隔會被鎖定、暫停時會整合而不重複計算——是避免人們使用「自動計數器」時常犯錯誤的最簡單方法。這篇指南接下來會逐一說明具體的設定、每個當下的判斷,以及能讓一次作業階段從開始到匯出檔案都保持誠實的匯出選項。

對一個以時間驅動的計數器來說,什麼算是錯誤
每當有人在瀏覽器中執行一個以間隔驅動的計數器時,總會出現五種反覆發生的錯誤,而只要了解背後的規則,每一種都有直接的解法。
- 把每一次回呼都當成一次遞增。瀏覽器的計時器不是節拍器,因此單單一次延遲的回呼,就可能掩蓋掉好幾個已經完成的間隔。「自動計數器」會保持一個經過時間的錨點,記錄每一個實際上已經完整經過的間隔,然後把尚未完成的餘數,帶到下一次回呼中。
- 關掉分頁,卻期待計數還會繼續往上跳。當頁面被關閉或重新載入時,這個作業階段就結束了;這個工具並不會在背地裡執行一個伺服器端的處理程序。如果你需要計數持續進行,就要讓頁面保持開啟。
- 在作業階段中途更改間隔,想藉此修正一個太慢的開始。在執行期間,間隔控制項會被鎖定,這樣中途的更改,就不會在不知不覺中,重新解讀已經進行到一半的時間。重新開始,能讓這個邊界變得清楚。
- 按下「暫停」之後,卻擔心一個快要完成的間隔會怎麼算。「暫停」會先整合每一個已經完成的完整間隔,然後才真正停止。尚未完成的餘數會被保留,而不會在下次恢復時被重複計算。
- 把每日紀錄,當成好像每一次儲存都發生在同一個UTC日期上來讀。顯示出來的計數,是依照裝置本機的日曆日期來分組的,而一次跨越午夜的延遲回呼,會把這些間隔,歸給它們各自適用的本機日期,而不是被硬塞進同一個桶子裡。
讓間隔對應你真實的流程
「自動計數器」接受1到3,600秒之間的整數間隔,而你選擇的數值,應該要描述你自己真實的流程,而不是你希望「應該夠快」的整數。一個真正每90秒觸發一次的生產節奏,需要的是90,而不是60;一個你每小時才檢查一次的緩慢觀察,需要的是3,600。這個工具並不宣稱任何特定的數值比較好、比較安全,或比較有生產力,因此誠實的間隔,就是那個真正符合你實際在等待的事情的數值。
在按下「開始」之前,先選好間隔,因為這個欄位會在作業階段開始的那一刻被鎖定。如果你選錯了,正確的做法,是讓這次作業階段自然結束、把它暫停,再用修正後的間隔開始一個全新的作業階段。試圖在作業階段進行中重寫間隔,是最快讓顯示出來的總數,失去你原本以為它代表的意義的做法。
在不因瀏覽器延遲而漏掉任何一次滴答的情況下,執行自動計數器
下方的流程,就是「自動計數器」避免常見錯誤的順序。每一步都刻意保持簡短:這個工具的設計,讓你每一次作業階段只需要做少數幾個判斷。
- 在你打算保持開啟的瀏覽器分頁中,開啟自動計數器,並輸入一個簡短的標籤,描述這個特定的流程。這個標籤只會留在這個瀏覽器中;它不會出現在PNG匯出結果裡,也不會被傳送到任何地方。
- 輸入一個介於1到3,600秒之間、符合你真實節奏的整數間隔,然後對自己覆誦一次確認。這個間隔會在作業階段開始的那一刻被鎖定。
- 按下「開始」,並讓頁面保持開啟。這個計數器現在會以經過的時間作為錨點,因此即使有一次延遲的回呼,仍然會整合每一個實際上已經完整經過的間隔,而不會少算它們。
- 只做短暫的分頁切換。如果一個分頁閒置了異常長的一段時間,這次執行會直接停止,而不是嘗試無邊界地重播過去的滴答,這對一個誠實的計數來說,是比較安全的行為。
- 當你正在計時的流程結束時,按下「暫停」。這個工具會先整合每一個已完成的完整間隔,然後才停止,因此顯示出來的總數,反映的是暫停那一刻實際經過的時間。
- 開啟每日紀錄面板,確認每個本機日曆日期已儲存的遞增次數。如果你想要一份檔案,可以匯出PNG作為可分享的視覺紀錄,或匯出CSV作為適合試算表使用的封存檔案。
正確地暫停、恢復,並讀懂作業階段的邊界
一個作業階段,是從一次「開始」到下一次「暫停」之間的時間。「自動計數器」不會把一次新的「開始」,靜默地與前一次合併起來,這正是防止你恢復時憑空多跳出一次計數的關鍵。畫面上的數字,只有在一個完整間隔被整合,或一個未完成的間隔在稍後的回呼中終於跨過門檻時,才會改變。
即使你沒有先按下「暫停」,關閉或重新載入頁面,也會結束這次正在執行的作業階段;沒有任何機制會假裝在伺服器上繼續計數。如果你需要暫時離開鍵盤,這完全沒問題——只要讓分頁保持開啟,等你正在計時的流程結束時再切回來就好。想詳細了解「關閉頁面」這個邊界的說明,請見「關閉頁面會怎樣」這個問題,底層的計時器行為,則記載於WHATWG HTML計時器規範中。
依照這個工具分組遞增次數的方式,來閱讀每日紀錄
歷史紀錄面板,會依照時間倒序,列出每一個非零日期,以及該裝置本機日曆日期的自動遞增總數。儲存的遞增次數為零的日期,完全不會出現,因此你紀錄中一個空白的日期,代表這個計數器在那一天沒有記錄到任何東西。這份歷史紀錄使用的是本機儲存,依照WHATWG Web Storage規範,因此清除網站資料,也會清除這份紀錄,而換一個瀏覽器,則會從空白開始。
下表列出你實際上會遇到的四種日期邊界情況,以及「自動計數器」如何分配每一個已完成的間隔。
| 回呼發生時的情況 | 自動計數器如何分配這些間隔 | 為什麼這對你的紀錄很重要 |
|---|---|---|
| 回呼在午夜之前執行,所有間隔都在同一天完成 | 全部分配給目前的本機日期 | 這份歷史紀錄,會符合你牆上看到的日曆 |
| 回呼在午夜之後執行,間隔跨越了日期邊界 | 每一個間隔,各自分配給它自己所在的本機日期 | 一個深夜開始的計數,會算給它實際經過的那一天,而不是第二天早上 |
| 分頁閒置了異常長的一段時間 | 這次執行會停止,而不是重播過去的滴答 | 你回來時,不會出現一波幽靈般的計數暴增 |
| 在一個尚未完成的間隔期間按下「暫停」 | 只有完整的間隔會被儲存;餘數會被保留 | 恢復時,不會重複計算你差一點就完成的那次計數 |
如果儲存空間被停用或已滿,頁面仍然會顯示目前的互動內容,並告知你它無法保留歷史紀錄,而不會靜默地捏造出一份根本不存在的備份。
匯出一份紀錄,而不外洩私人的脈絡資訊
只有在你主動要求時,才會進行匯出,而這兩種格式,各自服務不同的用途。PNG是一張自然尺寸1080乘1350的分享圖片,帶有總數與近期每日的資料列;CSV則是一個簡單的「日期」與「自動遞增次數」檔案,能乾淨地匯入試算表中。兩者都是直接在瀏覽器中,使用原生的canvas和Blob API產生的,因此在匯出的過程中,沒有上傳佇列、沒有圖片處理伺服器、沒有帳號,也沒有任何外部API。
| 決策項目 | PNG匯出 | CSV匯出 |
|---|---|---|
| 檔案形式 | 1080乘1350的圖片,包含總數與近期每日資料列 | 兩欄:日期、自動遞增次數 |
| 包含你的計數器標籤 | 否,刻意從圖片中省略 | 否,這個標籤不屬於資料列的一部分 |
| 最適合用於 | 一份可以貼進訊息或筆記中的視覺紀錄 | 試算表、封存,或進一步的計算 |
| 產生的位置 | 在這個瀏覽器內部的Canvas API | 在這個瀏覽器內部的Blob API |
| 隱私狀態 | 留在這台裝置上,不含任何寫死的網址 | 留在這台裝置上,不需要帳號 |
請只在按下「暫停」之後才進行匯出,這樣儲存下來的每日紀錄,才會是你真正想要放進檔案裡的歷史紀錄。在作業階段仍在執行時匯出,只會擷取到那一刻之前已經整合的遞增次數,而不會包含你即將在一次尚未觸發的回呼中賺到的遞增次數。
「自動計數器」刻意設計成一個小巧、本機運作的工具,並讓它的邊界清楚可見:它只在這個頁面保持開啟時計數,它是依照經過的時間,而不是依照每一次回呼,來整合延遲的回呼,並依照裝置本機的日期,把結果分組。只要遵守這三條規則——選一個真實的間隔、讓頁面保持開啟、在流程結束時暫停——剩下的錯誤,就只會是使用任何計時工具都可能犯的錯誤,而不是「自動計數器」特有的錯誤。
想了解更深入的內容,請參見「距今天數計數器」:避免這些常見錯誤。