摘要
今天讓網站「記得你來過」。我們用 localStorage 追蹤是否曾造訪過,進場畫面會改成一句暖心問候:「今天的你,是不是不一樣了呢?」並依第一次/再次來訪呈現不同入口選項:
- YES 分支(再次造訪):顯示「趁勝追擊」與「今天想先休息」。
- NO 分支(第一次來或今天還沒開始):顯示「看看精神狀態」與「躺平」。
這讓體驗更貼近真實心境,也讓回訪者有被理解的感覺。
假設已有:
<!-- [Day19-CHANGED] 給舊文案一個包裹,方便整包隱藏 -->
<section id="resonanceScreen" aria-labelledby="res-title" role="dialog" aria-modal="true">
<div id="resonanceInner"> <!-- ★ 新增這個包裹 -->
<h1 id="res-title">你是不是也常常…</h1>
<ul>
<li>看了一堆自我提升影片,結果還是沒開始?</li>
<li>打開 IG/小紅書 想找靈感,結果一個多小時過去?</li>
<li>明明有想做的事,卻又莫名其妙滑到半夜?</li>
</ul>
<p><strong>想想看,假日想做但沒做的事通常是什麼?</strong></p>
<div><button id="btnStart">一起看看今天怎麼了 →</button></div>
</div>
<!-- [Day19-NEW] 二訪互動區(預設 hidden,回訪時才顯示) -->
<div id="revisitIntro" hidden>
<h1>今天的你,是不是不一樣了呢?</h1>
<div style="display:flex; gap:.5rem; margin:.5rem 0;">
<button id="btnRevisitYes" type="button">YES</button>
<button id="btnRevisitNo" type="button">NO</button>
</div>
<!-- YES 分支 -->
<div id="revisitBranchYes" hidden>
<p>太好了!想要怎麼走?</p>
<button id="btnGoChase" type="button" aria-controls="taskScheduleSection">趁勝追擊</button>
<button id="btnRestToday" type="button">今天想先休息</button>
</div>
<!-- NO 分支 -->
<div id="revisitBranchNo" hidden>
<p>沒關係,我們可以輕鬆一點:</p>
<button id="btnCheckMood" type="button" aria-controls="moodTestSection">看看精神狀態</button>
<button id="btnLayFlat" type="button" aria-controls="historySection">躺平(先看看歷史)</button>
</div>
<p id="revisitFeedback" aria-live="polite" style="margin-top:.5rem;"></p>
</div>
</section>
// [Day19-NEW] 造訪旗標
const VISITED_FLAG = 'visited_before';
// [Day19-NEW] 取得 / 設定造訪狀態
function hasVisitedBefore() { return localStorage.getItem(VISITED_FLAG) === '1'; }
function markVisited() { localStorage.setItem(VISITED_FLAG, '1'); }
// [Day19-NEW] Day 12 舊文案包裹 & 二訪 UI 節點
const resonanceInner = document.getElementById('resonanceInner');
const revisitIntro = document.getElementById('revisitIntro');
const btnRevisitYes = document.getElementById('btnRevisitYes');
const btnRevisitNo = document.getElementById('btnRevisitNo');
const branchYes = document.getElementById('revisitBranchYes');
const branchNo = document.getElementById('revisitBranchNo');
const btnGoChase = document.getElementById('btnGoChase');
const btnRestToday = document.getElementById('btnRestToday');
const btnCheckMood = document.getElementById('btnCheckMood');
const btnLayFlat = document.getElementById('btnLayFlat');
const revisitFeedback = document.getElementById('revisitFeedback');
// [Day19-NEW] 顯示二訪介面(隱藏舊文案)
function showRevisitIntro() {
if (resonanceInner) resonanceInner.hidden = true;
if (revisitIntro) revisitIntro.hidden = false;
// 初始時收合兩個分支
if (branchYes) branchYes.hidden = true;
if (branchNo) branchNo.hidden = true;
// 顯示進場區塊、隱藏其他主區塊
if (introEl) introEl.hidden = false;
if (formSection) formSection.hidden = true;
if (historySection) historySection.hidden = true;
}
// [Day19-CHANGED] 覆寫 showIntro:依造訪狀態切換
function showIntro() {
const visited = hasVisitedBefore();
// 顯示進場區塊
if (introEl) introEl.hidden = false;
if (formSection) formSection.hidden = true;
if (historySection) historySection.hidden = true;
if (visited) {
// 回訪:隱藏舊文案、顯示 YES/NO 互動
showRevisitIntro();
} else {
// 首訪:顯示 Day 12 舊文案
if (resonanceInner) resonanceInner.hidden = false;
if (revisitIntro) revisitIntro.hidden = true;
}
}
// [Day19-NEW] 首次按下「一起看看今天怎麼了 →」就視為已造訪
startBtn?.addEventListener('click', () => {
markVisited();
hideIntroShowForm();
});
// [Day19-NEW] YES / NO 的分支切換(只顯示一個分支)
btnRevisitYes?.addEventListener('click', () => {
if (branchYes) branchYes.hidden = false;
if (branchNo) branchNo.hidden = true;
});
btnRevisitNo?.addEventListener('click', () => {
if (branchNo) branchNo.hidden = false;
if (branchYes) branchYes.hidden = true;
});
// [Day19-NEW] 四個行動按鈕的導向
btnGoChase?.addEventListener('click', () => {
showPage('taskSchedule'); // 直接進任務安排
renderArrangementSummary?.(); // 若已安排,顯示 Day 18 的溫暖總結
});
btnRestToday?.addEventListener('click', () => {
revisitFeedback.textContent = '好,先照顧好自己也是很棒的選擇✨';
// 可進階:觸發「建立提醒」或顯示微任務建議
});
btnCheckMood?.addEventListener('click', () => {
showPage('moodTest'); // 去做 Day 14 小測驗
});
btnLayFlat?.addEventListener('click', () => {
showPage('history'); // 躺平=先看看自己走了多少路
});
🔎 註:如果你希望「一開站就算造訪」而不是點 Start 才算,也可以在 init() 裡頭直接 markVisited() 一次(但通常我建議把「有明確互動」才算作造訪,比較符合實際使用)。
// [Day19-NOTE] init() 本體已存在,維持,但現在 showIntro() 會依旗標切換
(function init(){
showIntro(); // ← 回訪者會直接看到 YES/NO 互動;首訪者看到 Day 12 舊引導
if (sortSelect) sortSelect.value = currentSort;
if (filterSelect) filterSelect.value = currentFilter;
})();