书城项目第一阶段

た 入场券 2023-09-25 19:53 182阅读 0赞

一、事件驱动补充

1、取消控件的默认行为

控件默认行为

  • 点超链接会跳转页面
  • 点表单提交按钮会提交表单

本来控件的默认行为是天经地义就该如此的,但是如果我们希望点击之后根据我们判断的结果再看是否要跳转,此时默认行为无脑跳转的做法就不符合我们的预期了。

取消方式

调用事件对象的**preventDefault()**方法。

超链接举例

HTML代码:

  1. <a id="anchor" href="http://www.baidu.com">超链接</a>
  2. 复制代码

JavaScript代码:

  1. document.getElementById("anchor").onclick = function() {
  2. console.log("我点击了一个超链接");
  3. event.preventDefault();
  4. }
  5. 复制代码

表单提交按钮举例

HTML代码:

  1. <form action="http://www.baidu.com" method="post">
  2. <button id="submitBtn" type="submit">提交表单</button>
  3. </form>
  4. 复制代码

JavaScript代码:

  1. document.getElementById("submitBtn").onclick = function() {
  2. console.log("我点击了一个表单提交按钮");
  3. event.preventDefault();
  4. }
  5. 复制代码

2、阻止事件冒泡

format_png

图中的两个div,他们的HTML标签是:

  1. <div id="outterDiv">
  2. <div id="innerDiv"></div>
  3. </div>
  4. 复制代码

点击里面的div同时也等于点击了外层的div,此时如果两个div上都绑定了单击响应函数那么就都会被触发:

  1. document.getElementById("outterDiv").onclick = function() {
  2. console.log("外层div的事件触发了");
  3. }
  4. document.getElementById("innerDiv").onclick = function() {
  5. console.log("内层div的事件触发了");
  6. }
  7. 复制代码

所以事件冒泡就是一个事件会不断向父元素传递,直到window对象。

如果这不是我们想要的效果那么可以使用事件对象的**stopPropagation()**函数阻止。

  1. document.getElementById("innerDiv").onclick = function() {
  2. console.log("内层div的事件触发了");
  3. event.stopPropagation();
  4. }
  5. 复制代码

3、Vue事件修饰符

对于事件修饰符,Vue官网的描述是:

在事件处理程序中调用 event.preventDefault()event.stopPropagation() 是非常常见的需求。尽管我们可以在方法中轻松实现这点,但更好的方式是:方法只有纯粹的数据逻辑,而不是去处理 DOM 事件细节

取消控件的默认行为

控件的默认行为指的是:

  • 点击超链接跳转页面
  • 点击表单提交按钮提交表单

实现这个需求使用的Vue事件修饰符是:.prevent

  1. <a href="http://www.baidu.com" @click.prevent="clickAnchor">超链接</a>
  2. <form action="http://www.baidu.com" method="post">
  3. <button type="submit" @click.prevent="clickSubmitBtn">提交表单</button>
  4. </form>
  5. 复制代码

取消事件冒泡

实现这个需求使用的Vue事件修饰符是:.stop

  1. <div id="outterDiv" @click="clickOutterDiv">
  2. <div id="innerDiv" @click.stop="clickInnerDiv"></div>
  3. </div>
  4. 复制代码

二、正则表达式

1、从凤姐的择偶标准说起

format_png 1

本人对伴侣要求如下:

  • 第一、必须为北京大学或清华大学硕士毕业生。必须本科硕士连读,中途无跳级,不留级,不转校。在外参加工作后再回校读书者免。
  • 第二、必须为经济学专业毕业。非经济学专业毕业则必须精通经济学。或对经济学有浓厚的兴趣。
  • 第三、必须具备国际视野,但是无长期定居国外甚至移民的打算。
  • 第四、身高176—183左右。长得越帅越好。
  • 第五、无生育史。过往所有女友均无因自身而致的堕胎史。
  • 第六、东部户籍,即江、浙、沪三地户籍或黑龙江、广东、天津、山东、北京、吉林、辽宁等。
  • 东北三省和内蒙古等地户籍,西南地区即重庆、贵州、云南、西藏和湖南、湖北等地籍贯者不予考虑。
  • 第七、年龄25—28岁左右。即06届,07届,08届,09届毕业生。有一至两年的工作经验,06级毕业生需年龄在28岁左右,09级毕业生则需聪明过人。且具备丰富的社会实践经验。就职于国家机关,国有企事业单位者不愿考虑。但就职于中石油,中石化等世界顶尖型企业或银行者又比较喜欢。现自主创业者要商榷一番了。

