JavaScript 编程精粹:JavaScript 事件处理

news2024/11/15 10:19:35

JavaScript 编程精粹:JavaScript 事件处理

  • 一 . BOM
    • 1.1 Window
      • 1.1.1 alert()
      • 1.1.2 confirm()
      • 1.1.3 setInterval()
      • 1.1.4 setTimeout()
      • 1.1.5 小案例 - 通过定时器来控制灯的亮暗
    • 1.2 History
    • 1.3 Location
  • 二 . DOM
    • 2.1 获取 Element 对象
    • 2.2 常见 Element 对象的使用
  • 三 . 事件监听
    • 3.1 事件绑定
    • 3.2 常见事件
    • 3.3 需求 : 移出输入框自动校验格式
      • 3.3.1 验证用户名
      • 3.3.2 验证密码
      • 3.3.3 验证手机号
      • 3.3.4 表单提交
  • 四 . Debug 调试

文章将深入介绍如何通过DOM操作来控制网页元素,以及如何利用事件监听来响应用户的行为,从而提升网页的互动性。
此外,我们还将学习如何定义和使用函数,这是编写可重用代码和实现复杂逻辑的关键。文章还会涉及数组和对象的高级操作,这些是处理数据集合和实现更高级功能的基础。最后,我们将探讨调试技巧,帮助读者在开发过程中快速定位和解决问题。
在这里插入图片描述
如果你觉得此专栏对你有帮助的话 , 还可以订阅一下此专栏
https://blog.csdn.net/m0_53117341/category_12778663.html

一 . BOM

BOM , 全称是 Browser Object Model , 即浏览器对象模型 .

JavaScript 将浏览器的各个组成部分封装成对象 .

BOM 的组成如下 :

  1. Window : 浏览器窗口对象
  2. Navigator : 浏览器对象
  3. Screen : 屏幕对象
  4. History : 历史记录对象
  5. Location : 地址栏对象

我们分别来看

1.1 Window

Window 是浏览器窗口对象 , 我们可以直接使用 window 对象中的属性或者函数 , 不用通过 window 关键字调用

其中 , Window 提供了四个方法

alert()弹出提醒框
confirm()弹出待确认框
setInterval()定时器
setTimeout()定时器

我们一个一个来看

1.1.1 alert()

alert() 弹窗我们之前也学习过

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 警告框
    // window. 可以省略
    // window.alert('俺是警告框!');
    alert('俺是警告框!');
</script>
</html>

1.1.2 confirm()

confirm() 可以让用户选择确认或者取消 , 用户选择确认的话 , 返回值就是 true , 否则就是 false

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 确认框
    // window. 可以省略
    // let result = window.confirm('True or False?');
    let result = confirm('True or False?');
    console.log(result);
</script>
</html>

1.1.3 setInterval()

setInterval() 表示 JS 中的定时器 , 每隔多少毫秒就会执行一次匿名函数体中的函数体

语法 :

let 定时器变量名 = window.setInterval(匿名函数,毫秒);

我们还可以在某个位置取消定时器任务

window.clearInterval(定时器变量名);

我们举个例子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    /*
        定时器: let 定时器变量名 = window.setInterval(匿名函数,毫秒);
        说明: 该函数表示 JS 中的定时器, 每隔多少毫秒就会执行一次匿名函数中的函数体
        
        取消定时器: window.clearInterval(定时器变量名);
    */
    // 这里的匿名函数是作为另一个函数的参数传递
    // window.setInterval(function () {},1000); 是将匿名函数传递给 setInterval 函数的底层, 底层负责调用, 我们只需要完成匿名函数体代码即可
    window.setInterval(function () {
        console.log('俺是定时器');
    },1000);
</script>
</html>

那接下来 , 我们完成一个需求 : 开启定时器 , 页面被加载 1 秒后输出一次 hello , 注意 : 只输出一次

那我们刚才还介绍了取消定时器任务的代码 , 所以我们只需要添加这段代码即可

我们看一下效果

按理说 , 刷新之后应该每秒打印一次 , 打印一次就停止 . 但是怎么一次都没打印呢 ?

这是因为我们 JS 的执行顺序是从上到下执行的 , 当执行到定时器任务的时候 , 发现需要等待 1s 再去执行 , 所以他会继续向下执行 . 但是他发现了取消定时器任务的代码 , 就立刻执行了 . 这就导致定时器任务最终一次都没执行 .

所以我们需要将取消定时器的任务放到定时器任务中

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    /*
        定时器: let 定时器变量名 = window.setInterval(匿名函数,毫秒);
        说明: 该函数表示 JS 中的定时器, 每隔多少毫秒就会执行一次匿名函数中的函数体
        
        取消定时器: window.clearInterval(定时器变量名);
    */
    // 这里的匿名函数是作为另一个函数的参数传递
    // window.setInterval(function () {},1000); 是将匿名函数传递给 setInterval 函数的底层, 底层负责调用, 我们只需要完成匿名函数体代码即可
    let timer = window.setInterval(function () {
        console.log('俺是定时器');
        
        // 取消定时器任务
        window.clearInterval(timer);
    },1000);
</script>
</html>

此时我们再来看一下效果

1.1.4 setTimeout()

该函数也表示 JS 中的定时器 , 隔多少毫秒就会执行一次匿名函数体中的代码 , 但是最后只会执行一次

这就是与 setInterval() 的区别

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // let 定时器变量名 = window.setTimeout(匿名函数,毫秒);
        // 与 setInterval 不一样的是, 该定时器每隔多少毫秒就会执行一次匿名函数体中的代码, 并且只会执行一次
        window.setTimeout(function(){
            // 页面在 1s 之后就会打印 hello,但是只输出一次就结束了
            console.log('hello');
        },1000);
    </script>
</body>
</html>

1.1.5 小案例 - 通过定时器来控制灯的亮暗

我们先将基础代码给到大家

实际上 , 灯的亮暗我们是通过切换图片来实现的

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示, 但也可以书写中文 -->
<html lang="en">
<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>Title</title>
</head>
<body>
    <!-- 
        onclick 属于 JS 中的单击事件, 只要单击当前开灯的 input 按钮标签就会执行该事件, 调用该事件的 JS 函数 on()
     -->
    <input type="button" onclick="on()" value="开灯">
    <!-- 默认灯是关的 -->
    <img id="myImage" border="0" src="../material/off.gif" style="text-align:center;">
    <input type="button" onclick="off()" value="关灯">
</body>
<script>
    // 开灯
    function on() {
        /*
            1. document.getElementById('myImage') 根据标签 <img id="myImage" border="0" src="../material/off.gif" style="text-align:center;">
               的 id 属性值获取 img 整体标签对象,

            2. document.getElementById('myImage').src='../material/on.gif'; 使用获取的 img 标签对象调用 img 标签的 src 属性并赋值为 imgs/on.gif
         */
        document.getElementById('myImage').src = '../material/on.gif';
    }
    
    // 关灯
    function off() {
        document.getElementById('myImage').src = '../material/off.gif'
    }
    
    /*
        需求: 每隔一秒,灯泡切换一次状态
        就是每隔一秒更改一次<img id="myImage" border="0" src="../material/off.gif" style="text-align:center;">标签的 src 属性值
        这里我们只需要每隔一秒调用上面的 JS 中的 on 或者 off 函数即可
     */

