随机名言生成器
简单约 15 分钟
你将构建什么
一个名言生成器:页面显示一条随机名言和作者,点击“换一条”按钮从预设数组中随机抽取另一条名言展示。
学习目标
- 用数组存储多条名言数据
- 用 Math.random 生成随机索引
- 用 DOM 操作更新页面显示
- 理解数组索引和取值操作
前置要求
- 了解 JavaScript 数组基础
- 了解 DOM 操作和事件监听
- 已完成“计数器”项目或具备同等基础
步骤
- 1
准备名言数据
在 JS 中定义一个数组,每个元素是包含 text 和 author 字段的对象。先放五条名言进去。
代码const quotes = [ { text: "千里之行,始于足下。", author: "老子" }, { text: "不积跬步,无以至千里。", author: "荀子" }, { text: "学而时习之,不亦说乎。", author: "孔子" }, { text: "纸上得来终觉浅,绝知此事要躬行。", author: "陆游" }, { text: "业精于勤,荒于嬉。", author: "韩愈" }, ];预期结果
quotes 数组包含五条名言对象。
提示
用对象而非数组存储每条名言,字段名更清晰,后续维护方便。
- 2
搭建 HTML 结构
HTML 中放一个显示名言的区块和一个“换一条”按钮。用 blockquote 语义化标签。
代码<blockquote id="quote-text">点击下方按钮获取名言</blockquote> <p id="quote-author"></p> <button id="new-quote">换一条</button>预期结果
页面显示名言占位文本和按钮。
提示
blockquote 标签语义化表示引用内容,对 SEO 和无障碍更友好。
- 3
实现随机抽取逻辑
编写函数:用 Math.random 乘以数组长度生成随机索引,Math.floor 取整,从数组取一条名言,更新 DOM。
代码const quoteTextEl = document.querySelector('#quote-text'); const quoteAuthorEl = document.querySelector('#quote-author'); const newQuoteBtn = document.querySelector('#new-quote'); function showRandomQuote() { const index = Math.floor(Math.random() * quotes.length); const quote = quotes[index]; quoteTextEl.textContent = quote.text; quoteAuthorEl.textContent = '—— ' + quote.author; } newQuoteBtn.addEventListener('click', showRandomQuote); // 页面加载时先显示一条 showRandomQuote();预期结果
页面加载即显示一条随机名言,点击按钮换另一条。
提示
Math.random 返回 0 到 1 的小数,乘以长度再向下取整得到合法索引。
- 4
避免连续重复
进阶:记录上一次的索引,如果新抽到的和上次相同就再抽一次。让体验更好。
代码let lastIndex = -1; function showRandomQuote() { let index; do { index = Math.floor(Math.random() * quotes.length); } while (index === lastIndex && quotes.length > 1); lastIndex = index; const quote = quotes[index]; quoteTextEl.textContent = quote.text; quoteAuthorEl.textContent = '—— ' + quote.author; }预期结果
连续点击不会出现连续两次相同的名言。
提示
do-while 至少执行一次,条件保证不重复——数组长度大于 1 时才有意义。
自己动手试试
起始代码
const quotes = [
/* TODO: 添加 5 条名言对象 */
];
function showRandomQuote() {
// TODO: 随机抽取一条名言并更新 DOM
}
// TODO: 绑定按钮事件解决方案代码
const quotes = [
{ text: "千里之行,始于足下。", author: "老子" },
{ text: "不积跬步,无以至千里。", author: "荀子" },
{ text: "学而时习之,不亦说乎。", author: "孔子" },
{ text: "纸上得来终觉浅,绝知此事要躬行。", author: "陆游" },
{ text: "业精于勤,荒于嬉。", author: "韩愈" },
];
const quoteTextEl = document.querySelector('#quote-text');
const quoteAuthorEl = document.querySelector('#quote-author');
const newQuoteBtn = document.querySelector('#new-quote');
let lastIndex = -1;
function showRandomQuote() {
let index;
do {
index = Math.floor(Math.random() * quotes.length);
} while (index === lastIndex && quotes.length > 1);
lastIndex = index;
const quote = quotes[index];
quoteTextEl.textContent = quote.text;
quoteAuthorEl.textContent = '—— ' + quote.author;
}
newQuoteBtn.addEventListener('click', showRandomQuote);
showRandomQuote();你学到了什么
你学会了用数组管理数据、用随机数做抽样、用 DOM 更新视图——这是数据驱动 UI 的雏形。把数据和展示分离,后续更换数据源只需改数组。
相关资源
相关练习
- JS 变量预测题
预测代码运行结果。
相关工具
- JSON 格式化工具
名言数据可以用 JSON 格式存储。
相关参考文档
- JavaScript 数组方法
完整的 API 参考。
- JavaScript 数学
完整的 API 参考。
相关错误
- 无法读取 undefined 的属性
常见错误及解决方法。
- 引用错误:未定义
常见错误及解决方法。
相关术语
新手友好的术语表用大白话解释编程术语——变量、函数、DOM、Promise 等等。
相关错误
用大白话解释常见错误——什么意思、为什么发生、如何修复。
- 无法读取 undefined 的属性
常见错误及解决方法。
- 引用错误:未定义
常见错误及解决方法。