Powered by:NEFU AB-IN
文章目录
WebExperiment-04
-
需求
需求+1
模拟二级菜单无法全部展开的,多二级菜单的侧边栏。 通过jquery实现点击一级标题展开其下的二级菜单,同时收缩其他已展开的二级菜单。即,同一时间只有一个二级菜单展开。
需求+1
必须同意协议,方可填写注册表单
用户名必须大于等于6位,否则弹出警告框
未来意向,支持取消选中的单选框
喜欢的课程,能且仅能选择2项
当用户名大于等于6字符,喜欢的课程小于等于2项时,不可提交表单
需求+1
输入地址后,点击添加地址按钮,将输入信息动态添加至列表
需求+1
意向,再次点击radio时取消radio的选中状态。 -
experiment4 需求1解读
<!-- * @Author: NEFU AB-IN * @Date: 2021-10-21 10:45:33 * @FilePath: \web-experiments\experiment-04\src\main\webapp\sidebar1.html * @LastEditTime: 2021-10-21 11:41:29 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Title</title> <style> * { padding: 0; margin: 0; box-sizing: border-box; } /* 左侧边栏容器宽度 */ aside { width: 300px; background: #f1f1f1; } /* 导航标题 */ .sidebar > h2 { padding: 15px 20px; background: #3185bf; color: white; } /* 添加标题悬浮样式 */ .sidebar > h2:hover { cursor: pointer; background: #000; } /* 初始化时,将二级菜单隐藏,滑动时jquery自动修改display属性 */ .sidebar ul { display: none; } /* 二级菜单样式 */ .sidebar li a { display: block; color: black; text-decoration: none; padding: 10px 20px; } /* 二级菜单悬浮样式 */ .sidebar li a:hover { font-weight: bold; background-color: #555; color: white; } </style> </head> <body> <aside> <div class="sidebar"> <h2>云技术管理</h2> <ul> <li><a href="#">云服务器</a></li> <li><a href="#">云数据库</a></li> <li><a href="#">负载均衡</a></li> </ul> </div> <div class="sidebar"> <h2>安全管理</h2> <ul> <li><a href="#">云盾控制台</a></li> <li><a href="#">DDoS高防IP</a></li> <li><a href="#">Web应用防火墙</a></li> <li><a href="#">CA证书服务</a></li> </ul> </div> </aside> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> $(".sidebar h2").click(function () { let ul = $(this).next("ul"); ul.slideToggle("slow"); $(".sidebar ul").not(ul).slideUp();/*让除了现在处理的一个ul,其他的全部上滑*/ }); </script> </body> </html>
-
可在事件回调函数中直接使用jquery对象,当需要使用 t h i s this this对象时,不能使用箭头函数,要使用 f u n c t i o n ( ) function() function()
比如此处就是找这个函数对象的下一个 u l ul ul,相当于精确到个体了,如果把 t h i s this this换成 . s i d e b a r h 2 .sidebar \ h2 .sidebar h2,会导致选中所有的 h 2 h2 h2,而 t h i s this this是就那一个 h 2 h2 h2
-
常用的函数
-
-
experiment4 需求2解读
实现要求
- 必须同意协议,方可填写注册表单
- 用户名必须大于等于6位,否则弹出警告框
- 未来意向,支持取消选中的单选框,即再次点击radio时取消radio的选中状态
- 喜欢的课程,能且仅能选择2项
- 输入地址后,点击添加地址按钮,将输入信息动态渐变添加至列表
- 当用户名大于等于6字符,喜欢的课程小于等于2项时,不可提交表单
源码
<!-- * @Author: NEFU AB-IN * @Date: 2021-10-21 16:06:20 * @FilePath: \web-experiments\experiment-04\src\main\webapp\register1.html * @LastEditTime: 2021-10-21 21:07:50 --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Title</title> </head> <body> <h1>注册</h1> <label> <input type="checkbox" id="legal" />我已阅读相关说明并遵守相关法律</label > <form id="register"> <div> 用户名: <input type="text" name="username" /> <br /> 未来意向: <label ><input type="radio" name="purp" value="1" />Java工程师</label > <label ><input type="radio" name="purp" value="2" />测试工程师</label > <label ><input type="radio" name="purp" value="3" />前端工程师</label > <!-- 添加隐藏域 --> <input type="hidden" name="purpose" /> <br /> <br /> 请从以下课程中选择2项最喜欢的课程 <ul> <li> <label> <input type="checkbox" name="courses" />Web开发技术 </label> </li> <li> <label> <input type="checkbox" name="courses" />软件项目管理 </label> </li> <li> <label> <input type="checkbox" name="courses" />数据库原理 </label> </li> <li> <label> <input type="checkbox" name="courses" />系统分析与设计 </label> </li> </ul> 地址: <ul id="ul_address"></ul> <input name="address" /> <button type="button" id="button_address">添加地址</button> <br /> </div> <button type="submit">提交</button> </form> </body> <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.min.js"></script> <script> let regiserInput = $("#register :input").prop("disabled", true); let usernameFlag = false; let coursesFlag = false; $("#legal").click(function () { let flag = !$(this).prop("checked"); regiserInput.not($("button:submit")).prop("disabled", flag); }); const len = 6; $("input[name = username]").change(function () { let flag = $(this).val().trim().length; if (flag < 6) { alert("用户名长度必须大于等于6"); usernameFlag = false; } else { usernameFlag = true; } }); const purpBox = $("input[name = purp]"); purpBox.click(function () { let purpFlag = $(this).data("status"); if (purpFlag) { $(this).data("status", false); $(this).prop("checked", false); } else { $(this).data( "status", true ); /* 可能点亮2时,1也在亮,但是又不能同时两个亮 就会起冲突,导致按2不亮,反而1亮的灭了 */ purpBox.not(this).data("status", false); } }); const cnt = 2; const coursesBox = $("input[name = courses]"); coursesBox.click(function () { coursesFlag = coursesBox.filter(":checked").length >= cnt; coursesBox.not(":checked").prop("disabled", coursesFlag); }); $("input[name=username], input[name=courses]").change(function () { let flag = usernameFlag && coursesFlag; $("button:submit").prop("disabled", !flag); }); $("#button_address").click(function () { const addressBox = $("input[name = address]"); let flag = addressBox.val().length > 0; //console.log(flag); if (flag) { let content = addressBox.val(); let newLi = $(`<li>${content}</li>`); addressBox.val(""); newLi.css("display", "none"); $("#ul_address").append(newLi); newLi.fadeIn(); } }); </script> </html>
-
必须同意协议,方可填写注册表单
let regiserInput = $("#register :input").prop("disabled", true); $("#legal").click(function () { let flag = !$(this).prop("checked"); regiserInput.not($("button:submit")).prop("disabled", flag); });
思路就是先将所有 t y p e type type是 i n p u t input input的对象,用 p r o p prop prop将其变成不可编辑的状态
然后当点击按钮时,用 p r o p prop prop获取按钮是否处于 c h e c k e d checked checked状态,然后将除了 s u b m i t submit submit的按钮与 c h e c k e d checked checked状态相反
-
let regiserInput = $("#register :input").prop("disabled", true);
链式结构,最后得到的取决于可获得值的最后一部分
比如此处, p r o p prop prop两个参数,是设置,所以往前找,前面是获得 i n p u t input input,所以返回值就是所有 t y p e type type是 i n p u t input input的对象
-
p r o p prop prop,一个参数是得返回值,两个参数是设置
-
-
用户名必须大于等于6位,否则弹出警告框
let usernameFlag = false; const len = 6; $("input[name = username]").change(function () { let flag = $(this).val().trim().length; if (flag < 6) { alert("用户名长度必须大于等于6"); usernameFlag = false; } else { usernameFlag = true; } });
- 当监听的某个状态改变,执行某项操作的函数,用change()
- val(),获取文本框的输入值
- trim(),去除空格
-
未来意向,支持取消选中的单选框,即再次点击radio时取消radio的选中状态
const purpBox = $("input[name = purp]"); purpBox.click(function () { let purpFlag = $(this).data("status"); if (purpFlag) { $(this).data("status", false); $(this).prop("checked", false); } else { $(this).data( "status", true ); /* 可能点亮2时,1也在亮,但是又不能同时两个亮 就会起冲突,导致按2不亮,反而1亮的灭了 */ purpBox.not(this).data("status", false); } });
无法基于radio checked状态判断,因为每次点击radio时该radio均为checked状态
所以考虑为按钮再添加一个状态,表示是否 c h e c k e d checked checked
-
data()
- 一个属性表示添加状态并返回空 或者 获取状态
- 两个属性表示设置这个属性的值
- 注意! 新增的属性不能用 p r o p prop prop,只能用 d a t a data data
- 注意当点亮一个灯时,要让其他的灯熄灭
- 另外,可以将输入框对象用 c o n s t const const定义,这样可以避免重复查询
-
data()
-
喜欢的课程,能且仅能选择2项
let coursesFlag = false; const cnt = 2; const coursesBox = $("input[name = courses]"); coursesBox.click(function () { coursesFlag = coursesBox.filter(":checked").length >= cnt; coursesBox.not(":checked").prop("disabled", coursesFlag); });
那么就是选择两项之后,将别的按钮禁止访问即可
注意这里也有链式结构,后面是判断,所以是布尔类型的
-
输入地址后,点击添加地址按钮,将输入信息动态渐变添加至列表
$("#button_address").click(function () { const addressBox = $("input[name = address]"); let flag = addressBox.val().length > 0; //console.log(flag); if (flag) { let content = addressBox.val(); let newLi = $(`<li>${content}</li>`); addressBox.val(""); newLi.css("display", "none"); $("#ul_address").append(newLi); newLi.fadeIn(); } });
- 先判断是否有内容可以添加
- 再获取文本框里的值
- 定义新的 l i s t i t e m list \ item list item,利用反引号,将属性值添加在字符串中
- 将文本框清空
addressBox.val("");
- 将新的 l i s t i t e m list \ item list item隐藏,注意此处的 n o n e none none需要用引号,因为不是基本类型
- 再进行添加操作,并让 l i s t i t e m list \ item list item淡入
-
当用户名大于等于6字符,喜欢的课程小于等于2项时,不可提交表单
$("input[name=username], input[name=courses]").change(function () { let flag = usernameFlag && coursesFlag; $("button:submit").prop("disabled", !flag); });
同时监听2个状态的改变,当两个都改变的时候,才进行
但无需重写以上校验代码,仅需判断之前校验产生的状态标识即可