</script>
</html>

所需的两张图片 :

off.gifon.gif

那目前的效果如下 :

我们要做的是通过定时器 , 实现自动进行开关灯状态的切换

我们可以通过一个布尔变量来去记录开关灯的状态 , 当 ret 为 true 的时候就代表已经开灯 , 需要关灯 . 当 ret 为 false 的时候就代表已经关灯 , 需要开灯 .

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示, 但也可以书写中文 -->
<html lang="en">
<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>Title</title>
</head>
<body>
    <!--
        onclick 属于 JS 中的单击事件, 只要单击当前开灯的 input 按钮标签就会执行该事件, 调用该事件的 JS 函数 on()
     -->
    <input type="button" onclick="on()" value="开灯">
    <!-- 默认灯是关的 -->
    <img id="myImage" src="./material/off.gif" style="text-align:center;">
    <input type="button" onclick="off()" value="关灯">
</body>
<script>
    // 用来定义开关状态的变量
    let ret = false;// 刚开始灯是关的
    
    // 开灯
    function on() {
        /*
            1. document.getElementById('myImage') 根据标签 <img id="myImage" border="0" src="../material/off.gif" style="text-align:center;">
               的 id 属性值获取 img 整体标签对象,

            2. document.getElementById('myImage').src='../material/on.gif'; 使用获取的 img 标签对象调用 img 标签的 src 属性并赋值为 imgs/on.gif
         */
        document.getElementById('myImage').src = './material/on.gif';
    }
    
    // 关灯
    function off() {
        document.getElementById('myImage').src = './material/off.gif'
    }
    
    /*
        需求: 每隔一秒,灯泡切换一次状态
        就是每隔一秒更改一次<img id="myImage" border="0" src="../material/off.gif" style="text-align:center;">标签的 src 属性值
        这里我们只需要每隔一秒调用上面的 JS 中的 on 或者 off 函数即可
     */
     window.setInterval(function () {
        // 此时灯是关闭的, 需要开灯
        if(ret == false) {
            on();
        } else { // 此时灯是开启的, 需要关灯
            off();
        }
        // 修改灯的状态
        ret = !ret;
     },10);

</script>
</html>

我们可以来看一下效果

1.2 History

History 指的就是历史记录

使用 window.history() 就可以获取到 history 对象 , window 可以省略 .

其中 , forward 代表前进一步 , back 代表后退一步 .

那我们接下来就可以通过代码来实现浏览器的前进和后退功能 .

我们需要准备两个网页 :

demo01.html :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!-- 先准备一个 HTML 页面用来跳转 -->
    <a href='./demo02.html'>跳转到其他界面</a>
    
    <!-- 给当前页面提供一个按钮 -->
    <!-- 给当前按钮绑定单击事件, 单击按钮的时候就会调用 fn() 函数,就会前进到 demo02.html 页面 -->
    <button onclick='fn()'>-></button>
</body>
<script>
    function fn() {
        // 前进一步
        window.history.forward();
    }
</script>
</html>

demo02.html :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button onclick="fn2()"> <- </button>
</body>
<script>
    function fn2() {
        // 后退一步
        window.history.back();
    }
</script>
</html>

我们可以查看一下效果

history 对象还有个函数 : go(整数)

  • 如果参数是正整数就表示前进 , 例如 : 1 就表示前进一步 , 2 就表示前进两步 …
  • 如果参数是负整数就表示后退 , 例如 : -1 就表示后退一步 , 2 就表示后退两步 …

所以代码还可以这样写 :

demo01.html :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!-- 先准备一个 HTML 页面用来跳转 -->
    <a href='./demo02.html'>跳转到其他界面</a>
    
    <!-- 给当前页面提供一个按钮 -->
    <!-- 给当前按钮绑定单击事件, 单击按钮的时候就会调用 fn() 函数,就会前进到 demo02.html 页面 -->
    <button onclick='fn()'>-></button>
</body>
<script>
    function fn() {
        // 前进一步
        window.history.go(1);
    }
</script>
</html>

demo02.html :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <button onclick="fn2()"> <- </button>
    <script>
        function fn2() {
            // 后退一步
            window.history.go(-1);
        }
    </script>
</body>
</html>

1.3 Location

location 是地址栏对象 .

获取方式 : 使用 window.location 获取 , 其中 window 依然可以省略

// window.location.方法();
location.方法();

其中 , 最常用的方法就是 href 方法 , 他可以设置或者返回完整的 URL , 一般我们用于设置 URL 比较多

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

</body>
<script>
    // 需求: 浏览器一加载, 就会跳转到百度页面
    // window.location.href = 'http://www.baidu.com';
    location.href = 'http://www.baidu.com';
</script>
</html>

二 . DOM

DOM , 全称 Document Object Model 文档对象模型 , 他是用来操作 HTML 中的标签的 .

在 HTML 页面启动的时候 , 就会将 HTML 各个元素组织成类似这样的 DOM 树

DOM 将标记语言的各个组成部分封装为对象

  • Document : 整个文档对象
  • Element : 元素对象
  • Attribute : 属性对象
  • Text : 文本对象
<!-- 整个 HTML 就是 Document 对象 -->
<html>
  <head>
    <title>文档标题</title>
  </head>
  <body>
    <!-- 类似 h1、a 这种就是 Element 对象 -->
    <h1>我的标题</h1>
    <!-- 类似 href 这种就是 Attribute 对象 -->
    <!-- 类似 我的链接 这种就是 Text 对象 -->
    <a href="#">我的链接</a>
  </body>
</html>

那 JavaScript 就可以通过 DOM , 就能够对 HTML 进行操作了

  1. 改变 HTML 元素的内容
  2. 改变 HTML 元素的样式 (CSS)
  3. 对 HTML DOM 事件做出反应
  4. 添加和删除 HTML 元素

比如我们想要获取到 HTML 中的 image 标签 , 那就需要用到 Image 对象 , 那 Image 的父对象就是 Element 对象 .

也就是说如果我们想要使用一些方法 , 可以先去 Image 对象中查找是否有我们需要的方法 , 如果没有的话可以再去 Element 对象中查询是否有我们需要的方法即可 .

我们可以去 https://www.w3school.com.cn/jsref/dom_obj_anchor.asp 这个链接中查询我们需要的 Element 元素对象

2.1 获取 Element 对象

Element 对象就是我们每一个 HTML 标签 , 我们需要使用 Document 对象的方法来获取

  1. getElementById : 根据 id 属性值来获取 , 返回一个 Element 对象
  2. getElementsByTagName : 根据标签名获取 , 返回 Element 对象数组
  3. getElementsByName : 根据 name 属性值获取 , 返回 Element 对象数组
  4. getElementsByClassName : 根据 class 属性值获取 , 返回 Element 对象数组

我们可以通过例子来看一下 , 我们先将基础页面提供给大家

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示, 单也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>Title</title>
</head>
<body>
    <img id="light" src="../material/off.gif"> <br>
    
    <div class="cls">嘿嘿</div> <br>
    <div class="cls">哈哈</div> <br>
    
    <input type="checkbox" name="hobby"> 电影
    <input type="checkbox" name="hobby"> 旅游
    <input type="checkbox" name="hobby"> 游戏
    <br>