2、标准在手,世界我有

模式验证

使用标准衡量一位具体的男士,返回一个布尔值,从而知道这位男士是否满足自己的标准——相当于我们使用正则表达式验证一个字符串是否满足规则。比如验证一个字符串是否是一个身份证号。

匹配读取

对全中国的男士应用这个标准,返回一个数组,遍历这个数组,可以得到所有符合标准的男士——相当于我们使用正则表达式获取一段文本中匹配的子字符串。比如将一篇文章中的电子邮件地址读取出来。

匹配替换

对全中国的男士应用这个标准,把其中已婚的变成未婚,这样凤姐就有机会了——相当于我们使用正则表达式替换所有匹配的部分。比如将一段文字中的”HelloWorld”替换为”HelloJava”。

花絮:

记者:封老师您好!由于您的名字『封捷』和『凤姐』谐音,同学们总是以此来调侃您,说您是尚硅谷『凤姐』,对此您有什么想说的吗?

封老师:太过分了!我咋能和人家比!

记者:呃……太意外了,您的意思是?

封老师:虽然过气了,但人家好歹也是网红呀!

3、正则表达式的概念

使用一段字符串定义的一个规则,用以检测某个字符串是否满足这个规则,或将目标字符串中满足规则的部分读取出来,又或者将目标字符串中满足标准的部分替换为其他字符串。所以正则表达式有三个主要用途:

  • 模式验证
  • 匹配读取
  • 匹配替换

format_png 2

4、正则表达式零起步

创建正则表达式对象

使用两个斜杠

  1. // 类似创建数组时可以使用[]、创建对象可以使用{}
  2. var reg = /a/;
  3. 复制代码

使用new关键字创建RegExp类型的对象

  1. // 类似创建数组可以new Array()、创建对象可以使用new Object()
  2. var reg = new RegExp("a");
  3. 复制代码

正则表达式的组成

正则表达式本身也是一个字符串,它由两种字符组成:

  • 普通字符,例如大、小写英文字母;数字等。
  • 元字符:被系统赋予特殊含义的字符。例如:^表示以某个字符串开始,$表示以某个字符串结束。

正则表达式初体验

模式验证

注意:这里是使用正则表达式对象调用方法。

  1. // 创建一个最简单的正则表达式对象
  2. var reg = /o/;
  3. // 创建一个字符串对象作为目标字符串
  4. var str = 'Hello World!';
  5. // 调用正则表达式对象的test()方法验证目标字符串是否满足我们指定的这个模式,返回结果true
  6. console.log("/o/.test('Hello World!')="+reg.test(str));
  7. 复制代码

匹配读取

注意:这里是使用字符串对象调用方法。

  1. // 在目标字符串中查找匹配的字符,返回匹配结果组成的数组
  2. var resultArr = str.match(reg);
  3. // 数组长度为1
  4. console.log("resultArr.length="+resultArr.length);
  5. // 数组内容是o
  6. console.log("resultArr[0]="+resultArr[0]);
  7. 复制代码

替换

注意:这里是使用字符串对象调用方法。

  1. var newStr = str.replace(reg,'@');
  2. // 只有第一个o被替换了,说明我们这个正则表达式只能匹配第一个满足的字符串
  3. console.log("str.replace(reg)="+newStr);//Hell@ World!
  4. // 原字符串并没有变化,只是返回了一个新字符串
  5. console.log("str="+str);//str=Hello World!
  6. 复制代码

匹配方式

全文查找

如果不使用g对正则表达式对象进行修饰,则使用正则表达式进行查找时,仅返回第一个匹配;使用g后,返回所有匹配。

  1. // 目标字符串
  2. var targetStr = 'Hello World!';
  3. // 没有使用全局匹配的正则表达式
  4. var reg = /[A-Z]/;
  5. // 获取全部匹配
  6. var resultArr = targetStr.match(reg);
  7. // 数组长度为1
  8. console.log("resultArr.length="+resultArr.length);
  9. // 遍历数组,发现只能得到'H'
  10. for(var i = 0; i < resultArr.length; i++){
  11. console.log("resultArr["+i+"]="+resultArr[i]);
  12. }
  13. 复制代码

