首页
/ freeCodeCamp Bootstrap 课程实战:为按钮添加与 id 对应的文字标签(Label Bootstrap Buttons)

freeCodeCamp Bootstrap 课程实战:为按钮添加与 id 对应的文字标签(Label Bootstrap Buttons)

2026-09-07 18:56:40作者:卓艾滢Kingsley

本文基于 freeCodeCamp 开源仓库中"响应式 Web 设计/前端库"系列的 Bootstrap 课程挑战文件 label-bootstrap-buttons,系统拆解"Label Bootstrap Buttons"这一练习的目标、HTML 结构与自动验证规则,并结合仓库内同系列挑战的源码与结构清单,讲清"如何让按钮内部文本与其 id 选择器文字一致"这一入门级 DOM 操作及其在课程演进中的定位。读完本文,你既能独立完成该挑战并理解其全部验收断言,也能掌握 freeCodeCamp 课程文件 # --seed--# --hints--# --solutions-- 三段式结构的真实形态。

挑战的课程定位与背景

"Label Bootstrap Buttons" 属于 Bootstrap 系列课程中的一个步骤。在仓库的课程结构清单 bootstrap.json 中,该块(block)的 challengeOrder 数组从"Use Responsive Design with Bootstrap Fluid Containers"一路排到"Use Comments to Clarify Code",挑战 id bad87fee1348bd9aec908856 对应的标题正是 "Label Bootstrap Buttons",其 dashedNamelabel-bootstrap-buttons。它的前一个挑战是 "Give Each Element a Unique id"(bad87fee1348bd9aec908855.md),后一个是 "Use Comments to Clarify Code"(bad87fee1348bd9aec908857.md)。

从命名与顺序可以看出,这是一个"搭建 jQuery Playground 页面"的递进式教学环节:

  1. 先给按钮加上可供 jQuery 批量选中的 target 类("Create a Class to Target with jQuery Selectors",bad87fee1348bd9aec908852.md);
  2. 再为 wellbutton 等元素补充唯一的 id("Add id Attributes to Bootstrap Elements"、"Give Each Element a Unique id");
  3. 接着像上一关给 well 添加标题文字一样,让每个按钮显示与自身 id 对应的文本;
  4. 最后由注释挑战收尾,并提示"后续课程将用 jQuery 直接修改 HTML 元素,无需再手改这段 HTML"——见 bad87fee1348bd9aec908857.mdWhen we start using jQuery, we will modify HTML elements without needing to actually change them in HTML 的描述。

也就是说,本关的核心动作是为即将到来的 jQuery 选择器与 DOM 操作课程准备好"肉眼可见、可被选择、可被验证"的 6 个目标按钮。

任务目标与 HTML 基础

挑战文件的 # --description-- 写得很简短但含义明确:

Just like we labeled our wells, we want to label our buttons. Give each of your button elements text that corresponds to its id selector.

翻译过来即:让每个 button 元素内部出现与它 id 选择器写法一致的文本。上一关已经给按钮分配好了唯一 id(target1 ~ target6),因此本关只要求补上显示文字,例如 id="target1" 的按钮,其显示文本应为 #target1

这里涉及一个基础 HTML 概念:<button> 是一个双标签元素,开始标签与结束标签之间的文本就是按钮的可见标签,也是 DOM 节点的文本内容。当 <button class="btn btn-default target" id="target1"></button> 为空时,按钮虽然存在且具备样式,但界面上看不到任何说明文字,jQuery 后续也无法判断它代表哪个目标。将文本填入标签体即可:

<button class="btn btn-default target" id="target1">#target1</button>

该文本中之所以保留 # 符号,是为了让文字直接对应"id 选择器"在 CSS/jQuery 中的书写形式(#target1),这是课程刻意设计的教学细节:按钮文字本身是普通文本,并不参与选择器解析。

初始代码结构逐层拆解

挑战的 # --seed-- 提供了完整的待修改 HTML(原始文件第 57~79 行):

<div class="container-fluid">
  <h3 class="text-primary text-center">jQuery Playground</h3>
  <div class="row">
    <div class="col-xs-6">
      <h4>#left-well</h4>
      <div class="well" id="left-well">
        <button class="btn btn-default target" id="target1"></button>
        <button class="btn btn-default target" id="target2"></button>
        <button class="btn btn-default target" id="target3"></button>
      </div>
    </div>
    <div class="col-xs-6">
      <h4>#right-well</h4>
      <div class="well" id="right-well">
        <button class="btn btn-default target" id="target4"></button>
        <button class="btn btn-default target" id="target5"></button>
        <button class="btn btn-default target" id="target6"></button>
      </div>
    </div>
  </div>
</div>

各层结构的作用可以对照整个系列课程来理解:

层级 类名 / id 作用
最外层 container-fluid Bootstrap 3 流式容器,让页面占满全宽(对应前序挑战 "House our page within a Bootstrap container-fluid div")
标题 h3.text-primary.text-center Bootstrap 主题色 + 居中标题
栅格行 row Bootstrap 栅格行(对应 "Create a Bootstrap Row")
栅格列 col-xs-6 在超小屏上平分两列(对应 "Split Your Bootstrap Row")
井区 well + id="left-well"/"right-well" Bootstrap 内凹背景容器(对应 "Create Bootstrap Wells"、"Label Bootstrap Wells")
按钮 btn btn-default target + id="target1"~"target6" 默认样式的 Bootstrap 按钮;target 类供 jQuery 统一选中;唯一 id 供逐一定位

可以看到,本关的初始代码已经把所有 idtarget 类都备齐了,学习者的唯一任务就是把每个按钮的文本补齐。这正是 freeCodeCamp"小步快进、一次只练一个知识点"的设计风格。

