JavaScript编程基础(六)表单事件、模块的使用与实战之留言板、经典选项卡 原创 阁主 2023-08-11 10:09:01 阅读 1968 次 评论 0 条 摘要:继续上次的JavaScript编程基础(五)继续学习,简单记录学习PHP中文网23期JavaScript基础知识,内容包括:表单事件、模块的使用、实战留言板、实战经典选项卡 ## 表单事件 - 常用事件 1. submit: 提交 2. focus: 焦点 3. blur: 失去焦点 4. change: 值改变,且失去焦点时 5. input: 值一旦改变就触发, 不等失去焦点 - 禁用表单默认提交行为的 3 种方法 1. `form.onsubmit = 'return false'` 2. `form.button.type = 'button'` 3. `event.preventDefault()` form.html: ```html 表单事件 请登录 登录 php.cn ``` style.css: ```css #login { width: 20em; margin: 30px auto; } #login fieldset { padding: 1em 2em; border: none; border-radius: 0.5em; box-shadow: 0 0 3px #666; background: linear-gradient(to left top, lightcyan, white); } #login fieldset:hover { box-shadow: 0 0 8px #666; transition: 0.3s; cursor: pointer; } #login fieldset .title { text-align: center; padding: 0 0.6em; font-size: 1.3em; background-color: #fff; } #login fieldset div { display: grid; gap: 1em; } #login input { height: 2em; border: none; background: transparent; border-bottom: 1px solid #aaa; outline: none; outline: none; } #login button { height: 3em; border: none; cursor: pointer; background-color: seagreen; border-radius: 0.5em; color: white; } #login button:hover { opacity: 0.8; transition: 0.3s; } ``` ## 实战留言板 ![](https://www.mainblog.cn/zb_users/upload/2023/08/202308101522292157785.png) ```JavaScript 留言板(toDoList) ``` ## 模块的使用 - 模块成员导出 ```JavaScript /** * 模块的知识 * 1. 一个js文件,就是一个模块 * 2. 一个js文件是不是模块,由调用环境决定 * 3. 全局,函数,块,现在又多了一个作用域: 模块作用域 * 4. 模块内的成员,默认全是私有的(局部的),外部不可见(类似函数内的成员) * 5. export : 模块成员导出 * 6. import: 模块成员的导入 */ // 模块成员 let uname = '安欣' let greet = function (uname) { return 'Hello, ' + uname } ``` ```JavaScript // 1. 逐个导出 export let uname = '安欣' export let greet = function (uname) { return 'Hello, ' + uname } ``` ```JavaScript // 2. 批量导出 // 声明部分 let username = '高启强' let greeting = function (uname) { return 'Hello, ' + uname } // 导出部分 export { uname, greet } ``` ```JavaScript // 2. 批量别名导出 // 声明部分 // let username = '高启强' // let greeting = function (uname) { // return 'Hello, ' + uname // } let uname = '高启强' let greet = function (uname) { return 'Hello, ' + uname } // 导出部分 // export { uname, greet } // as 别名导出 export { username as uname, greeting as greet } ``` ```JavaScript // 3. 打包导出 // 适用于一个对象或数组的导出 export class User { constructor(uname) { this.uname = uname } greet() { return '欢迎您, ' + this.uname } } ``` ```JavaScript // 4. 默认导出(匿名导出) export default class { constructor(uname) { this.uname = uname } greet() { return '欢迎您, ' + this.uname } } ``` - 模块使用 ```html 模块的使用 ``` ## 实战经典选项卡 ![](https://www.mainblog.cn/zb_users/upload/2023/08/202308111008088148422.png) index.html: ```html 模块实战: 选项卡 ``` tabs.js: ```JavaScript // 选项卡模块 // 1. 栏目 const cates = [ { cid: 1, cname: "中国新闻" }, { cid: 2, cname: "国际新闻" }, { cid: 3, cname: "安徽新闻" }, ]; // 2. 内容 // 内容的key 必须与 栏目的id绑定 const details = [ { key: 1, cid: 1, content: [ { title: "蔡英文窜美,美官员警告中国不要过度反应,外交部回应", url: "https://news.ifeng.com/c/8OYFjT9c3KM", }, { title: "马英九:从来没有一次像今天受到这么大的冲击", url: "https://news.ifeng.com/c/8OYI5PZyyRs", }, { title: "美媒:王毅与沙利文进行电话交谈", url: "https://news.ifeng.com/c/8OXw5JWvnRM", }, ], }, { key: 2, cid: 2, content: [ { title: "美核航母抵韩,半岛局势会失控吗?", url: "https://news.ifeng.com/c/8OYApVnV1mN", }, { title: "西班牙法律允许强占住房:有华人3年没回西班牙,房子被吉普赛人占了", url: "https://news.ifeng.com/c/8OXfZLPso8P", }, { title: "拜登首次就普京拟在白俄部署核武器表态", url: "https://news.ifeng.com/c/8OXdmTTNQD6", }, ], }, { key: 3, cid: 3, content: [ { title: "省级党政代表团密集赴皖考察!安徽究竟有何看点?", url: "https://ah.ifeng.com/c/8OXtD8eq0pA", }, { title: "合肥、蚌埠、亳州、安庆、宣城最新人事任免!", url: "https://ah.ifeng.com/c/8OXnxW9z3K5", }, { title: "下月起合肥坐高铁到香港!最快只需7时26分", url: "https://ah.ifeng.com/c/8OXheuq5n55", }, ], }, ]; // 3. 创建栏目和内容 function createTab(type, content) { // 1. 生成栏目 for (let i = 0; i < cates.length; i++) { const btn = document.createElement("button"); btn.textContent = cates[i].cname; // 第一个按钮应该是高亮显示 // 为每个按钮添加一个自定义属性: data-index // data-key = cates[i].cid btn.dataset.key = cates[i].cid; if (i === 0) { btn.classList.add("active"); } type.append(btn); } // 2. 生成内容 for (let i = 0; i < details.length; i++) { // 创建 const ul = document.createElement("ul"); // 为每个添加自定义属性data-key ul.dataset.key = details[i].cid; // 全部内容加载时,默认全隐藏,只要显示第一组新闻列表即可 ul.classList.add(i === 0 ? "active" : "hidden"); // 循环: 将与列表对应的数据全部渲染出来 for (let j = 0; j < details[i].content.length; j++) { // xxxxx const li = document.createElement("li"); const a = document.createElement("a"); a.textContent = details[i].content[j].title; a.href = details[i].content[j].url; li.append(a); ul.append(li); content.append(ul); } } } // 4. 自动设置栏目高亮 function setBtnStatus(ev) { // 1. 去掉所有按钮的激活样式 // console.log(...ev.currentTarget.children); [...ev.currentTarget.children].forEach((btn) => btn.classList.remove("active") ); // 2. 将当前用户正在点击的按钮添加active ev.target.classList.add("active"); } // 5. 设置与栏目对应的内容的激活状态 /** * 参数 * 1. 事件对象,event * 2. 当前正在被点击的按钮(选项) */ function setContentStatus(ev, currentBtn) { // 所有的新闻列表 const lists = document.querySelectorAll(".content > ul"); console.log(lists); // 1. 将激活的列表全部隐藏 active -> hidden lists.forEach((list) => list.classList.replace("active", "hidden")); // 2. 找到与栏目ID相同(对应的)新闻列表 const currList = [...lists].find( (list) => list.dataset.key === currentBtn.dataset.key ); console.log(currList); // 3. 设置当前列表为激活active currList.classList.replace("hidden", "active"); } export { cates, details, createTab, setBtnStatus, setContentStatus }; ``` 本文地址:https://www.mainblog.cn/331.html 版权声明:本文为原创文章,版权归 阁主 所有,欢迎分享本文,转载请保留出处! 免责申明:有些内容源于网络,没能联系到作者。如侵犯到你的权益请告知,我们会尽快删除相关内容。 PREVIOUS:JavaScript编程基础(五)细说事件与实战之经典计算器 NEXT:JavaScript编程基础(七)经典实战之轮播图构造与功能模块的编写 文章导航