</body>
<script>
    /*
        获取: 使用 Document 对象的方法来获取
            * getElementById: 根据 id 属性值获取, 返回一个 Element 对象
            * getElementsByTagName: 根据标签名称获取, 返回 Element 对象数组
            * getElementsByName: 根据 name 属性值获取, 返回 Element 对象数组
            * getElementsByClassName: 根据 class 属性值获取, 返回 Element 对象数组
    */
    
    // 1. getElementById: 根据 id 属性值获取, 返回一个 Element 对象
    // 获取 img 标签 : <img id="light" src="../material/off.gif">
    
    // 2. getElementsByTagName: 根据标签名称获取, 返回 Element 对象数组
    // 获取上述所有的 div 标签
    
    // 3. getElementsByName: 根据 name 属性值获取, 返回 Element 对象数组
    // 获取上述所有的 name 属性值是 hobby 的标签
    
    // 4. getElementsByClassName: 根据 class 属性值获取, 返回 Element 对象数组
    // 获取 class 是 cls 的标签

</script>
</html>

那接下来我们就一个一个来看

getElementById : 根据 id 属性值获取, 返回一个 Element 对象

我们可以先来看一下 Image 对象提供了哪些方法 : https://www.w3school.com.cn/jsref/dom_obj_image.asp

那我们通过 src 方法就可以获取到 img 标签的图片的来源

getElementsByTagName : 根据标签名称获取, 返回 Element 对象数组

我们想要获取到 div 标签中的文字 , 那我们就可以去 Div 对象中去寻找对应的方法

https://www.w3school.com.cn/jsref/dom_obj_div.asp

但是发现 , Div 对象并未提供一些获取到标签内元素内容的方法 , 那我们就可以去 Div 对象的父对象 Element 对象看一下是否有对应的方法

https://www.w3school.com.cn/jsref/dom_obj_all.asp

此时 arrDivs 数组存储的都是 Div 对象 , 那我们就可以遍历 arrDivs 数组 , 然后获取到 div 标签中的文本

getElementsByName : 根据 name 属性值获取, 返回 Element 对象数组

getElementsByClassName : 根据 class 属性值获取, 返回 Element 对象数组

整体代码如下 :

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示, 单也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>Title</title>
</head>
<body>
    <img id="light" src="../material/off.gif"> <br>
    
    <div class="cls">嘿嘿</div> <br>
    <div class="cls">哈哈</div> <br>
    
    <input type="checkbox" name="hobby"> 电影
    <input type="checkbox" name="hobby"> 旅游
    <input type="checkbox" name="hobby"> 游戏
    <br>
</body>
<script>
    /*
        获取: 使用 Document 对象的方法来获取
            * getElementById: 根据 id 属性值获取, 返回一个 Element 对象
            * getElementsByTagName: 根据标签名称获取, 返回 Element 对象数组
            * getElementsByName: 根据 name 属性值获取, 返回 Element 对象数组
            * getElementsByClassName: 根据 class 属性值获取, 返回 Element 对象数组
    */
    
    // 1. getElementById: 根据 id 属性值获取, 返回一个 Element 对象
    // 获取 img 标签 : <img id="light" src="../material/off.gif">
    let oImg = document.getElementById('light');
    console.log(oImg.src);
    
    // 2. getElementsByTagName: 根据标签名称获取, 返回 Element 对象数组
    // 获取上述所有的 div 标签
    let arrDivs = document.getElementsByTagName('div');
    for (let i = 0; i < arrDivs.length; i++) {
        // 我们习惯性的在接收对象的时候, 在前面添加 o 表示该元素是一个对象
        let oDiv = arrDivs[i];
        // 使用 Element 父元素提供的 innerHTML 方法获取标签中的值
        console.log(oDiv.innerHTML);
    }
    
    // 3. getElementsByName: 根据 name 属性值获取, 返回 Element 对象数组
    // 获取上述所有的 name 属性值是 hobby 的标签
    let arrHobbies = document.getElementsByName('hobby');
    for (let i = 0; i < arrHobbies.length; i++) {
        // 获取到 oHobby 对象
        let oHobby = arrHobbies[i];
        // 获取到 oHobby 的 value 的值
        console.log(oHobby);
    }
    
    // 4. getElementsByClassName: 根据 class 属性值获取, 返回 Element 对象数组
    // 获取 class 是 cls 的标签
    let arrCls = document.getElementsByClassName('cls');
    for (let i = 0; i < arrCls.length; i++) {
        // 获取到 oHobby 对象
        let oDiv = arrCls[i];
        // 获取到 oHobby 的 value 的值
        console.log(oDiv.innerHTML);
    }
    
</script>
</html>

2.2 常见 Element 对象的使用

我们目前有三个需求 , 先将整体框架给到大家

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示, 单也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>Title</title>
</head>
<body>
    <img id="light" src="../material/off.gif"> <br>
    
    <div class="cls">嘿嘿</div> <br>
    <div class="cls">哈哈</div> <br>
    
    <input type="checkbox" name="hobby"> 电影
    <input type="checkbox" name="hobby"> 旅游
    <input type="checkbox" name="hobby"> 游戏
    <br>
</body>
<script>
    // 1. getElementById : 根据 id 属性值获取, 返回一个 Element 对象
    // 获取 img 标签 : <img id="light" src="../material/off.gif">
    // 获取到的 img 标签是一个对象, 具体来讲是一个 Image 对象, 然后我们就可以使用 oImg 对象调用 Image 中的属性和函数
    let oImg = document.getElementById('light');
    // TODO : 修改图片地址
    
    // 2. getElementsByTagName : 根据标签名称获取, 返回 Element 对象数组
    // 获取上述所有的 div 标签
    let arrDivs = document.getElementsByTagName('div');
    /*
        style: 设置元素 CSS 样式
        innerHTML: 设置元素内容
    */
    for(let i = 0;i < arrDivs.length;i++) {
        // TODO 设置字体颜色为红色
        let oDiv = arrDivs[i];
        // TODO 更改文本
        console.log(oDiv.innerHTML);
    }
    
    // 3. getElementsByName : 根据 name 属性值获取, 返回 Element 对象数组
    // 获取上述所有的 name 属性值是 hobby 的标签
    let arrHobbies = document.getElementsByName('hobby');
    for(let i = 0;i < arrHobbies.length;i++) {
        // TODO : 设置复选框被选中
        // 标签对象.checked = true/false;
        // true 表示被选中, false 表示不被选中
        
    }
</script>
</html>

需求 1 : 修改图片地址

我们先来看 Img 对象是否提供了这个方法

https://www.w3school.com.cn/jsref/dom_obj_image.asp

那我们就可以使用 Img 提供给我们的 src 方法来去设置图像的 src 属性值

需求 2 : 设置字体颜色为红色并且更改文本内容

我们先去看一下 div 标签是否提供了这样的方法

https://www.w3school.com.cn/jsref/dom_obj_div.asp

发现并没有提供类似的方法 , 那接下来我们就需要去 Div 对象的父对象 Element 中去寻找