验证规则(hints)逐条解读

挑战文件的 # --hints-- 是自动评分系统实际执行的断言。本关共 6 条,规则模式完全一致,例如第一条:

assert.match(document.querySelector('#target1')?.textContent, /#target1/gi)

其余 5 条只是把 target1 换成 target2 ~ target6(见 原始文件第 15~51 行)。解读要点如下:

  • document.querySelector('#target1') 用原生 DOM API 按 id 找到对应按钮元素;
  • ?.textContent 读取其文本内容,可选链保证元素不存在时不会抛错而是得到 undefined
  • assert.match(...) 断言文本与正则 /#target1/gi 匹配:# 在正则中表示匹配字符串起始,但由于没有使用 ^ 锚点,配合 g 标志会扫描整段文本中是否存在子串 target1i 表示忽略大小写;
  • 校验的是 textContent 而非严格全等,因此只要按钮里包含正确文本即可通过,即使周围有额外空白字符也不影响判定。

简言之,自动评分关心的是"每个按钮的 DOM 文本中是否包含与其 id 相对应的文字"。这与课程验证器在挑战环境中对 HTML 进行断言测试的机制一致——更多课程校验细节可参考课程校验测试工具,例如 curriculum/src/get-challenges.ts 中加载挑战、解析 --hints-- 并交由测试执行的整体流程。

参考实现与手动演练

# --solutions-- 给出的官方标准答案(原始文件第 81~105 行)非常直观:只改动按钮标签体,其他结构一概不动。

<div class="container-fluid">
  <h3 class="text-primary text-center">jQuery Playground</h3>
  <div class="row">
    <div class="col-xs-6">
      <h4>#left-well</h4>
      <div class="well" id="left-well">
        <button class="btn btn-default target" id="target1">#target1</button>
        <button class="btn btn-default target" id="target2">#target2</button>
        <button class="btn btn-default target" id="target3">#target3</button>
      </div>
    </div>
    <div class="col-xs-6">
      <h4>#right-well</h4>
      <div class="well" id="right-well">
        <button class="btn btn-default target" id="target4">#target4</button>
        <button class="btn btn-default target" id="target5">#target5</button>
        <button class="btn btn-default target" id="target6">#target6</button>
      </div>
    </div>
  </div>
</div>

三个可以手动验证的小实验,帮助理解"文本与 id 对应"的实质:

  1. 不补文本也能通过吗? 不能。空按钮的 textContent 为空字符串(或仅含空白),无法与 /target1/gi 匹配,6 条断言会全部失败。
  2. 只写 target1 不写 # 能通过吗? 能。正则 /#target1/gi 并不强制要求文本中出现 #;但课程出于"文本对应 id 选择器"的教学意图,建议保留 #。这也说明自动判题更多是"宽容检查关键内容",而非"严格比对整段文字"。
  3. target1 写成大写 TARGET1 呢? 也能通过,因为正则带 i 标志忽略大小写。

在浏览器中肉眼验证的方法是:将上述最终 HTML 保存为页面,引入 Bootstrap 3 CSS(本块在 bootstrap.jsonrequired 字段中声明了 https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.css)后打开,即可看到左右两个 well 中各出现 3 个带文字标签的默认按钮。

与后续 jQuery 课程的衔接

本关的意义不止于补几个字符串。整个 Bootstrap 系列结尾("Use Comments to Clarify Code")明确预告:进入 jQuery 系列后,将通过 jQuery 直接修改这些 HTML 元素,而不必再改动 HTML 源码。这一点在课程结构中同样得到印证:jQuery 块 jquery.json 的标题序列从"Learn How Script Tags and Document Ready Work"、"Target HTML Elements with Selectors Using jQuery"、"Target Elements by Class Using jQuery"、"Target Elements by id Using jQuery"开始,所需的 CDN 资源也从 Bootstrap CSS 增加了 https://code.jquery.com/jquery-3.6.0.min.js

届时,#target1~#target6 将成为一系列 jQuery 练习的操作对象,例如按 id 选中后修改文本、修改 CSS、禁用元素或删除元素。因此,本关为每个按钮打上"与其 id 一致"的文字标签,本质上是在为后续这些操作建立清晰的、可观察的基准状态——当你在 jQuery 课程中执行 $('#target1').text('...') 之类的改动时,能立刻在界面上看到按钮文字变化。

小结

"Label Bootstrap Buttons"用一次极小的编辑(给 6 个按钮补上 #targetN 文本)串联了三个前端基础点:

  1. HTML 文本内容<button> 的标签体即按钮显示文本,也是 DOM textContent 的来源;
  2. id 与文本的语义对应:按钮文字对应其 id 选择器写法,为后续 jQuery/CSS 选择器学习铺路;
  3. freeCodeCamp 挑战文件的协作语法:理解 bootstrap 块结构 中的 challengeOrder、挑战文件里 # --description--# --hints--# --seed--# --solutions-- 四个段落的职责分工,能帮助你读懂整个课程体系里上千个 Markdown 挑战的组织方式。

在仓库中继续探索时,可对照阅读:同块内 label-bootstrap-wells 挑战(本关"打标签"思路的直接前身)、give-each-element-a-unique-id 挑战(id 分配来源),以及 jQuery 块的 id 选择器练习,即可完整还原 freeCodeCamp 由 HTML 结构走向 jQuery DOM 操作的经典教学路径。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.13 K
2.75 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
857
1.35 K
docsdocs
暂无描述
Markdown
897
5.8 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
529
593
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
915
1.83 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.58 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.35 K
1.46 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.01 K
515
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
547
388