对比代码:

  1. // 目标字符串
  2. var targetStr = 'Hello World!';
  3. // 使用了全局匹配的正则表达式
  4. var reg = /[A-Z]/g;
  5. // 获取全部匹配
  6. var resultArr = targetStr.match(reg);
  7. // 数组长度为2
  8. console.log("resultArr.length="+resultArr.length);
  9. // 遍历数组,发现可以获取到“H”和“W”
  10. for(var i = 0; i < resultArr.length; i++){
  11. console.log("resultArr["+i+"]="+resultArr[i]);
  12. }
  13. 复制代码

忽略大小写

  1. //目标字符串
  2. var targetStr = 'Hello WORLD!';
  3. //没有使用忽略大小写的正则表达式
  4. var reg = /o/g;
  5. //获取全部匹配
  6. var resultArr = targetStr.match(reg);
  7. //数组长度为1
  8. console.log("resultArr.length="+resultArr.length);
  9. //遍历数组,仅得到'o'
  10. for(var i = 0; i < resultArr.length; i++){
  11. console.log("resultArr["+i+"]="+resultArr[i]);
  12. }
  13. 复制代码

对比代码:

  1. //目标字符串
  2. var targetStr = 'Hello WORLD!';
  3. //使用了忽略大小写的正则表达式
  4. var reg = /o/gi;
  5. //获取全部匹配
  6. var resultArr = targetStr.match(reg);
  7. //数组长度为2
  8. console.log("resultArr.length="+resultArr.length);
  9. //遍历数组,得到'o'和'O'
  10. for(var i = 0; i < resultArr.length; i++){
  11. console.log("resultArr["+i+"]="+resultArr[i]);
  12. }
  13. 复制代码

多行查找

不使用多行查找模式,目标字符串中不管有没有换行符都会被当作一行。

  1. //目标字符串1
  2. var targetStr01 = 'Hello\nWorld!';
  3. //目标字符串2
  4. var targetStr02 = 'Hello';
  5. //匹配以'Hello'结尾的正则表达式,没有使用多行匹配
  6. var reg = /Hello$/;
  7. console.log(reg.test(targetStr01));//false
  8. console.log(reg.test(targetStr02));//true
  9. 复制代码

对比代码:

  1. //目标字符串1
  2. var targetStr01 = 'Hello\nWorld!';
  3. //目标字符串2
  4. var targetStr02 = 'Hello';
  5. //匹配以'Hello'结尾的正则表达式,使用了多行匹配
  6. var reg = /Hello$/m;
  7. console.log(reg.test(targetStr01));//true
  8. console.log(reg.test(targetStr02));//true
  9. 复制代码

5、元字符

概念

在正则表达式中被赋予特殊含义的字符,不能被直接当做普通字符使用。如果要匹配元字符本身,需要对元字符进行转义,转义的方式是在元字符前面加上“\”,例如:^

常用元字符

















































代码 说明
. 匹配除换行字符以外的任意字符。
\w 匹配字母或数字或下划线等价于[a-zA-Z0-9]
\W 匹配任何非单词字符。等价于[^A-Za-z0-9]
\s 匹配任意的空白符,包括空格、制表符、换页符等等。等价于[\f\n\r\t\v]。
\S 匹配任何非空白字符。等价于[^\f\n\r\t\v]。
\d 匹配数字。等价于[0-9]。
\D 匹配一个非数字字符。等价于[^0-9]
\b 匹配单词的开始或结束
匹配字符串的开始,但在[]中使用表示取反
$ 匹配字符串的结束

例1

  1. var str = 'one two three four';
  2. // 匹配全部空格
  3. var reg = /\s/g;
  4. // 将空格替换为@
  5. var newStr = str.replace(reg,'@'); // one@two@three@four
  6. console.log("newStr="+newStr);
  7. 复制代码

例2

  1. var str = '今年是2014年';
  2. // 匹配至少一个数字
  3. var reg = /\d+/g;
  4. str = str.replace(reg,'abcd');
  5. console.log('str='+str); // 今年是abcd年
  6. 复制代码

例3

  1. var str01 = 'I love Java';
  2. var str02 = 'Java love me';
  3. // 匹配以Java开头
  4. var reg = /^Java/g;
  5. console.log('reg.test(str01)='+reg.test(str01)); // flase
  6. console.log("<br />");
  7. console.log('reg.test(str02)='+reg.test(str02)); // true
  8. 复制代码

例4

  1. var str01 = 'I love Java';
  2. var str02 = 'Java love me';
  3. // 匹配以Java结尾
  4. var reg = /Java$/g;
  5. console.log('reg.test(str01)='+reg.test(str01)); // true
  6. console.log("<br />");
  7. console.log('reg.test(str02)='+reg.test(str02)); // flase
  8. 复制代码