https://www.w3school.com.cn/jsref/dom_obj_all.asp

那我们就可以通过这两个方法进行修改了

需求 3 : 设置复选框被选中

我们先去看一下 Input 对象是否提供给我们这样的方法

那我们就能通过 checked 方法来去设置默认选中了

整体代码如下 :

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示, 单也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>Title</title>
</head>
<body>
    <img id="light" src="../material/off.gif"> <br>
    
    <div class="cls">嘿嘿</div> <br>
    <div class="cls">哈哈</div> <br>
    
    <input type="checkbox" name="hobby"> 电影
    <input type="checkbox" name="hobby"> 旅游
    <input type="checkbox" name="hobby"> 游戏
    <br>
</body>
<script>
    // 1. getElementById : 根据 id 属性值获取, 返回一个 Element 对象
    // 获取 img 标签 : <img id="light" src="../material/off.gif">
    // 获取到的 img 标签是一个对象, 具体来讲是一个 Image 对象, 然后我们就可以使用 oImg 对象调用 Image 中的属性和函数
    let oImg = document.getElementById('light');
    // TODO : 修改图片地址
    oImg.src = '../material/on.gif'
    
    // 2. getElementsByTagName : 根据标签名称获取, 返回 Element 对象数组
    // 获取上述所有的 div 标签
    let arrDivs = document.getElementsByTagName('div');
    /*
        style: 设置元素 CSS 样式
        innerHTML: 设置元素内容
    */
    for(let i = 0;i < arrDivs.length;i++) {
        // TODO 设置字体颜色为红色
        arrDivs[i].style.color = 'red';
        // TODO 更改文本
        arrDivs[i].innerHTML = '嘻嘻';
    }
    
    // 3. getElementsByName : 根据 name 属性值获取, 返回 Element 对象数组
    // 获取上述所有的 name 属性值是 hobby 的标签
    let arrHobbies = document.getElementsByName('hobby');
    for(let i = 0;i < arrHobbies.length;i++) {
        // TODO : 设置复选框被选中
        // 标签对象.checked = true/false;
        // true 表示被选中, false 表示不被选中
        arrHobbies[i].checked = true;
    }
</script>
</html>

三 . 事件监听

事件 : HTML 事件指的是发生在 HTML 元素上面的事情 , 比如 :

  • 按钮被点击
  • 鼠标移动到元素上
  • 按下键盘的按键

事件监听 : JavaScript 可以在事件被执行到的时候执行相对应的代码

3.1 事件绑定

事件绑定有两种方式 :

方式一 : 通过 HTML 标签中的事件属性进行绑定

<input type="button" onclick='on()'> 

function on() {
  alert('点击事件');
}

方式二 : 通过 DOM 元素属性绑定

<input type="button" id='btn'>

document.getElementById('btn').onclick = function() {
  alert('点击事件');
}

我们可以举个例子

方式一 :

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <!-- 给 input 标签绑定单击事件, 只要点击 input 标签就会调用 fn 函数 -->
    <input type='button' value='快来点我' onclick='fn()'>
</body>
<script>
    // 事件名称作为 input 标签的属性, 在属性值中调用 hs 函数
    function fn() {
        console.log('嗨嗨嗨~');
    }
</script>
</html>

方式二 :

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 给 input 标签绑定单击事件, 只要点击 input 标签就会调用 fn 函数 -->
  <input type="button" value="快来点我" id="btn">
</body>
<script>
  // 获取 input 标签对象
  let oBtn = document.getElementById('btn');
  
  // 调用 oBtn 对象调用单击事件
  oBtn.onclick = function () {
    console.log('我被点击了');
  }
</script>
</html>

3.2 常见事件

事件名说明效果
onclick鼠标单击事件
onblur元素失去焦点输入框不在输入状态 , 指的就是元素失去焦点
onfocus元素获得焦点常用于输入框 , 输入状态指的就是元素获得焦点
onload某个页面或图像被完成加载
onsubmit当表单提交时触发该事件
onkeydown某个键盘的键被按下
onmouseover鼠标被移到某元素之上鼠标放到加号的时候
onmouseout鼠标从某元素移开鼠标移开 , 就会消失

我们可以举几个例子

onclick :

<!doctype html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <meta name='viewport'
          content='width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'>
    <meta http-equiv='X-UA-Compatible' content='ie=edge'>
    <title>Document</title>
</head>
<body>
    <!-- 需求: 给 form 表单绑定提交事件, 然后将数据提交到后台服务器 -->
    <!-- οnsubmit='fn()' 表示给表单绑定提交事件, 当提交表单的时候就会调用 fn 函数 -->
    <form action='#' id='register' onsubmit='fn()'>
        <input type='text' name='username' id='username'>
        <input type='submit' value='提交'>
    </form>
</body>
<script>
    // 获取到用户所输入的值并通过弹窗进行展示
    function fn() {
        // 获取到 Input 对象
        let oInput = document.getElementById('username');
        
        // 打印用户输入的值
        alert(oInput.value);
    }
</script>
</html>

onload :

我们之前介绍过 , JS 代码可以写在 HTML 页面内的各个位置 , 但是不推荐写在上面 , 因为 HTML 是从上往下执行的 , 所以先执行 JS 的逻辑就有可能会报错

这段代码就是在 HTML 页面的上半部分引入 JS , 然后获取输入框的值

<!doctype html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <meta name='viewport'
          content='width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'>
    <meta http-equiv='X-UA-Compatible' content='ie=edge'>
    <title>Document</title>
    <script>
        // 需求: 在这里获取到 input 标签的默认值
        // 先获取到 Input 对象
        let oInput = document.getElementById('username');
        
        // 再获取到 Input 对象的默认值
        console.log(oInput.value);
    </script>
</head>
<body>
    <!-- 需求: 给 form 表单绑定提交事件, 然后将数据提交到后台服务器 -->
    <!-- οnsubmit='fn()' 表示给表单绑定提交事件, 当提交表单的时候就会调用 fn 函数 -->
    <form action='#' id='register' onsubmit='fn()'>
        <input type='text' name='username' id='username' value='张三'>
        <input type='submit' value='提交'>
    </form>
</body>

</html>

此时我们看一下效果

我们发现报错了 , 这是因为 HTML 是按照从上往下的顺序去执行的 , 执行到 JS 这个位置发现并没有 Input 对象 , 所以就会报错

那我们就可以使用 onload 这个函数 , 只有当页面加载完成的时候 , 才能调用 onload 函数内部的逻辑

<!doctype html>
<html lang='en'>
<head>
    <meta charset='UTF-8'>
    <meta name='viewport'
          content='width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0'>
    <meta http-equiv='X-UA-Compatible' content='ie=edge'>
    <title>Document</title>
    <script>
        /* 
            存在的问题: 
            虽然在 HTML 的页面中的任意位置都可以书写 JS 代码, 但是如果将 JS 代码书写在上边就有可能因为浏览器的加载顺序问题导致来不及加载下半部分的标签
            这样就导致获取不到对应标签, 最终结果为 null, 那么就不能使用标签对象调用属性和函数
            解决方案: 将 JS 代码放到 onload 事件的匿名函数中, 整个页面加载完毕之后再去加载 JS 代码
        */
        window.onload = function () {
            // 需求: 在这里获取到 input 标签的默认值
            // 先获取到 Input 对象
            let oInput = document.getElementById('username');
            
            // 再获取到 Input 对象的默认值
            console.log(oInput.value);
        }
    </script>
