习题解答
这道题用 setInterval 定时器每隔几秒随机更换页面背景颜色。就像给网页装了一个"变色灯",每隔一段时间自动换一种颜色。
完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>按时间随机变化的网页背景</title>
<style>
body { text-align: center; transition: background-color 0.5s; }
h1 { margin-top: 100px; color: #fff; font-size: 28px;
text-shadow: 2px 2px 4px rgba(0,0,0,0.5); }
</style>
</head>
<body>
<h1>按时间随机变化的网页背景</h1>
<script type="text/javascript">
// 生成随机颜色的函数
function randomColor() {
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
return "rgb(" + r + "," + g + "," + b + ")";
}
// 每2秒更换一次背景颜色
setInterval(function() {
document.body.style.backgroundColor = randomColor();
}, 2000);
// 页面加载时先设置一次
document.body.style.backgroundColor = randomColor();
</script>
</body>
</html>
代码要点说明:
Math.random() 生成 0~1 之间的随机小数,乘以 256 再取整得到 0~255 的颜色值。setInterval(函数, 毫秒) 每隔指定时间反复执行函数,2000 毫秒 = 2 秒。document.body.style.backgroundColor 通过 DOM 操作修改页面背景色。📖 参见 8.1.2 window 对象(setTimeout/setInterval)、8.1.3 document 对象(document.body)
计时器的原理:用一个变量记录秒数,用 setTimeout 每隔1秒让秒数加1,想暂停就用 clearTimeout 停掉定时器。
完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单的计时器</title>
</head>
<body>
<!-- 显示秒数的文本框 -->
<input type="text" id="timer" value="0" size="5" readonly />
<!-- 开始和暂停按钮 -->
<input type="button" value="开始计时" onclick="startTimer()" />
<input type="button" value="暂停计时" onclick="stopTimer()" />
<script type="text/javascript">
var count = 0; // 计数器
var timer = null; // 保存定时器ID
function startTimer() {
// 先清除之前的定时器,防止重复启动
clearTimeout(timer);
count++; // 秒数+1
document.getElementById("timer").value = count;
// 1秒后再次调用自己,形成循环
timer = setTimeout(startTimer, 1000);
}
function stopTimer() {
// 清除定时器,计时暂停
clearTimeout(timer);
}
</script>
</body>
</html>
代码要点说明:
setTimeout(函数, 1000) 延迟1秒执行一次,配合递归调用实现持续计时。clearTimeout(timer) 取消定时器,实现暂停功能。clearTimeout,防止用户多次点击"开始"导致多个定时器同时运行。📖 参见 8.1.2 window 对象(setTimeout/clearTimeout)

通过下拉框的 onchange 事件,获取用户选择的颜色值,然后修改文本框的文字颜色。
完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>用下拉文本框改变字体颜色</title>
</head>
<body>
<!-- 文本输入框 -->
<input type="text" id="txt" value="变换的文字" style="font-size:18px;" />
<!-- 颜色选择下拉菜单 -->
<select id="colorSelect" onchange="changeColor()">
<option value="black">黑</option>
<option value="yellow">黄</option>
<option value="blue">蓝</option>
<option value="green">绿</option>
<option value="red">红</option>
<option value="purple">紫</option>
</select>
<script type="text/javascript">
function changeColor() {
// 获取下拉菜单选中的颜色值
var color = document.getElementById("colorSelect").value;
// 修改文本框的字体颜色
document.getElementById("txt").style.color = color;
}
</script>
</body>
</html>
代码要点说明:
onchange 事件在下拉菜单的选项被改变时触发。select.value 获取当前选中的 <option> 的 value 值。style.color 修改元素的文字颜色。📖 参见 8.1.3 document 对象(getElementById)、8.2 DOM 的对象