6、字符集合


























语法格式 示例 说明
[字符列表] 正则表达式:[abc] 含义:目标字符串包含abc中的任何一个字符 目标字符串:plain 是否匹配:是 原因:plain中的“a”在列表“abc”中 目标字符串中任何一个字符出现在字符列表中就算匹配。
[^字符列表] [^abc] 含义:目标字符串包含abc以外的任何一个字符 目标字符串:plain 是否匹配:是 原因:plain中包含“p”、“l”、“i”、“n” 匹配字符列表中未包含的任意字符。
[字符范围] 正则表达式:[a-z] 含义:所有小写英文字符组成的字符列表 正则表达式:[A-Z] 含义:所有大写英文字符组成的字符列表 匹配指定范围内的任意字符。
  1. var str01 = 'Hello World';
  2. var str02 = 'I am Tom';
  3. //匹配abc中的任何一个
  4. var reg = /[abc]/g;
  5. console.log('reg.test(str01)='+reg.test(str01));//flase
  6. console.log('reg.test(str02)='+reg.test(str02));//true
  7. 复制代码

7、重复

  1. | 代码 | 说明 |
  2. | ----- | -------------- |
  3. | * | 重复零次或多次 |
  4. | + | 重复一次或多次 |
  5. | ? | 重复零次或一次 |
  6. | {n} | 重复n |
  7. | {n,} | 重复n次或多次 |
  8. | {n,m} | 重复nm |
  9. 复制代码
  10. console.log("/[a]{3}/.test('aa')="+/[a]{3}/g.test('aa')); // flase
  11. console.log("/[a]{3}/.test('aaa')="+/[a]{3}/g.test('aaa')); // true
  12. console.log("/[a]{3}/.test('aaaa')="+/[a]{3}/g.test('aaaa')); // true
  13. 复制代码

8、在正则表达式中表达『或者』

使用符号:|

  1. // 目标字符串
  2. var str01 = 'Hello World!';
  3. var str02 = 'I love Java';
  4. // 匹配'World'或'Java'
  5. var reg = /World|Java/g;
  6. console.log("str01.match(reg)[0]="+str01.match(reg)[0]);//World
  7. console.log("str02.match(reg)[0]="+str02.match(reg)[0]);//Java
  8. 复制代码

9、常用正则表达式


