</head>
<body>
    <!-- 需求: 给 form 表单绑定提交事件, 然后将数据提交到后台服务器 -->
    <!-- οnsubmit='fn()' 表示给表单绑定提交事件, 当提交表单的时候就会调用 fn 函数 -->
    <form action='#' id='register' onsubmit='fn()'>
        <input type='text' name='username' id='username' value='张三'>
        <input type='submit' value='提交'>
    </form>
</body>

</html>

3.3 需求 : 移出输入框自动校验格式

我们要做的就是类似这样的界面

当用户输入合法的账号之后 , 就显示用户名合法 .

当用户输入不合法的账号之后 , 就提示用户用户名不合法 .

我们先把最基础的框架提供给大家

表单验证.zip

我们最核心的思路就是

  1. 当输入框失去焦点时 , 验证输入内容是否符合要求
    1. 获取表单输入框
    2. 绑定 onblur 事件
    3. 获取输入内容
    4. 判断是否符合规则
    5. 如果不符合规则 , 则显示错误提示信息
  2. 当点击注册按钮时 , 判断所有输入框的内容是否都符合要求 , 如果不符合要求则阻止表单提交
    1. 获取表单对象
    2. 为表单对象绑定 onsubmit 事件
    3. 判断所有输入框是否都符合要求 , 如果符合 , 则返回 true . 如果有一项不符合 , 则返回 false .

3.3.1 验证用户名

首先 , 我们需要为用户输入框绑定 onblur 事件 . 当鼠标离开输入框之后 , 就会执行 checkUsername 函数

我们可以先测试一下 checkUsername 是否能够正常调用

那接下来我们就可以编写验证用户名的逻辑了

首先 , 我们需要获取到用户名输入框对应的 Input 对象 , 并且获取到用户所输入的内容

我们可以通过 Input 对象的 value 属性获取到用户输入的值

然后接下来我们可以限制一下用户输入的规则 , 我们可以通过正则表达式来实现

接下来我们就可以使用正则对象调用 test 函数来去判断用户输入的用户名是否满足正则

那先处理不满足正则的逻辑 , 我们在上面添加了一个 span 标签 , 内容是用户名不太受欢迎 , 不过我们将样式设置成了 none , 即不显示在页面上 . 那当用户输入的用户名不满足正则表达式的话 , 就设置成 block 显示给用户 .

接下来我们可以看一下效果

接下来处理用户名合法的逻辑

用户名合法的话 , 就需要重新将 “用户名不太受欢迎” 这个 span 标签继续设置成 none

此时我们可以再来看一下效果

那我们还可以在用户名合法的时候 , 给用户一些提示

此时我们在用户输入成功的时候 , 就可以修改对应的 span 标签为 block 了

我们再来看一下

我们发现 , 当用户名修改合法之后 , 同时显示了用户名不太受欢迎和用户名合法 , 所以我们还需要设置一下

这次我们再来看一下效果

这一部分的代码 :

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示,但也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="#">登录</a>
    </div>
    <form id="reg-form" action="#" method="get">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <!-- 
                        οnblur="checkUsername()" 表示给用户名的输入框绑定离焦事件
                        只要鼠标离开用户名的输入框就会执行, 并且调用 checkUsername() 函数
                    -->
                    <input name="username" type="text" id="username" onblur="checkUsername()">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                    <br>
                    <span id="username_right" class="right_msg" style="display: none;color: green;">用户名合法</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <input name="password" type="password" id="password">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


            <tr>
                <td>手机号</td>
                <td class="inputs"><input name="tel" type="text" id="tel">
                    <br>
                    <span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>
</body>
<script>
    // 1. 验证 用户名是否符合规则: 长度 6~12, 单词字符组成
    function checkUsername() {
        // 1. 获取用户名的 Input 标签对象
        let oUserName = document.getElementById('username');
  
        // 2. 获取 value 的值, 即输入框输入的内容
        // 这个方法我们已经使用多次了, 不清楚可以去查询
        let userNameVal = oUserName.value;
  
        // 3. 创建正则对象, 用来约束用户输入的规则
        // \w 在正则中表示单词字符: [a-zA-Z0-9_]
        let reg = /^\w{6,12}$/;
  
        // 4. 使用正则对象调用 test 函数来去判断用户输入的用户名是否满足正则
        let oUserNameErr = document.getElementById('username_err');
        let oUserNameRight = document.getElementById('username_right');
        if(reg.test(userNameVal)) {
            // 满足正则
            // 需要提示给用户成功的信息
            oUserNameRight.style.display = 'block';// 设置 '用户名合法' 显示
            oUserNameErr.style.display = 'none';// 将 '用户名不太受欢迎' 取消显示
            return true;
        } else {
            // 不满足正则
            // 需要提示给用户红色的错误提示信息, 实际上就是让上面的 span 标签重新显示, 也就是将 display:none 的样式设置成 block 即可
            // 将 display 设置成 block
            oUserNameErr.style.display = 'block';// 设置 '用户名不太受欢迎' 显示
            oUserNameRight.style.display = 'none';// 将 '用户名合法' 取消显示
            // 用户名错误, 不能提交表单, 所以需要返回 false
            return false;
        }
    };
  
    // 2. 验证 密码是否符合规则: 长度 6~12 任意字符
    
  
    // 3. 验证 手机号是否符合规则: 长度 11, 数字组成, 第一位是1
    
  
    // 4. 表单是否可以提交
   

</script>
</html>

3.3.2 验证密码

第一步 : 给密码对应的输入框绑定离焦事件

第二步 : 获取密码的 Input 标签对象 , 并且获取用户输入的密码值

第三步 : 通过正则表达式判断用户输入的密码是否符合要求

. 表示任意类型的字符 , {6,12} 指的是长度需要为 6~12 位 (包括 6、12 位)

第四步 : 判断用户输入的密码是否满足正则

第五步 : 如果满足正则 , 则隐藏错误信息 , 并且返回 true

第六步 : 如果不满足正则 , 则显示错误信息 , 并且返回 false

我们来看一下效果

整体的代码 :

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示,但也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="#">登录</a>
    </div>
    <form id="reg-form" action="#" method="get">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <!-- 
                        οnblur="checkUsername()" 表示给用户名的输入框绑定离焦事件
                        只要鼠标离开用户名的输入框就会执行, 并且调用 checkUsername() 函数
                    -->
                    <input name="username" type="text" id="username" onblur="checkUsername()">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                    <br>
                    <span id="username_right" class="right_msg" style="display: none;color: green;">用户名合法</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <!-- 
                        οnblur="checkPassword()" 表示给用密码的输入框绑定离焦事件
                        只要鼠标离开密码的输入框就会执行, 并且调用 checkPassword() 函数
                    -->
                    <input name="password" type="password" id="password" onblur="checkPassword()">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


            <tr>
                <td>手机号</td>
                <td class="inputs"><input name="tel" type="text" id="tel">
                    <br>
                    <span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>

