STEP GUIDE · Checkpoint 1

這個步驟要做什麼、改哪裡、怎麼看結果

這一步聚焦 TASK-01;下方只比較「Starter → Checkpoint 1」的真實異動。

01

三項 Task 進度

TASK-01本步驟處理

預檢 Production URL 格式

預計修改:script.js

完成後:拒絕 example.com、localhost 與非 HTTPS 網址

TASK-02稍後處理

預檢 commit、問題描述與手機勾選

預計修改:script.js

完成後:拒絕空白或過短 commit,並列出待修格式

TASK-03稍後處理

安全產生期末展示草稿

預計修改:script.js

完成後:以 textContent 與 createElement 產生草稿,明列仍待人工驗收

02

HTML、CSS、JavaScript 與文件實際異動

展開檔案卡查看必要差異;只有程式碼區可以橫向捲動。

HTML本步驟無異動

檔案:index.html

修改前

前一步與本步驟沒有實質差異。

修改後

本步驟不需修改此語言。
CSS本步驟無異動

檔案:style.css

修改前

前一步與本步驟沒有實質差異。

修改後

本步驟不需修改此語言。
JavaScript本步驟有異動

檔案:script.js

修改前

  return false;
  return { evidence: null, errors: ["尚未完成格式預檢"] };
  status.textContent = "尚未完成格式預檢";

修改後

const forbiddenHosts = new Set(["localhost", "127.0.0.1", "::1", "example.com", "example.net", "example.org"]);
  try {
    const url = new URL(value);
    const host = url.hostname.toLowerCase();
    const isExampleSubdomain = [".example.com", ".example.net", ".example.org"].some((suffix) => host.endsWith(suffix));
    const isForbidden = forbiddenHosts.has(host) || host.endsWith(".localhost") || isExampleSubdomain;
    return url.protocol === "https:" && url.username === "" && url.password === "" && !isForbidden && host.includes(".");
  } catch {
    return false;
  }
  return { evidence: null, errors: ["尚未完成其餘欄位預檢"] };
  const urlValue = document.querySelector("#url").value.trim();
  status.textContent = isProductionUrl(urlValue)
    ? "URL 格式預檢通過;仍需人工開啟確認"
    : "請輸入非 example.com、非 localhost 的 HTTPS Production URL";
README/其他文件本練習未使用

檔案:README.md

修改前

本練習沒有這個檔案。

修改後

本步驟不需修改此語言。
03

怎麼看到結果

  1. 準備

    先準備真實 Netlify Production URL、commit 與手機檢查證據;沒有部署證據時只能做格式預檢。

  2. 操作

    填入 HTTPS 正式網址,再分別測試 example.com、localhost 與 HTTP 網址。

  3. 預期

    拒絕 example.com、localhost 與非 HTTPS 網址

Checkpoint 1 TASK-01

預檢 Production URL 格式

完成後可見:拒絕 example.com、localhost 與非 HTTPS 網址

只做格式預檢,仍需人工驗收

Production 證據格式預檢

尚未執行格式預檢