前端基础----JavaScript(DOM、事件)

目录

1.DOM 

1.1概述

1.2DOM树

1.3核心DOM模型--Document(文档对象)

1.4HTML DOM--针对HTML文档的标准模型

2.事件监听

2.1概述

2.2事件绑定 

2.3常见事件


1.DOM 

1.1概述

DOM:Document Object Model--文档对象模型,是浏览器提供的一套专门用来操作网页内容的功能,可以开发网页特效和实现用户交互

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

  • Document:整个文档对象
  • Element:元素对象
  • Attribute:属性对象
  • Text:文本对象
  • Comment:注释对象

1.2DOM树

将HTML文档以树结构直观的表现出来,这样的树称之为DOM树或文档树

作用:DOM树直观的体现了标签于标签之间的关系 

示例:

 DOM树如下所示:

1.3核心DOM模型--Document(文档对象)

①获取(创建)

在html dom模型中可以使用window对象来获取

window.document

window也可以省略:document

②方法

获取Element对象:

  •     getElementById()    : 根据id属性值获取元素对象。id属性值一般唯一
  •     getElementsByTagName():根据元素名称获取元素对象们。返回值是一个数组
  •     getElementsByClassName():根据Class属性值获取元素对象们。返回值是一个数组
  •     getElementsByName(): 根据name属性值获取元素对象们。返回值是一个数组

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<img id="light" src="../../image/背景.jpg" width="600px" height="300px"> <br>

<div class="cls">山前山后各有风景</div>
<div class="cls">有风无风都很自由</div>

<input type="checkbox" name="hobby"> 游湖
<input type="checkbox" name="hobby"> 听雨
<input type="checkbox" name="hobby"> 观亭
<br>

<script>
    //1.getElementById:根据id属性获取,返回一个Element对象
    var img = document.getElementById("light");
    alert(img);

    let divs = document.getElementsByTagName("div");
    // alert(divs.length)
    for (let i = 0; i < divs.length;i++) {
        alert(divs[i]);
    }

    let inputs = document.getElementsByName("hobby");
    for (let i = 0; i < inputs.length; i++) {
        alert(inputs[i]);
    }

    var clss = document.getElementsByClassName("cls");
    for (let i = 0; i < clss.length; i++) {
        alert(clss[i]);
    }

    //更换图片
    let img = document.getElementById("light");
    img.src = "../../image/banner_1.jpg";

    //使用DOM控制HTML的样式
    /*
        style:设置元素css样式
        innerHTML:设置元素内容
    */
    let divs = document.getElementsByTagName("div");

    for (let i = 0; i < divs.length;i++) {
        divs[i].style.color = "red";
        divs[i].innerHTML = "踏上旅途";
    }

    //将多选框的内容全部设置为选中
    let inputs = document.getElementsByName("hobby");
    for (let i = 0; i < inputs.length; i++) {
        inputs[i].checked = true;
    }

</script>

</body>
</html>

创建其他DOM对象:

  •     createAttribute(name)  创建拥有指定名称的属性节点,并返回新的 Attr 对象。
  •     createComment()  创建注释节点。
  •     createElement()  创建元素节点。
  •     createTextNode()  创建文本节点。

③属性

Element:元素对象
    1. 获取/创建:通过document来获取和创建
    2. 方法:
        1. removeAttribute():删除属性
        2. setAttribute():设置属性

Node:节点对象,其他5个的父对象
    特点:所有dom对象都可以被认为是一个节点
    方法:
        CRUD dom树:
            appendChild():向节点的子节点列表的结尾添加新的子节点。
            removeChild()    :删除(并返回)当前节点的指定子节点。
            replaceChild():用新节点替换一个子节点。
    属性:
        parentNode 返回节点的父节点。

1.4HTML DOM--针对HTML文档的标准模型

将HTML的标签封装成对象 

①标签体的设置和获取:innerHTML

例如:divs.innerHTML = "踏上旅途";

②HTML元素对象的属性依然可以使用

③控制元素样式(css功能)

 1. 使用元素的style属性来设置
    如:
        //修改样式方式
        div1.style.border = "1px solid red";
        div1.style.width = "200px";
        //font-size--> fontSize(‘-s’-->S)
        div1.style.fontSize = "20px";

2. 提前定义好类选择器的样式,通过元素的className属性来设置其class属性值。

2.事件

2.1概述