</body>
<script>
    // 1. 验证 用户名是否符合规则: 长度 6~12, 单词字符组成
    function checkUsername() {
        // 1. 获取用户名的 Input 标签对象
        let oUserName = document.getElementById('username');

        // 2. 获取 value 的值, 即输入框输入的内容
        // 这个方法我们已经使用多次了, 不清楚可以去查询
        let userNameVal = oUserName.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        // \w 在正则中表示单词字符: [a-zA-Z0-9_]
        let reg = /^\w{6,12}$/;

        // 4. 使用正则对象调用 test 函数来去判断用户输入的用户名是否满足正则
        let oUserNameErr = document.getElementById('username_err');
        let oUserNameRight = document.getElementById('username_right');
        if(reg.test(userNameVal)) {
            // 满足正则
            // 需要提示给用户成功的信息
            oUserNameRight.style.display = 'block';// 设置 '用户名合法' 显示
            oUserNameErr.style.display = 'none';// 将 '用户名不太受欢迎' 取消显示
            return true;
        } else {
            // 不满足正则
            // 需要提示给用户红色的错误提示信息, 实际上就是让上面的 span 标签重新显示, 也就是将 display:none 的样式设置成 block 即可
            // 将 display 设置成 block
            oUserNameErr.style.display = 'block';// 设置 '用户名不太受欢迎' 显示
            oUserNameRight.style.display = 'none';// 将 '用户名合法' 取消显示
            // 用户名错误, 不能提交表单, 所以需要返回 false
            return false;
        }
    };

    // 2. 验证 密码是否符合规则: 长度 6~12 任意字符
    function checkPassword() {
        // 1. 获取密码的 Input 标签对象
        let oPassword = document.getElementById('password');

        // 2. 获取 value 的值, 即输入框输入的内容
        let userPassword = oPassword.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        let reg = /^.{6,12}$/;

        // 4. 判断用户输入的密码是否满足正则
        let oPwdErr = document.getElementById('password_err');
        if(reg.test(userPassword)) {
            // 满足正则
            oPwdErr.style.display = 'none';
            return true;
        } else {
            // 不满足正则
            oPwdErr.style.display = 'block';
            return false;
        }
    }

    // 3. 验证 手机号是否符合规则: 长度 11, 数字组成, 第一位是1
    

    // 4. 表单是否可以提交
   

</script>
</html>

3.3.3 验证手机号

第一步 : 给手机号对应的输入框绑定离焦事件

第二步 : 获取手机号所对应的输入框的 Input 标签对象 , 并且获取用户输入的手机号值

第三步 : 通过正则表达式判断用户输入的手机号是否符合要求

1 表示第一位数字必须为 1

[0-9] 表示中间的数字可以为 0-9 之间任意一个数字

{10} 表示 [0-9] 这样的数字需要出现 10 次

第四步 : 判断用户输入的手机号是否满足正则

第五步 : 如果满足正则 , 则隐藏错误信息 , 并且返回 true . 如果不满足正则 , 则显示错误信息 , 并且返回 false

整体代码如下 :

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示,但也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="#">登录</a>
    </div>
    <form id="reg-form" action="#" method="get">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <!-- 
                        οnblur="checkUsername()" 表示给用户名的输入框绑定离焦事件
                        只要鼠标离开用户名的输入框就会执行, 并且调用 checkUsername() 函数
                    -->
                    <input name="username" type="text" id="username" onblur="checkUsername()">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                    <br>
                    <span id="username_right" class="right_msg" style="display: none;color: green;">用户名合法</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <!-- 
                        οnblur="checkPassword()" 表示给用密码的输入框绑定离焦事件
                        只要鼠标离开密码的输入框就会执行, 并且调用 checkPassword() 函数
                    -->
                    <input name="password" type="password" id="password" onblur="checkPassword()">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


            <tr>
                <td>手机号</td>
                <!-- 
                        οnblur="checkTel()" 表示给用手机号的输入框绑定离焦事件
                        只要鼠标离开手机号的输入框就会执行, 并且调用 checkTel() 函数
                -->
                <td class="inputs"><input name="tel" type="text" id="tel" onblur="checkTel()">
                    <br>
                    <span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>

</body>
<script>
    // 1. 验证 用户名是否符合规则: 长度 6~12, 单词字符组成
    function checkUsername() {
        // 1. 获取用户名的 Input 标签对象
        let oUserName = document.getElementById('username');

        // 2. 获取 value 的值, 即输入框输入的内容
        // 这个方法我们已经使用多次了, 不清楚可以去查询
        let userNameVal = oUserName.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        // \w 在正则中表示单词字符: [a-zA-Z0-9_]
        let reg = /^\w{6,12}$/;

        // 4. 使用正则对象调用 test 函数来去判断用户输入的用户名是否满足正则
        let oUserNameErr = document.getElementById('username_err');
        let oUserNameRight = document.getElementById('username_right');
        if(reg.test(userNameVal)) {
            // 满足正则
            // 需要提示给用户成功的信息
            oUserNameRight.style.display = 'block';// 设置 '用户名合法' 显示
            oUserNameErr.style.display = 'none';// 将 '用户名不太受欢迎' 取消显示
            return true;
        } else {
            // 不满足正则
            // 需要提示给用户红色的错误提示信息, 实际上就是让上面的 span 标签重新显示, 也就是将 display:none 的样式设置成 block 即可
            // 将 display 设置成 block
            oUserNameErr.style.display = 'block';// 设置 '用户名不太受欢迎' 显示
            oUserNameRight.style.display = 'none';// 将 '用户名合法' 取消显示
            // 用户名错误, 不能提交表单, 所以需要返回 false
            return false;
        }
    };

    // 2. 验证 密码是否符合规则: 长度 6~12 任意字符
    function checkPassword() {
        // 1. 获取密码的 Input 标签对象
        let oPassword = document.getElementById('password');

        // 2. 获取 value 的值, 即输入框输入的内容
        let userPassword = oPassword.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        let reg = /^.{6,12}$/;

        // 4. 判断用户输入的密码是否满足正则
        let oPwdErr = document.getElementById('password_err');
        if(reg.test(userPassword)) {
            // 满足正则
            oPwdErr.style.display = 'none';
            return true;
        } else {
            // 不满足正则
            oPwdErr.style.display = 'block';
            return false;
        }
    }

    // 3. 验证 手机号是否符合规则: 长度 11, 数字组成, 第一位是1
    function checkTel() {
        // 1. 获取手机号的 Input 标签对象
        let oTel = document.getElementById('tel');

        // 2. 获取 value 的值, 即输入框输入的内容
        let userTel = oTel.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        let reg = /^1[0-9]{10}$/;

        // 4. 判断用户输入的手机号是否满足正则
        let oTelErr = document.getElementById('tel_err');
        if(reg.test(userTel)) {
            // 满足正则
            oTelErr.style.display = 'none';
            return true;
        } else {
            // 不满足正则
            oTelErr.style.display = 'block';
            return false;
        }
    }

    // 4. 表单是否可以提交
   

</script>
</html>

我们可以整体测试一下

3.3.4 表单提交

接下来 , 我们需要先获取到 form 表单

