--- title: 笑话生成器 slug: Learn/JavaScript/First_steps/Silly_story_generator tags: - JavaScript - 初学者 - 变量 - 字符串 - 学习 - 操作符 - 数字 - 数组 - 测试 - 脚本代码 - 课程设计 translation_of: Learn/JavaScript/First_steps/Silly_story_generator ---
本节是一个小测验,要求你运用所学知识制作一个笑话生成器。祝玩的愉快!
| 预备知识: | 请读完本章所有小节的内容后再开始这个测验。 |
|---|---|
| 目标: | 测试你对变量、数字、操作符、字符串和数组等 Javascript 基本概念的理解程度。 |
测验开始之前需要下载并保存 index.html、style.css、raw-text.txt。
注: 你还可以用类似 JSBin 或 Thimble 这些在线编辑器来完成测验。你可以把 HTML、CSS 及 JavaScript 代码复制过去。如果你选的工具没有独立的 JavaScript 版面,可以随时在 HTML 页面中添加 <script> 元素。
我们提供了一些原始的 HTML / CSS,以及若干字符串和 JavaScript 函数,还需要你来编写一些 JavaScript 代码让项目运行起来:
可以尝试操作一下:(别偷看源代码哦!)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
body {
font-family: helvetica, sans-serif;
width: 350px;
border: 1px solid;
padding: 1em;
}
label {
font-weight: bold;
}
div {
padding-bottom: 20px;
}
input[type="text"] {
padding: 5px;
width: 150px;
}
p {
background: #FFC125;
color: #5E2612;
padding: 10px;
visibility: hidden;
}
</style>
</head>
<body>
<div>
<label for="customname" id="lbl-customname">请输入自定义的名字:</label>
<input id="customname" type="text" placeholder="李雷">
</div>
<div>
<label for="metric">公制</label><input id="metric" type="radio" name="measure" value="metric" checked>
<label for="american">美制</label><input id="american" type="radio" name="measure" value="american">
</div>
<div>
<button class="randomize">随机生成笑话</button>
</div>
<!-- Thanks a lot to Willy Aguirre for his help with the code for this assessment -->
<p class="story"></p>
<script>
const customName = document.getElementById('customname');
const randomize = document.querySelector('.randomize');
const story = document.querySelector('.story');
function randomValueFromArray(array){
const random = Math.floor(Math.random() * array.length);
return array[random];
}
let storyText = '今天气温 35 摄氏度,:insertx:出门散步。当走到:inserty:门前时,突然就:insertz:。人们都惊呆了,李雷全程目睹但并没有慌,因为:insertx:是一个 140 公斤的胖子,天气又辣么热。';
let insertX = ['怪兽威利', '大老爹', '圣诞老人'];
let insertY = ['肯德基', '迪士尼乐园', '白宫'];
let insertZ = ['自燃了', '在人行道化成了一坨泥', '变成一只鼻涕虫爬走了'];
randomize.addEventListener('click', result);
function result() {
let newStory = storyText;
let xItem = randomValueFromArray(insertX);
let yItem = randomValueFromArray(insertY);
let zItem = randomValueFromArray(insertZ);
newStory = newStory.replace(':insertx:', xItem);
newStory = newStory.replace(':insertx:', xItem);
newStory = newStory.replace(':inserty:', yItem);
newStory = newStory.replace(':insertz:', zItem);
if(customName.value !== '') {
const name = customName.value;
newStory = newStory.replace('李雷', name);
}
if(document.getElementById("american").checked) {
const weight = Math.round(140 * 2.20462) + ' 磅';
const temperature = Math.round(35 * 9 / 5 + 32) + ' 华氏度';
newStory = newStory.replace('35 摄氏度', temperature);
newStory = newStory.replace('140 公斤', weight);
}
story.textContent = newStory;
story.style.visibility = 'visible';
}
</script>
</body>
</html>
{{ EmbedLiveSample('Silly_story_generator', '100%', 350, "", "", "hide-codepen-jsfiddle") }}
以下是你的工作。
初始化变量和函数:
customName 是对“输入自定义的名字”文本框的引用,randomize 是对“随机生成笑话”按钮的引用,story 是对 HTML 底部的、准备存放笑话的 {{htmlelement("p")}} 元素的引用)和一个函数(randomValueFromArray() 取一个数组作参数,随机返回数组中的一个元素)。storyText 变量保存第一个长字符串,“今天气温……”。insertX 数组保存第一组三个字符串,“怪兽威利……”。insertY 数组保存第二组三个字符串。“肯德基……”。insertZ 数组保存第三组三个字符串。“自燃了……”。放置事件处理器并补全:
main.js 文件。这将:
randomize 变量增加一个点击事件的监听器。于是当所引用的按钮被点击时,result() 函数就会运行。result() 函数定义。本测验剩下的工作就是完成这个函数,让程序正常运行起来。补全 result() 函数:
newStory 的值设置为 storyText。声明新变量有必要的,只有这样才能在每次按下按钮后、在函数运行时生成一个新的随机笑话。如果直接操作 storyText 则只能生成一次新故事xItem、yItem 和 zItem 分别设置为 randomValueFromArray(insertX)、randomValueFromArray(insertY) 和 randomValueFromArray(insertZ)。newStory 中的占位符(:inserta:、:insertb: 和 :insertc: )替换为 xItem、yItem 和 zItem。有专用的字符串方法可供使用,并用该方法的返回值为 newStory 赋值。每当按下按钮时,这些占位符都会替换为随机的笑话字符串。再给你一点提示,我们所说的这种方法每次只会将所找到的首个子字符串进行替换,因此该方法对某个占位符需要执行两次。if 块中再次调用这个字符串替换方法,以使 newStory 字符串中的名字“李雷”替换为变量 name 的值 。这里我们说:“如果 customName 中有值,就把故事里的 “李雷”替换成它。” 如果是汉化版将newStory中的“李雷”替换成 name 的值;if 块中检查 american 单选按钮是否被选中。如果选中,就要将故事中的重量和温度值从公斤和摄氏度转换为磅和华氏度,具体事项如下:
weight、temperature 的行中,分别将美制单位按公式转化为英制,用 Math.round() 对计算结果取整。然后将英式单位连接到末尾。temperature 的值,将“140 公斤”替换为 weight 的值。story.textContent(程序中显示笑话结果的段落) 赋值为 newStory。document.querySelector('html').style.backgroundColor = 'red';
Math.round() 是 Javascript 的内建函数,可取得与传入小数最接近的整数。replace() 方法,也可使用正则表达式。例如:var text = 'I am the biggest lover, I love my love'; 或 text.replace(/love/g,'like'); 会将所有的“love”替换为“like”。记住,字符串本身是不可修改的!如果你是在课堂上进行这个测验,你可以把作品交给导师或教授去打分了。如果你是在自学,也可以在 本节测验的讨论页 或者 Mozilla 聊天室 的 #mdn 频道取得帮助。要自己先尝试,作弊是不会有收获的!
{{PreviousMenu("Learn/JavaScript/First_steps/Arrays", "Learn/JavaScript/First_steps")}}