事件:HTML事件是发生在HTML元素上的”事情“。比如按钮被点击、鼠标移动到元素上。

事件监听:JavaScript可以在事件被侦测到时执行代码。

2.2事件对象

事件对象里有事件触发时的相关信息

如:鼠标点击事件中,事件对象就存了鼠标点在那个位置的信息

使用场景:①可以判断用户按下哪个键,比如按下回车可以发布评论

                  ②可以判断鼠标点击那个元素,从而做出相应的操作

2.2.1获取事件对象

方法:addEventListener() 

将指定的监听器注册到对象上,当该对象触发指定的事件时,指定的回调函数就会被执行。

 

常用的属性:

 

在事件绑定的回调函数第一个参数就是事件对象,一般命名为Event、ev、e

这里的e就是事件对象 

2.3事件绑定 

①通过HTML标签中的事件属性进行绑定

②通过DOM元素属性绑定

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input type="button" value="点我" onclick="on()"> <br>
<input type="button" value="再点我" id="btn">

<script>
    //1.通过HTML标签中的事件属性进行绑定
    function on(){
        alert("我被点了")
    }

    //2.通过DOM元素属性绑定
    document.getElementById("btn").onclick = function (){
        alert("你还真点啊!!!");
    }
</script>

</body>
</html>

 

 

2.4常见事件

  ①点击事件

onclick:单击事件

ondblclick:双击事件

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

<div class="buttons">
    <img src="../../image/背景.jpg" width="600px" height="280px" id="img">
    <input type="button" value="单击" class="button" id="but">

    <img src="../../image/头像1.png" width="234px" height="231px" id="img2">
    <input type="button" value="双击" class="button" id="but2">
</div>

<script>
    let imgUrl = document.getElementById("img");
    let imgUrl2 = document.getElementById("img2");

    //单击切换图片
    document.getElementById("but").onclick = function () {
        imgUrl.src = "../../image/banner_1.jpg";
    }

    //双击切换图片
    document.getElementById("but2").ondblclick = function () {
        imgUrl2.src = "../../image/头像2.png";
    }

</script>
</body>
</html>

 此时根据页面提示,可以切换为设置好的图片 

②焦点事件

onblur:失去焦点

onfocus:元素获得焦点

③加载事件

onload:一张页面或一幅图像完成加载。 

④鼠标事件

1. onmousedown    鼠标按钮被按下。
2. onmouseup    鼠标按键被松开。
3. onmousemove    鼠标被移动。
4. onmouseover    鼠标移到某元素之上。
5. onmouseout    鼠标从某元素移开。

⑤键盘事件

1. onkeydown    某个键盘按键被按下。    
2. onkeyup        某个键盘按键被松开。
3. onkeypress    某个键盘按键被按下并松开。 

 ⑥选择和改变

1. onchange    域的内容被改变。 
2. onselect    文本被选中。

⑦表单事件

1. onsubmit    确认按钮被点击。
        方法返回的是false就可以阻止表单提交
2. onreset    重置按钮被点击。 

案例:表单验证--对用户输入的注册信息进行验证

要求:
    1.当输入框失去焦点时,验证输入内容是否符合要求
    2.当点击注册按钮时,判断所有输入框的内容是否都符合要求,如果不符合则阻止表单提交

代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>注册</title>
    <link rel="stylesheet" href="../css/register.css">
</head>
<body>

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

        <table>

            <tr>
                <td>用户名</td>
                <td class="inputs">
                    <input type="text" name="username" id="username">
                    <br>
                    <span id="username_err" class="err_msg" style="display: none">用户名错误</span>
                </td>
            </tr>

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

            <tr>
                <td>手机号</td>
                <td class="inputs">
                    <input type="text" name="phone" id="phone">
                    <br>
                    <span id="phone_err" class="err_msg" style="display: none">手机号格式错误</span>
                </td>
            </tr>
        </table>

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

    </form>
</div>