然后执行 form 表单的 onsubmit 方法 , 在里面执行相对应的逻辑

全部代码如下 :

<!-- 文档类型声明标签, 告知浏览器这个页面采取 html 版本来显示页面 -->
<!DOCTYPE html>
<!-- 告诉浏览器这是一个英文网站, 本页面采取英文显示,但也可以书写中文 -->
<html lang="en">

<head>
    <!-- 必须书写, 告知浏览器以 UTF-8 编码表编解码中文, 如果不书写就会乱码 -->
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 标题标签 -->
    <title>欢迎注册</title>
    <link href="css/register.css" rel="stylesheet">
</head>
<body>

<div class="form-div">
    <div class="reg-content">
        <h1>欢迎注册</h1>
        <span>已有帐号?</span> <a href="#">登录</a>
    </div>
    <form id="reg-form" action="#" method="get">

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <!-- 
                        οnblur="checkUsername()" 表示给用户名的输入框绑定离焦事件
                        只要鼠标离开用户名的输入框就会执行, 并且调用 checkUsername() 函数
                    -->
                    <input name="username" type="text" id="username" onblur="checkUsername()">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名不太受欢迎</span>
                    <br>
                    <span id="username_right" class="right_msg" style="display: none;color: green;">用户名合法</span>
                </td>

            </tr>

            <tr>
                <td>密码</td>
                <td class="inputs">
                    <!-- 
                        οnblur="checkPassword()" 表示给用密码的输入框绑定离焦事件
                        只要鼠标离开密码的输入框就会执行, 并且调用 checkPassword() 函数
                    -->
                    <input name="password" type="password" id="password" onblur="checkPassword()">
                    <br>
                    <span id="password_err" class="err_msg" style="display: none">密码格式有误</span>
                </td>
            </tr>


            <tr>
                <td>手机号</td>
                <!-- 
                        οnblur="checkTel()" 表示给用手机号的输入框绑定离焦事件
                        只要鼠标离开手机号的输入框就会执行, 并且调用 checkTel() 函数
                -->
                <td class="inputs"><input name="tel" type="text" id="tel" onblur="checkTel()">
                    <br>
                    <span id="tel_err" class="err_msg" style="display: none">手机号格式有误</span>
                </td>
            </tr>

        </table>

        <div class="buttons">
            <input value="注 册" type="submit" id="reg_btn">
        </div>
        <br class="clear">
    </form>

</div>

</body>
<script>
    // 1. 验证 用户名是否符合规则: 长度 6~12, 单词字符组成
    function checkUsername() {
        // 1. 获取用户名的 Input 标签对象
        let oUserName = document.getElementById('username');

        // 2. 获取 value 的值, 即输入框输入的内容
        // 这个方法我们已经使用多次了, 不清楚可以去查询
        let userNameVal = oUserName.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        // \w 在正则中表示单词字符: [a-zA-Z0-9_]
        let reg = /^\w{6,12}$/;

        // 4. 使用正则对象调用 test 函数来去判断用户输入的用户名是否满足正则
        let oUserNameErr = document.getElementById('username_err');
        let oUserNameRight = document.getElementById('username_right');
        if(reg.test(userNameVal)) {
            // 满足正则
            // 需要提示给用户成功的信息
            oUserNameRight.style.display = 'block';// 设置 '用户名合法' 显示
            oUserNameErr.style.display = 'none';// 将 '用户名不太受欢迎' 取消显示
            return true;
        } else {
            // 不满足正则
            // 需要提示给用户红色的错误提示信息, 实际上就是让上面的 span 标签重新显示, 也就是将 display:none 的样式设置成 block 即可
            // 将 display 设置成 block
            oUserNameErr.style.display = 'block';// 设置 '用户名不太受欢迎' 显示
            oUserNameRight.style.display = 'none';// 将 '用户名合法' 取消显示
            // 用户名错误, 不能提交表单, 所以需要返回 false
            return false;
        }
    };

    // 2. 验证 密码是否符合规则: 长度 6~12 任意字符
    function checkPassword() {
        // 1. 获取密码的 Input 标签对象
        let oPassword = document.getElementById('password');

        // 2. 获取 value 的值, 即输入框输入的内容
        let userPassword = oPassword.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        let reg = /^.{6,12}$/;

        // 4. 判断用户输入的密码是否满足正则
        let oPwdErr = document.getElementById('password_err');
        if(reg.test(userPassword)) {
            // 满足正则
            oPwdErr.style.display = 'none';
            return true;
        } else {
            // 不满足正则
            oPwdErr.style.display = 'block';
            return false;
        }
    }

    // 3. 验证 手机号是否符合规则: 长度 11, 数字组成, 第一位是1
    function checkTel() {
        // 1. 获取手机号的 Input 标签对象
        let oTel = document.getElementById('tel');

        // 2. 获取 value 的值, 即输入框输入的内容
        let userTel = oTel.value;

        // 3. 创建正则对象, 用来约束用户输入的规则
        let reg = /^1[0-9]{10}$/;

        // 4. 判断用户输入的手机号是否满足正则
        let oTelErr = document.getElementById('tel_err');
        if(reg.test(userTel)) {
            // 满足正则
            oTelErr.style.display = 'none';
            return true;
        } else {
            // 不满足正则
            oTelErr.style.display = 'block';
            return false;
        }
    }

    // 4. 表单是否可以提交
    // 分析: 只要用户名、密码、手机号有一个不合法, 就不能提交表单.
    // 必须都满足才能执行 onsubmit 事件
    let oRegForm = document.getElementById('reg-form');
    oRegForm.onsubmit = function() {
        let result = checkUsername() && checkPassword() && checkTel();
        if(result) {
            alert("注册成功");
        } 
        return result;
    }

</script>
</html>

表单验证.zip

我们可以测试一下

四 . Debug 调试

此时输入用户名 , 就会自动到达打断点的位置

我们介绍一下右侧的几个按钮的作用

我们还可以在 Local 位置查看当前所有变量的值

还可以在 watch 中输入自己想看的值

我们同样也可以在控制台查看我们想看的值

我们整体来演示一下


那么 JavaScript 的介绍就到这里了 , 不知道你有掌握多少 .
如果对你有帮助的话 , 还请一键三连~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2122369.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Qt】实现一个小闹钟

widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QPushButton>//按钮类 #include <QLineEdit>//行编辑器 #include <QLabel>//标签类 #include <QTextEdit>//输入框 #include <QTimerEvent>//定时器事件类 #inc…

【Java】SpringCloud中使用set方法报错空指针

前言&#xff1a;今天在交流群中看见了一个空指针报错&#xff0c;想着哪里为空点过去看看为什么赋不上值就行&#xff0c;没想到啪啪打脸了&#xff0c;今天总结一下。 以下是他的RedisTempate注入和方法 可以看到&#xff0c;89行报错空指针。先分析一下&#xff0c; ①赋值…

机器学习:opencv--图像旋转、模版匹配多项

目录 一、图像旋转 1.numpy方法 2.opencv方法 二、模版匹配多项 1.完整代码 2.步骤解析 3.结果 三、图像旋转模版匹配 一、图像旋转 图像旋转有两种方式 1.numpy方法 import cv2 import numpy as npimg cv2.imread(suda.jpg) img cv2.resize(img, (300, 300))# np…

