在AI带领下,学菜鸟教程学javascipt

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
<script>
function displayDate(){
	document.getElementById("demo").innerHTML=Date();
}
</script>
</head>
<body>

<h1>我的第一个 JavaScript 程序</h1>
<p id="demo">这是一个段落</p>

<button type="button" onclick="displayDate()">显示日期</button>

</body>
</html>

上面的是菜鸟原版的

AI把script 写在了body里面,他说

<p id="demo">这是一个段落</p>
<button id="btn">显示日期</button>

<script>
  const demo = document.getElementById("demo");
  const btn = document.getElementById("btn");

  btn.addEventListener("click", () => {
    demo.textContent = new Date().toLocaleString();
  });
</script>

好的老师!下面按“编写思路→一步步落地”的方式,把我刚写的那段“按钮点击→把 <p> 文本改成当前日期”的代码拆成清晰步骤。每一步的目的、要点和常见坑都写上了。


从 0 到 1 的编写思路(分步法)

1)明确最小可用功能(MVP)

  • 目标:页面上有一段文字和一个按钮;点击按钮后,把这段文字替换成“当前日期时间”。

  • 输入/输出:无表单输入;输出是把 <p> 的文字更新为 new Date() 的格式化字符串。

  • 交互事件:一次“点击”事件。

为什么先想清 MVP?
防止一开始就陷入样式或复杂结构,保证最短路径跑通功能。


2)规划 DOM 结构(放哪些标签、如何引用)

  • 需要一个展示区域<p id="demo">这是一个段落</p>

  • 需要一个触发器<button id="btn">显示日期</button>

  • 给元素加 id,方便脚本用 getElementById 精确获取。

常见坑:忘记加 id,后面脚本只能用模糊选择器或容易选错元素。


3)决定脚本的组织方式(结构与职责分离)

  • 在 HTML 标签上写 onclick(内联事件),改为在 JS 里统一注册事件(更易维护、可复用)。

  • 脚本写在页面底部 </body> 之前,或放 <head> 里配合 defer,避免 DOM 未解析完就取元素为 null

推荐:

<script defer src="main.js"></script>

或把 <script> 写在 </body> 之前。


4)获取要操作的 DOM 节点(建立“引用”)

  • 在脚本里用:

    • const demo = document.getElementById("demo")

    • const btn = document.getElementById("btn")

  • 变量用 const(引用不变),更安全。

常见坑:脚本执行时机早于 DOM 生成 → 取到 null
解决:用 defer,或把 <script> 放在页面底部。


5)选择日期的生成与展示方式(数据到视图)

  • 获取当前时间对象:new Date()

  • 选择展示格式:

    • 通用本地化now.toLocaleString()(自动按系统区域格式化)

    • 只要日期:now.toLocaleDateString()

    • 只要时间:now.toLocaleTimeString()

  • 写入文本:用 .textContent(仅文本,不解析 HTML,更安全)。

为什么不用 .innerHTML
避免不必要的 HTML 解析和 XSS 风险;这里只需写文本。


6)绑定事件监听(让按钮“活起来”)

  • 给按钮注册点击事件:

    btn.addEventListener("click", () => {
      const now = new Date();
      demo.textContent = now.toLocaleString();
    });
    
  • 用箭头函数简化;回调里只做一件事:把数据写入视图。

常见坑:同一按钮多次绑定重复监听。这里单次注册即可。


7)验证与微调(在浏览器里逐步检查)

  • 打开页面,点击按钮,是否即时更新?

  • 刷新页面是否恢复初始文案(因为初始内容在 HTML 里)?

  • 不同浏览器日期显示略有差异是正常的(toLocaleString 因区域而异)。


8)可选增强(根据项目需要逐步加)

  • 国际化固定格式(避免地区差异):

    demo.textContent = new Date().toISOString().replace('T',' ').slice(0,19);
    
  • 按钮防抖/节流:连续点击很多次时,是否需要限制频率?(一般不需要)

  • 无障碍:给按钮增加 aria-live 配合展示区域,让读屏器能读到变更。

  • 样式:使用 CSS 控制对齐、字号,不在 JS 里写样式。


9)代码结构回顾(为何是“现代写法”)

  • 结构分离:HTML 负责结构、JS 负责行为、CSS 负责样式。

  • 事件监听优于内联事件:更清爽、易维护、便于复用与测试。

  • 安全默认:用 .textContent 写文本,减少 XSS 面。

  • 时机可控defer 或脚本置底,避免空引用。


如果您接下来想把它升级为“再次点击恢复原文字”,编写思路只需在第 6 步里加入状态管理(用 let isOriginal = true; 控制分支),我也可以马上把这一版的“思路步骤”给您拆出来。要不要继续?

请登录后发表评论

    • 凌森的头像-ICD空间凌森等级-LV6-ICD空间作者超级版主0