第5章 JavaScript技术实践 5.1 知识简介 5.1.1 JavaScript概述 JavaScript(简称JS)是一种高级编程语言,用于Web开发和其他应用程序中的客户 端和服务器端编程。JavaScript最初由Netscape公司的BrendanEich在1995年创建,它 是一种面向对象的脚本语言,不需要编译就可以在Web浏览器中运行,并且可以与 HTML和CSS一起使用来实现具有交互性的Web页面。JavaScript由三部分组成,下 面对这三部分进行简单介绍。 (1)ECMAScript:一种标准化的脚本语言规范,最初由欧洲计算机制造商协会 (ECMA)制定。其定义了JavaScript的核心语法、数据类型、控制结构、函数、对象等基本 特性,以及一些新的语言特性,例如,模块化、箭头函数、类、异步函数等。如果读者想要查 看ECMAScript的最新规范,可参考ECMAScript官方网站。 (2)DOM(DocumentObjectModel,文档对象模型):定义如何访问和操作HTML 文档中的元素,使得JavaScript可以与Web页面进行交互。 (3)BOM(BrowserObjectModel,浏览器对象模型):定义与浏览器交互的对象和方 法,用户可以通过BOM 对浏览器窗口进行操作(例如,刷新窗口、弹出对话框等)。 要使用JavaScript,需要将其引入HTML文件中。JavaScript的引入方式主要有三 种,分别是内部引入、外部引入和行内引入。 5.1.2 HTMLDOM 操作 在Web开发中,文档对象模型(DocumentObjectModel,DOM)扮演着举足轻重的 角色。它是网页的结构化表示形式,允许程序和脚本动态地访问、修改网页内容、结构和 样式。通过JavaScript操作DOM,可以赋予网页交互性与生命力。 DOM 将HTML文档视作一个节点树结构,其中每个元素、属性、文本都是树中的一 个节点,如图5-1所示。根节点通常是<html>元素,从它开始,整个文档被组织成一系列 嵌套的节点。理解这一结构是进行DOM 操作的前提。 要对页面上的元素进行操作,先得获取它们。JavaScript提供了多种方法来选取 DOM 元素,包括但不限于以下几种。 (1)通过ID获取:使用document.getElementById(e'lementId'),精确获取带有指定 ID的元素。 (2)通过类名获取:使用document.getElementsByClassName(c'lassName'),可以获 取具有特定类名的所有元素集合。 ·51· 视频讲解 图5-1 HTMLDOM 树的结构 (3)通过标签名获取:使用document.getElementsByTagName(t' agName'),返回所 有指定标签名的元素集合。 (4) 使用querySelector 系列: 更加灵活的选择器,例如,使用document. querySelector('.className')可以返回匹配指定CSS 选择器的第一个元素,而使用 document.querySelectorAll()可以返回所有匹配的元素集合。 获取元素后,即可对其进行修改,从而实现动态效果。常见的修改方式包括以下 几种。 (1)修改内容:通过.textContent或.innerHTML属性,可以改变元素的文本内容或 HTML结构。例如,使用“element.textContent= '新内容'”仅可以替换文本,而使用 “element.innerHTML = '<strong>新内容</strong>'”则可以插入HTML标签。 (2)修改属性:使用.setAttribute('attributeName','value')可以设置元素的属性值, 例如,改变图片的src属性。使用.removeAttribute(a' ttributeName')则可以移除属性。 (3)添加/删除元素:可以使用document.createElement(t' agName')创建新元素,然 后使用appendChild()或prependChild()将其添加到父元素内。移除元素则可以通过 removeChild()实现。 DOM 操作往往与事件处理紧密相关。通过为元素绑定事件监听器,可以响应用户 的动作,例如,点击、鼠标指针悬停等。 5.2 实践目的 通过该实践,加深读者对DOM 操作及事件处理机制的掌握,培养JavaScript编程技 能和逻辑思维能力,提高网页的动态交互体验。 5.3 实践范例 在现代高等教育体系中,毕业生的就业状况是衡量教育质量与市场需求匹配度的重 要指标之一。为了高效地收集、管理和分析毕业生的就业数据,提高就业指导工作的针对 ·52· 性和有效性,本次实践旨在开发一个简单的毕业生就业信息管理模块,具体功能如下 所示。 (1)录入功能:允许管理员或毕业生便捷地录入个人基本信息及就业信息。 (2)数据显示:实时展示录入的就业信息,包括姓名、年龄、性别、薪资、就业城市等, 以表格形式呈现。 (3)数据验证:在信息录入过程中,实施基本的数据验证,确保提交的信息完整且格 式正确。 (4)删除功能:提供选项以便于管理已录入的就业信息,允许删除不再需要的记录。 5.3.1 界面设计与布局 本次实践通过HTML与CSS设计并实现一个既实用又美观的界面,用于毕业生就 业信息的录入与展示。界面将包含两个核心部分:一个是表单,用于收集基本信息,另一 个是表格,用于展示已录入的就业数据。 表单部分涵盖了姓名、年龄、性别、薪资以及就业城市的输入项,性别与就业城市通过 下拉选择框提供选项,最后配备一个提交按钮以完成数据录入。紧接着是一个表格,用于 展示录入的就业信息,包含学号、姓名、年龄、性别、薪资、就业城市及操作列,其中操作列 预留空间以供未来实现数据管理功能,HTML代码如下所示。 <!DOCTYPE html> <htmllang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <link rel="stylesheet" href="./style.css"> </head> <body> <h1>毕业生就业情况统计</h1> <form class="info"> 姓名: <input type="text" class="uname" name="uname" /> 年龄: <input type="text" class="age" name="age" /> 性别: <select name="gender" class="gender"> <option value="男">男</option> <option value="女">女</option> </select> 薪资: <input type="text" class="salary" name="salary" /> 就业城市: <select name="city" class="city"> <option value="北京">北京</option> <option value="上海">上海</option> <option value="深圳">深圳</option> <option value="广州">广州</option> </select> <button class="add">录入</button> ·53· </form> <h1>就业信息</h1> <table> <thead> <th>学号</th> <th>姓名</th> <th>年龄</th> <th>性别</th> <th>薪资</th> <th>就业城市</th> <th>操作</th> </thead> <tbody> </tbody> </table> </body> </html> 根据以上HTML页面代码,为提升用户体验,通过外部CSS文件styles.css对界面 进行美化,确保布局合理、视觉舒适。CSS代码如下所示。 /*设置整体布局*/ body { font-family: Arial, sans-serif; } /*标题样式*/ h1 { text-align: center; margin-bottom: 20px; } /*表单样式*/ .info form { display: flex; flex-direction: column; align-items: center; } .info input[type="text"], .info select { width: 150px; padding: 5px; margin-bottom: 20px; } .info button.add { background-color: #4CAF50; color: white; ·54· padding: 10px 20px; border: none; cursor: pointer; } /*按钮样式*/ .info button:hover { background-color: #45a049; } /*表格样式*/ table { width: 100%; border-collapse: collapse; } th, td { border: 1px solid #ddd; padding: 4px; text-align: left; } th { background-color: #f2f2f2; font-weight: bold; } tr:nth-child(even) { background-color: #f2f2f2; } tr:hover { background-color: #ddd; } /*删除按钮样式*/ td a { display: inline-block; padding: 2px 5px; background-color: red; color: white; border-radius: 5px; text-decoration: none; }t d a:hover { background-color: darkred; } 在当前目录下新建一个styles.css文件,将以上CSS 代码复制到该文件中,并在 HTML文件中引用该CSS文件。在HTML文件的<head>部分添加以下代码。 <link rel="stylesheet" href="styles.css"> ·55· 通过上述HTML结构与CSS样式的结合,构建了一个清晰、易用的界面,既便于用 户录入就业信息,又能直观展示数据。最终,呈现在浏览器中的整体界面效果图将如 图5-2所示。 图5-2 整体界面效果图 5.3.2 表单提交事件 本节将介绍通过JavaScript增强网页的交互性,专注于处理毕业生就业信息表单的 提交事件,为后续的表单验证、数据处理与展示打下基础,具体步骤如下所示。 创建一个名为script.js的文件,用于存放JavaScript逻辑代码。这个文件将与 HTML文件协同工作,实现对表单提交行为的控制。以下是在script.js文件中应添加的 代码。 //1.获取HTML 的元素 const uname=document.querySelector('.uname') const age=document.querySelector('.age') const gender=document.querySelector('.gender') const salary=document.querySelector('.salary') const city=document.querySelector('.city') const tbody=document.querySelector('tbody') //获取所有带name 属性的元素 const items=document.querySelectorAll('[name]') //声明一个空数组, 保存毕业生就业信息数据 const arr=[]; //获取form 表单 const info=document.querySelector('.info') //编写监听表单提交事件, 阻止自动提交 info.addEventListener('submit', function (e){ //阻止默认行为, 不跳转 e.preventDefault() }) 上述代码通过querySelector选取了表单元素,并声明了一个数组arr用于存储就业 信息。接着,通过addEventListener为表单绑定了submit事件监听器,当表单提交时,会 触发一个事件处理器。在该处理器中,event.preventDefault()阻止了表单的默认提交动 作,避免页面刷新。 在当前目录下新建一个script.js文件,将以上的JavaScript代码复制到该文件中,并 在HTML文件中正确引用该JS文件。在HTML文件的<head>或<body>标签结束前 ·56· 添加如下代码。 <!-- 引入script.js 文件--> <script src="script.js"></script> 本次实践范例中提供的HTML模板中包含了引入外部JavaScript文件的基本结构。 代码<scriptsrc="script.js"></script>就是用来引用script.js文件的,而这句代码的前 提是script.js文件与HTML文件位于同一目录下。如果script.js位于其他目录,请确保 使用正确的相对路径或绝对路径来指定文件的位置。例如,如果script.js位于一个名为 js的子目录中,路径应改为<scriptsrc="js/script.js"></script>。 5.3.3 实现表单录入验证 通过JavaScript增强表单的交互性,实现用户输入数据的基本验证,以确保所有必填 项均已被恰当填写。在已有的script.js文件中,为表单提交事件绑定了一个监听器,旨在 阻止默认的页面刷新行为,并在此基础上添加了数据验证逻辑。在表单监听事件中的新 增代码如下所示。 //编写监听表单提交事件,阻止自动提交 info.addEventListener('submit', function (e){ //阻止默认行为,不跳转 e.preventDefault() //进行表单验证,如果不通过直接中断,不需要添加数据 for(let i=0;i<items.length;i++){ if (items[i].value===''){ return alert('输入内容不能为空') } } //如果通过验证, 此处可添加处理逻辑, 如将数据添加到数组或发送至服务器 }) 录入验证包括以下两部分。 (1)遍历验证:通过for循环,对表单中的每个元素进行逐一检查,确保没有遗漏, items数组中包含了表单中所有需要验证的输入项。 (2)空值检测:使用if(items[i].value=== '')判断用户是否留下了空值,以此作 为必填项的标准。一旦发现空项,立即通过alert弹窗提醒用户“请输入完整信息后再提 交”,并使用return语句中断函数执行,有效阻止了未完整填写表单的提交。 通过上述功能的实现,不仅提升了用户体验,确保了数据的完整性,也为后续的数据 处理流程打下了坚实的基础。在浏览器中预览此页面,用户将直观地看到一个响应式的 表单验证机制,如图5-3所示,任何未完整填写的表单都将被即时拦截并给用户清晰的 反馈。 5.3.4 实现信息录入功能 在用户成功提交表单并通过验证之后,根据用户录入的相关数据,新增一个用户对 ·57· 图5-3 表单输入验证效果图 象,并将该用户追加到arr数组中。在已有的表单提交事件处理逻辑之后,追加如下 代码。 //创建新对象 const obj={ stuId:arr.length+1, uname:uname.value, age:age.value, gender:gender.value, salary:salary.value, city:city.value } //在数组中追加数据 arr.push(obj) //清空表单 this.reset() 上述代码相关功能如下所示。 (1)数据存储:obj用于存储用户提交的就业信息。每个属性对应表单中的一个用 户输入的姓名、年龄、性别、薪资和就业城市。 (2)数据持久化:通过arr.push(obj)将封装好的用户对象添加到全局数组arr中,实 现了信息的持久存储,使得每次收到表单后,能记住并累积所有用户输入的历史记录。 (3)表单重置:this.reset()调用表单的重置方法,清除了所有输入字段,为下一轮数 据录入做好准备,提高了用户体验,使得用户无须手动清理输入框,即可开始新的数据录 入过程。 通过以上步骤,不仅实现了用户信息的即时捕获与存储,还确保了界面的即时反馈, 使得用户在连续录入信息时更加流畅与便捷。 5.3.5 实现数据显示功能 本节的主要目的是实现数据的直观展示,确保用户录入的信息能够即时反映在网页 界面上。核心在于设计一个高效的渲染机制,以数据数组arr为蓝本,更新表格视图,代 码如下所示。 ·58· //渲染函数 function render(){ //先清空tbody, 把最新数组里面的数据渲染完毕 tbody.innerHTML='' for(let i=0;i<arr.length;i++){ //创建一个新的表格行<tr>元素 const tr=document.createElement('tr') tr.innerHTML=` <td>${arr[i].stuId}</td> <td>${arr[i].uname}</td> <td>${arr[i].age}</td> <td>${arr[i].gender}</td> <td>${arr[i].salary}</td> <td>${arr[i].city}</td> <td> <a href="javascript:" data-id=${i}>删除</a> </td> ` tbody.appendChild(tr) } 通过上述render函数,系统能够根据arr数组的实时状态重构表格内容,确保界面展 示与底层数据保持同步。此过程先清空旧的表格行,避免数据重复;随后逐条迭代数组, 为每条记录生成一行表格,其中包含详细的用户信息及一个便捷的“删除”链接;最后,利 用data-id属性标记,以便进行精确的交互控制。 为了保证新录入的信息即刻反映于界面,需要在表单提交逻辑的末尾调用render函 数。这一步骤确保了每当有新数据加入数组arr,页面上的表格便会刷新,展现出最新数 据集,因此新增如下代码。 //在数组中追加数据 arr.push(obj) //清空表单 this.reset() //重新渲染 render() 完成上述配置后,实现了一个响应式的表格界面,不仅实时反映了所有用户录入的信 息,还为每条记录配备了删除选项,如图5-4所示。 5.3.6 实现删除功能 删除功能实现了用户界面与数据模型的交互,允许用户通过单击表格中的删除链接 来移除特定的数据行,并自动更新界面视图,保持界面展示与后台数据的一致性,代码如 下所示。 ·59· 图5-4 表格数据展示效果图 //删除操作 tbody.addEventListener('click', function (e){ if(e.target.tagName==='A'){ //得到当前元素的自定义属性data-id arr.splice(e.target.dataset.id, 1) render() } }) }< /script> 上述代码采用事件委托技术,在tbody上设置一个事件监听器,而非为每个删除按钮 单独设置。这样可以减少事件监听器的数量,提高效率,尤其适用于动态生成的元素。 此外,还要判断触发事件的目标元素(e.target)是否为<a> 标签,因为只有当用户单 击删除链接时,才需要执行删除操作。 如果用户单击了删除链接,这行代码会从被单击的链接(a标签)获取其自定义属性 data-id的值,该属性存储了数组中对应元素的索引。然后,使用Array.prototype.splice() 方法根据这个索引从arr数组中移除对应的数据项。上述代码中,splice(index,1)的意思 是从index位置开始删除1个元素。 删除数组中的元素后,立即调用render函数重新渲染表格,确保界面上的数据与当 前arr数组中的内容保持一致,即删除操作的结果能够即时反映在表格上。在浏览器中 打开该页面,删除操作效果图如图5-5所示。 图5-5 删除操作效果图 ·60·