通过监听 oncontextmenu(右键菜单)事件,弹出警告并阻止默认的右键菜单弹出。
完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>展示图片</title>
</head>
<body>
<h2>此网页显示</h2>
<!-- 用占位色块替代实际图片,实际使用时替换src为真实图片路径 -->
<div style="width:300px;height:200px;background:#8a9b6e;
display:flex;align-items:center;justify-content:center;color:#fff;">
风景图片占位
</div>
<script type="text/javascript">
// 禁止整个页面的右键菜单
document.oncontextmenu = function(e) {
alert("网站展示的图片禁止下载!");
return false; // 阻止默认的右键菜单弹出
}
</script>
</body>
</html>
代码要点说明:
document.oncontextmenu 监听右键菜单事件。return false 阻止浏览器默认弹出右键菜单。alert() 弹出警告对话框提醒用户。📖 参见 8.1.3 document 对象、8.1.2 window 对象(alert)

年月日联动的关键在于:不同月份的天数不同(大月31天、小月30天、2月要看是否闰年)。每当用户改变"年"或"月"时,就重新计算"日"的选项。
完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>年月日的联动</title>
</head>
<body>
<!-- 年份下拉 -->
<select id="year" onchange="updateDays()"></select>年
<!-- 月份下拉 -->
<select id="month" onchange="updateDays()"></select>月
<!-- 日期下拉 -->
<select id="day"></select>日
<script type="text/javascript">
var yearSel = document.getElementById("year");
var monthSel = document.getElementById("month");
var daySel = document.getElementById("day");
// 初始化年份选项(2000~2030)
for (var y = 2000; y <= 2030; y++) {
var opt = document.createElement("option");
opt.value = y;
opt.textContent = y;
yearSel.appendChild(opt);
}
yearSel.value = 2020; // 默认2020年
// 初始化月份选项(1~12)
for (var m = 1; m <= 12; m++) {
var opt = document.createElement("option");
opt.value = m;
opt.textContent = m;
monthSel.appendChild(opt);
}
monthSel.value = 2; // 默认2月
// 获取某年某月的天数
function getDays(year, month) {
// 用下个月的第0天,就是本月的最后一天
return new Date(year, month, 0).getDate();
}
// 更新日期下拉选项
function updateDays() {
var year = parseInt(yearSel.value);
var month = parseInt(monthSel.value);
var days = getDays(year, month);
// 记住之前选的日期
var oldDay = parseInt(daySel.value) || 1;
// 清空旧选项
daySel.innerHTML = "";
// 生成新选项
for (var d = 1; d <= days; d++) {
var opt = document.createElement("option");
opt.value = d;
opt.textContent = d;
daySel.appendChild(opt);
}
// 尽量保持之前选的日期
daySel.value = Math.min(oldDay, days);
}
// 页面加载时初始化日期
updateDays();
</script>
</body>
</html>
代码要点说明:
new Date(year, month, 0).getDate() 是获取某月天数的技巧——"下个月的第0天"就是"本月的最后一天"。Date 对象的内部逻辑中,不需要手动判断。onchange 触发 updateDays() 重新生成日的选项。📖 参见 8.1.2 window 对象、8.2 DOM 的对象(createElement/appendChild/innerHTML)

从截图看:两个输入框中间有"+"号,右边有"="按钮,点击后在最右边的框里显示加法结果。比第7章的四则运算计算器更简单,只做加法。
完整代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简易加法计算器</title>
</head>
<body>
<!-- 第一个数 -->
<input type="text" id="num1" size="10" />
+
<!-- 第二个数 -->
<input type="text" id="num2" size="10" />
<!-- 等号按钮 -->
<input type="button" value="=" onclick="calc()" />
<!-- 结果 -->
<input type="text" id="result" size="10" readonly />
<script type="text/javascript">
function calc() {
// 获取两个输入框的值并转为数字
var a = parseFloat(document.getElementById("num1").value);
var b = parseFloat(document.getElementById("num2").value);
// 计算结果并显示
document.getElementById("result").value = a + b;
}
</script>
</body>
</html>
代码要点说明:
parseFloat() 把字符串转为浮点数,否则 "100"+"200" 会得到字符串拼接 "100200"。getElementById().value 获取/设置输入框的值。readonly 属性,防止用户手动修改结果。📖 参见 8.1.3 document 对象(getElementById)、8.2 DOM 的对象