2026年11月8日 星期日

JavaScript 入門教學(十一):Cookie 的現代用法(讀寫、屬性與隱私)

Cookie 是網站存在使用者瀏覽器裡的一小段文字資料,常用來記住登入狀態、偏好設定等。它歷史悠久,寫法也有很大的改變。本篇說明現在的正確用法,以及和 localStorage 的差別。

一、Cookie 與 localStorage 的差異

項目CookielocalStorage
容量每個約 4KB通常約 5MB
是否隨請求送到伺服器會,每次請求都會附上不會
有效期限可設定,到期自動刪除不會自動過期
主要用途登入識別、伺服器需要讀取的資料只在瀏覽器端使用的資料

如果資料只有前端程式要用(例如介面主題),用 localStorage 比較簡單,也不會增加每次請求的大小。需要讓伺服器知道的資料才用 Cookie。

JavaScript 入門教學(十):用 JavaScript 處理圖片(預先載入、切換與延遲載入)

早期的 JavaScript 教材花很多篇幅介紹「影像物件」:滑鼠移上去換圖(rollover)、預先載入圖片等。這些功能現在有更簡單的做法。本篇保留仍然有用的觀念,並介紹現代的替代方案。

一、img 元素也是 DOM 物件

網頁上的 <img> 就是一個普通的 DOM 元素,可以用 src、alt 等屬性控制:

<img id="pic" src="photo1.jpg" alt="第一張照片" width="400" height="300">

<script>
const pic = document.getElementById('pic');
pic.src = 'photo2.jpg';
pic.alt = '第二張照片';
</script>

換圖時別忘了一併更新 alt,這是給視障者使用的朗讀軟體,以及圖片載入失敗時顯示的替代文字。

JavaScript 入門教學(九):偵測瀏覽器與裝置(功能偵測、navigator、matchMedia)

早期的網頁常要判斷「使用者用的是 Netscape 還是 Internet Explorer」,再給不同的程式碼。今天這種做法已經行不通,也沒有必要。本篇說明為什麼,並介紹現在的標準作法。

一、舊寫法為什麼失效?

舊教材會用 navigator.appName 與 navigator.appVersion 判斷瀏覽器。但為了相容舊網站,現在的 Chrome、Firefox、Safari、Edge 回傳的 appName 幾乎都是 "Netscape",用它根本分不出瀏覽器。而 Internet Explorer 也已經退役,不需要特別處理。

同樣地,用 navigator.userAgent 的字串猜瀏覽器也很容易出錯,格式常常改變,不建議作為判斷依據。

二、正確觀念:偵測「功能」,不是偵測「品牌」

我們真正關心的是「這個瀏覽器能不能做某件事」,所以直接檢查該功能是否存在:

// 是否支援定位
if ('geolocation' in navigator) {
  console.log('可以使用定位功能');
}

// 是否支援 IntersectionObserver
if ('IntersectionObserver' in window) {
  // 使用新功能
} else {
  // 使用替代作法
}

// CSS 功能偵測
console.log(CSS.supports('display', 'grid'));

這種寫法不管瀏覽器叫什麼名字,只要有該功能就能使用,也比較不怕未來改版。

JavaScript 入門教學(八):表單驗證(HTML5 驗證、setCustomValidity 與 FormData)

使用者填表單時,難免漏填、打錯格式。與其送出後才由伺服器通知,不如先在瀏覽器檢查,立刻告訴使用者哪裡要修正。本篇先用 HTML5 內建的驗證,再用 JavaScript 補上客製的規則,並學會用 FormData 一次取得所有欄位。

一、HTML5 內建驗證:不寫程式也能檢查

屬性作用
required必填
type="email"必須是電子郵件格式
minlength/maxlength文字最少/最多幾個字
min/max數字或日期的範圍
pattern="正規表示式"符合指定格式
<form>
  <input name="nick" required minlength="2" maxlength="10">
  <input name="mail" type="email" required>
  <input name="age" type="number" min="18" max="99">
  <button>送出</button>
</form>

欄位不合格時,瀏覽器會擋下送出動作並顯示提示,提示文字由瀏覽器決定,會隨使用者的語言而不同。

二、用 JavaScript 讀取驗證結果

每個欄位都有 validity 物件,記錄各種檢查結果:

const mail = document.querySelector('[name="mail"]');

mail.addEventListener('input', () => {
  console.log(mail.validity.valueMissing);   // 是否漏填
  console.log(mail.validity.typeMismatch);   // 格式是否不符
  console.log(mail.checkValidity());         // 整體是否合格(true/false)
});

整個表單也可以呼叫 form.checkValidity(),或用 form.reportValidity() 讓瀏覽器顯示提示。