需求 正则表达式
用户名 /^[a-zA-Z][a-zA-Z-0-9]{5,9}$/
密码 /^[a-zA-Z0-9-@#&*]{6,12}$/
前后空格 /^\s+|\s+$/g
电子邮箱 /^[a-zA-Z0-9.-]+@([a-zA-Z0-9-]+[.]{1})+[a-zA-Z]+$/

三、第一阶段要实现的功能

01、准备工作

创建目录后,把一整套现成的前端页面复制到新建的目录下,然后用HBuilderX打开这个目录。然后把vue.js文件复制到script目录下。

format_png 3

02、登录页面的表单验证

规则设定

  • 用户名非空
  • 密码非空

在login.html页面中加入Vue的环境

  1. </body>
  2. <script src="/bookstoreV01/static/script/vue.js" type="text/javascript" charset="utf-8"></script>
  3. </html>
  4. 复制代码

format_png 4

思路

format_png 5

代码实现

HTML代码

  1. <form id="loginForm" action="login_success.html">
  2. <label>用户名称:</label>
  3. <input class="itxt" type="text" v-model:value="username" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" id="username" />
  4. <br />
  5. <br />
  6. <label>用户密码:</label>
  7. <input class="itxt" type="password" v-model:value="password" placeholder="请输入密码" autocomplete="off" tabindex="1" name="password" id="password" />
  8. <br />
  9. <br />
  10. <button type="submit" id="sub_btn" @click="loginCheck">登录</button>
  11. </form>
  12. 复制代码

Vue代码

  1. new Vue({
  2. "el":"#loginForm",
  3. "data":{
  4. "username":"",
  5. "password":""
  6. },
  7. "methods":{
  8. "loginCheck":function(){
  9. // 判断用户名或密码是否为空
  10. if(this.username == "" || this.password == "") {
  11. // 如果不满足验证条件,那么阻止表单提交
  12. event.preventDefault();
  13. }
  14. }
  15. }
  16. });
  17. 复制代码

2、注册页面的表单验证

HTML代码

  1. <form id="registerForm" action="regist_success.html">
  2. <div class="form-item">
  3. <div>
  4. <label>用户名称:</label>
  5. <input v-model:value="username" type="text" placeholder="请输入用户名" />
  6. <span></span>
  7. </div>
  8. <span>{
  9. {usernameCheckMessage}}</span>
  10. </div>
  11. <div class="form-item">
  12. <div>
  13. <label>用户密码:</label>
  14. <input v-model:value="password" type="password" placeholder="请输入密码" />
  15. </div>
  16. <span class="errMess">密码的长度至少为8位</span>
  17. </div>
  18. <div class="form-item">
  19. <div>
  20. <label>确认密码:</label>
  21. <input v-model:value="passwordConfirm" type="password" placeholder="请输入确认密码" />
  22. </div>
  23. <span class="errMess">密码两次输入不一致</span>
  24. </div>
  25. <div class="form-item">
  26. <div>
  27. <label>用户邮箱:</label>
  28. <input v-model:value="email" type="text" placeholder="请输入邮箱" />
  29. </div>
  30. <span class="errMess">请输入正确的邮箱格式</span>
  31. </div>
  32. <div class="form-item">
  33. <div>
  34. <label>验证码:</label>
  35. <div class="verify">
  36. <input v-model:value="code" type="text" placeholder="" />
  37. <img src="../../static/img/code.bmp" alt="" />
  38. </div>
  39. </div>
  40. <span class="errMess">请输入正确的验证码</span>
  41. </div>
  42. <button type="submit" @click="registerCheck" class="btn">注册</button>
  43. </form>
  44. 复制代码

Vue代码

  1. new Vue({
  2. "el":"#registerForm",
  3. "data":{
  4. "username":"",
  5. "password":"",
  6. "passwordConfirm":"",
  7. "email":"",
  8. "code":"",
  9. "usernameCheckMessage":""
  10. },
  11. "watch":{
  12. "username":function(inputValue){
  13. var usernameRegExp = /^[A-Z,a-z,0-9,_]{5,8}$/;
  14. if (usernameRegExp.test(this.username)) {
  15. this.usernameCheckMessage = "";
  16. }else{
  17. this.usernameCheckMessage = "用户名不符合规则";
  18. }
  19. }
  20. },
  21. "methods":{
  22. "registerCheck":function(){
  23. // 1.检查用户名
  24. var usernameRegExp = /^[A-Z,a-z,0-9,_]{5,8}$/;
  25. if (!usernameRegExp.test(this.username)) {
  26. // 如果不满足条件,则阻止表单提交
  27. event.preventDefault();
  28. // 有任何一个条件不满足,后面就没必要检查了,所以函数可以停止执行
  29. return ;
  30. }
  31. // 2.检查密码
  32. var passwordRegExp = /^[A-Z,a-z,0-9,_]{5,8}$/;
  33. if (!passwordRegExp.test(this.password)) {
  34. // 如果不满足条件,则阻止表单提交
  35. event.preventDefault();
  36. // 有任何一个条件不满足,后面就没必要检查了,所以函数可以停止执行
  37. return ;
  38. }
  39. // 3.检查确认密码是否和密码一致
  40. if (this.password != this.passwordConfirm) {
  41. // 如果不满足条件,则阻止表单提交
  42. event.preventDefault();
  43. // 有任何一个条件不满足,后面就没必要检查了,所以函数可以停止执行
  44. return ;
  45. }
  46. // 4.检查电子邮件
  47. var emailRegExp = /^[a-zA-Z0-9_\.-]+@([a-zA-Z0-9-]+[\.]{1})+[a-zA-Z]+$/;
  48. if (!emailRegExp.test(this.email)) {
  49. // 如果不满足条件,则阻止表单提交
  50. event.preventDefault();
  51. // 有任何一个条件不满足,后面就没必要检查了,所以函数可以停止执行
  52. return ;
  53. }
  54. // 5.检查验证码
  55. var codeRegExp = /[A-Z,a-z,0-9]{5}/;
  56. if(!codeRegExp.test(this.code)) {
  57. // 如果不满足条件,则阻止表单提交
  58. event.preventDefault();
  59. // 有任何一个条件不满足,后面就没必要检查了,所以函数可以停止执行
  60. return ;
  61. }
  62. }
  63. }
  64. });

作者:Nakano_May
链接:https://juejin.cn/post/7214489453399392312

发表评论

表情:
评论列表 (有 0 条评论,182人围观)

还没有评论,来说两句吧...

相关阅读