<script>
    //1.验证用户名是否符合规范
    //1.1获取用户名的输入框
    var usernameInput = document.getElementById("username");

    //1.2绑定onblur事件,失去焦点
    usernameInput.onblur = checkUsername;

        function checkUsername() {
        //1.3获取用户输入的用户名
        var username = usernameInput.value.trim();
        // alert(usernameValue);

        //1.4判断用户名是否符合规则:长度4~6
            var flag = username.length >= 4 && username.length <= 6 || username.length == 0;
        if (flag){
            //符合规则 display='none'--隐藏整个元素
            document.getElementById("username_err").style.display = 'none';
        } else {
            //不符合规则 display--设置或返回元素的显示类型。
            document.getElementById("username_err").style.display = '';
        }

        return flag;
    }

    //2.验证密码是否符合规范
    //2.1获取密码的输入框
    var passwordInput = document.getElementById("password");

    //2.2绑定onblur事件,失去焦点
    passwordInput.onblur = checkPassword;

        function checkPassword() {
        //2.3获取用户输入的密码
        var password = passwordInput.value.trim();
        // alert(passwordValue);

        //2.4判断密码是否符合规则:长度4~6
        let flag = password.length >= 4 && password.length <= 6 || password.length == 0;
        if (flag) {
            //符合规则 display='none'--隐藏整个元素
            document.getElementById("password_err").style.display = 'none';
        } else {
            //不符合规则 display--设置或返回元素的显示类型。
            document.getElementById("password_err").style.display = '';
        }

        return flag;
    }

    //3.验证手机号是否符合规范
    //3.1获取手机号的输入框
    var phoneInput = document.getElementById("phone");

    //3.2绑定onblur事件,失去焦点
    phoneInput.onblur = checkPhone;

        function checkPhone() {
        //3.3获取用户输入的手机号
        var phone = phoneInput.value.trim();

        // alert(phoneValue);

        //3.4判断手机号是否符合规则:长度4~6
            let flag = phone.length == 11 || phone.length == 0;
        if (flag) {
            //符合规则 display='none'--隐藏整个元素
            document.getElementById("phone_err").style.display = 'none';
        } else {
            //不符合规则 display--设置或返回元素的显示类型。
            document.getElementById("phone_err").style.display = '';
        }

        return flag;
    }

    //1.获取表单对象
    let regForm = document.getElementById("reg-from");
    //2.绑定onsubmit事件
    regForm.onsubmit = function (){
        //判断每一个表达项是否符合要求
        let flag = checkUsername()&&checkPassword()&&checkPhone();
        if (flag == false) {
            alert("格式有误,请按要求进行注册")
        }
        return flag;
    }

</script>

</body>
</html>

2.5事件流

概念:事件完整执行过程中的流动路径

事件流分为两个阶段:事件捕获和事件冒泡

2.5.1事件捕获

概念:从DOM的根元素开始去执行对应的事件,从父到子

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .father{
            width: 200px;
            height: 200px;
            background-color: #50afeb;
        }
        .son{
            width: 100px;
            height: 100px;
            background-color: #333333;
        }
    </style>
</head>
<body>

    <div class="father">
        <div class="son"></div>
    </div>

    <script>
        let fa = document.querySelector('.father');
        let son = document.querySelector('.son');

        fa.addEventListener('click',function (){
            alert("父元素")
        },true)
        son.addEventListener('click',function (e){
            alert("子元素")
        },true)
    </script>
</body>
</html>

效果展示:

 

可以看到点击子元素后,浏览器提示框先弹出父元素,在弹出子元素。这样的过程就是事件捕获。

2.5.2事件冒泡

概念:当一个元素的事件被触发时,同样的事件将会在该元素的所有祖先元素中依次被触发;也就是当一个元素触发事件后,会依次向上调用所有的父级元素的同名事件

事件冒泡是默认存在的,因为addEventListener() 的第三个参数就默认为false

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .father{
            width: 200px;
            height: 200px;
            background-color: #50afeb;
        }
        .son{
            width: 100px;
            height: 100px;
            background-color: #333333;
        }
    </style>
</head>
<body>

    <div class="father">
        <div class="son"></div>
    </div>

    <script>
        let fa = document.querySelector('.father');
        let son = document.querySelector('.son');

        fa.addEventListener('click',function (){
            alert("父元素")
        })
        son.addEventListener('click',function (e){
            alert("子元素")
        })
    </script>
</body>
</html>

效果如下所示:

 

点击子元素后,浏览器提示框先弹出子元素,在弹出父元素,像水底的泡泡一样逐渐向上浮 ,这个过程就是事件冒泡

2.5.3阻止事件冒泡

大多数时候,我们不需要事件一级一级向上传递,所以需要阻止冒泡的发生

①拿到需要阻止冒泡的事件对象

②使用方法stopPropagation()

son.addEventListener('click',function (e){
    alert("子元素")
    // 阻止事件冒泡
    e.stopPropagation()
})
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值