解决Windows Server 2012加密套件过时的问题

给自己网站加了SSL证书后&#xff0c;发现在360极速浏览器浏览时&#xff0c;会显示加密套件已经过时。一直以为是.cn域名的问题&#xff0c;后面才发现是IIS上面加密套件过时的问题。 TLS/SSL (Schannel SSP) 中的密码套件 - Win32 apps | Microsoft Learn 一开始我以为切换到…

力扣518-零钱兑换 II(Java详细题解)

题目链接&#xff1a;518. 零钱兑换 II - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完背包&#xff0c;所以现在的题解都是以背包问题为基础再来写的。 如果大家不懂背包问题的话&am…

【重点】抓取三次握手的数据报文,分析每次握手的交互过程

1、制造三次握手的报文 三次握手是TCP&#xff08;传输控制协议&#xff09;建立连接的过程。它包括以下三个步骤&#xff1a; 1&#xff09;SYN&#xff08;同步&#xff09;&#xff1a;客户端发送一个SYN报文&#xff0c;请求与服务器建立连接。 2&#xff09;SYN-ACK&am…

text2video的step1出错,与纠正

也就是配置RWKV向外提供API访问权;并将openai的api_base改为本地访问地址。 # 设置 OpenAI 的 API 密钥 openai.api_key = "free"#os.getenv(OPENAI_API_KEY) #老版本,过时了,1.2已经不支持了 openai.api_base = "http://127.0.0.1:8000/v1" #在这里设置…

Java入门:08.Java中的static关键字

1 static关键字 可以修饰属性变量&#xff0c;方法和代码段 static修饰的属性称为静态属性或类属性&#xff0c; 在类加载时就在方法区为属性开辟存储空间&#xff0c;无论创建多少个对象&#xff0c;静态属性在内存中只有一份。 可以使用 类名.静态属性 的方式引用 static修饰…

图的基础概念

图和树一样&#xff0c;是一种十分重要的算法思想&#xff0c;是很多算法比如floyd算法&#xff0c;Dijkstra算法等的实现基础 一、节点和边 节点和边是图的基本组成部分&#xff0c;以公交路线图为例&#xff0c;每一个站点相当与图的节点&#xff0c;连接每一个站点的路线相…

【03】深度学习——神经网络原理 | 多层感知机 | 前向传播和反向传播 | 多层感知机代码实现 | 回归问题、分类问题 | 多分类问题代码实现

深度学习 1.神经网络原理1.1神经元模型1.2神经网络结构1.3隐藏层1.3.1激活函数层 1.4输出层1.4.1softmax层 1.5损失函数1.6反向传播 2.多层感知机2.1线性网络的局限性2.2引入非线性2.3多层感知机&#xff08;Multi-Layer Perceptron&#xff0c;MLP&#xff09;2.4激活函数&…

卷轴模式系统源码开发在当今时代的多重益处

随着信息技术的飞速发展&#xff0c;数字化转型已成为各行各业不可逆转的趋势。在这一背景下&#xff0c;卷轴模式系统&#xff08;这里的“卷轴模式”可理解为一种以滚动、分层或模块化展示信息的界面设计方式&#xff0c;类似于古代卷轴展开的过程&#xff0c;但更多地是指其…

2024金砖展 | 蓝卓:“1+2+N”智能企业新架构,赋能全球工业数字化转型

2024金砖国家新工业革命展——工业互联网专题展览作为2024金砖国家新工业革命展聚焦工业互联网的专题展示区域&#xff0c;全面展示工业互联网新技术、新产品、新方案、新应用、新项目、新生态等。 展览时间&#xff1a;2024年9月8日-9月11日 展览地点&#xff1a;厦门国际会展…

FreeRTOS学习记录——持续更新

目录 入门知识&#xff1a; 裸机与FreeRTOS: 裸机&#xff1a; RTOS系统&#xff1a; 基础知识: 任务调度&#xff1a; 分类&#xff1a; 时间片调度&#xff1a; 任务状态&#xff08;四种&#xff09;&#xff1a; 四种状态图片&#xff1a; 入门知识&#xff1a; …

AV1 Bitstream Decoding Process Specification:术语和定义

原文地址&#xff1a;https://aomediacodec.github.io/av1-spec/av1-spec.pdf没有梯子的下载地址&#xff1a;AV1 Bitstream & Decoding Process Specification摘要&#xff1a;这份文档定义了开放媒体联盟&#xff08;Alliance for Open Media&#xff09;AV1视频编解码器…

上海市皮肤病医院引入AcrelEMS-MED平台打造绿色医院

在数字化转型的浪潮中&#xff0c;上海市皮肤病医院再次走在前列&#xff0c;宣布对其能源管理系统进行全面升级&#xff0c;引入AcrelEMS-MED医院能源管理平台&#xff0c;以科技力量推动绿色医院建设&#xff0c;为患者和医护人员打造更加安全、高效、环保的就医与工作环境。…

2024.9.9(极客大挑战 2019]EasySQL,[极客大挑战 2019]Knife)

题目一&#xff1a;极客大挑战 2019]EasySQL 1、点开题目链接&#xff0c;来到下面的界面 2、遇到这样的登录界面&#xff0c;先尝试admin和万能密码&#xff08;1 or 11#&#xff09;&#xff0c;拿到flag 题目二&#xff1a;[极客大挑战 2019]Knife 1、点开链接&#xff0c…

【C++】模板:进阶(仿函数深度剖析)

目录 一.仿函数的概念 二.仿函数的作用 三.模板的非类型模板参数 四.array 五.模板的特化 六.函数模板 七.类模板 1.全特化 2.偏特化 八.模板分离编译 一.仿函数的概念 仿函数本质就是一个类&#xff0c;此类中重载了运算() &#xff0c;因此它使用起来就和函数很像&a…

新160个crackme - 053-devilz KeyGen me#3

运行分析 解压出来4个文件运行程序发现要破解Name和Serial PE分析 32位&#xff0c;petite壳 手动脱壳 使用windows XP虚拟机OD打开程序按2下F8&#xff0c;发现ESP变红&#xff0c;根据ESP定律&#xff0c;在该地址右键 -> HW break下断点 继续按2下F9&#xff0c;来到灰色…

从0到1:中小企业如何用内容营销吸引客户,塑造品牌魅力?

今天咱们来聊聊中小企业如何通过内容营销这把“金钥匙”&#xff0c;打开客户的心门&#xff0c;同时塑造出独特的品牌魅力。别紧张&#xff0c;这其实就是一场精彩的交流盛宴&#xff0c;让我们一起探索其中的奥秘吧&#xff01; 一、内容营销&#xff1a;真诚对话的开始 想象…

OAuth 2.0 授权流程详解与 FastAPI 实现

在现代网络应用中&#xff0c;OAuth 2.0 已成为授权和认证的标准协议。它允许用户将访问权限授予第三方应用&#xff0c;而无需暴露自己的用户名和密码。本文将详细介绍 OAuth 2.0 的常见授权流程&#xff0c;并展示如何在 FastAPI 中实现这些流程。 OAuth 2.0 简介 OAuth 2…