DOM操作事件语法全解析(GIF动图,代码结合一看就会)

目录

一、事件绑定三要素

1.1  标签对象

1.2  事件类型

1.3  事件处理函数

1.4  事件绑定语法形式

1.4.1  语法形式一

1.4.2  语法形式二

1.4.3  on语法 和 事件监听语法的区别

1.5  事件绑定语法兼容

1.5.1  标准浏览器

1.5.2  低版本IE浏览器

二、事件的删除 

2.1  on语法绑定事件的删除

2.2  事件监听语法的删除

三、默认事件的阻止

3.1  定义

3.2  阻止默认事件

3.3  兼容性

3.3.1  标准浏览器

3.3.2  低版本IE浏览器

四、阻止事件的传播/阻止冒泡事件 

4.1  定义

4.2  阻止事件传播语法

4.3  兼容性 

4.3.1  标准浏览器

4.3.2  低版本IE浏览器

五、 常见的事件类型

5.1  window相关的事件类型

5.2  鼠标相关的事件类型

5.3  键盘的相关事件类型

5.3.1  事件类型

5.3.2  兼容性

5.3.3  注意事项

5.4  表单的相关事件类型

5.5  移动端事件

5.6  特殊事件

六、事件点击中的坐标

6.1  相对于 触发事件的标签对象 左上角的坐标

6.2  相对于 视窗窗口 左上角的坐标

6.3  相对于 HTML页面 左上角的坐标

七、事件对象 event

7.1  定义

7.2  语法

八、事件委托

8.1  定义

8.2  语法

8.3  优点


一、事件绑定三要素

1.1  标签对象

事件源 也就是绑定事件的标签对象

1.2  事件类型

也就是绑定给标签对象的事件的类型,例如“click”等

1.3  事件处理函数

也就是触发事件时执行的函数,是回调函数语法形式,可以是函数名称可以是匿名函数。例如“function(){}”。

1.4  事件绑定语法形式

1.4.1  语法形式一

事件监听标签 对象.addEventListener( 'click' , function(){})

1.4.2  语法形式二

on语法绑定 标签对象.onclick = function(){}

1.4.3  on语法 和 事件监听语法的区别

on语法 是 通过 = 等于赋值 绑定的事件处理函数

            =   等于赋值 本质上执行的是 覆盖赋值

            后赋值的数据会覆盖之前存储的数据

            也就是 on语法 一个 标签对象 相同的事件类型 

            只能 赋值绑定 一个 事件处理函数

            如果 赋值绑定 多个事件处理函数 

            后赋值 的事件处理函数 会 覆盖之间存储的事件处理函数 

            最终 执行 最后赋值个事件处理函数 

代码演示:

<body>
    <div>点击</div>
    <script>
        const oDiv = document.querySelector("div");
        // 第一种语法形式
        oDiv.addEventListener("click",function(){
            console.log("大聪明码农徐");
        })
        // 第二种语法形式
        oDiv.onclick = function(){console.log("大聪明码农徐");}
        // =   等于赋值 本质上执行的是 覆盖赋值
        // 执行 最后赋值个事件处理函数 
        oDiv.onclick = function(){console.log(666666);}
    </script>
</body>

运行结果: 

1.5  事件绑定语法兼容

1.5.1  标准浏览器

标签对象.addEventListener( 'click' , function(){})   

1.5.2  低版本IE浏览器

标签对象.attachEvent('onclick' , function(){});

二、事件的删除 

2.1  on语法绑定事件的删除

    标签对象.on事件类型 = null ;

    标签对象.on事件类型 = function(){} ;

    触发事件时 就没有调用执行的函数程序

    达到删除事件的效果

2.2  事件监听语法的删除

    需要调用专门的删除函数方法

    标签对象.removeEventListener( '事件类型' , 事件处理函数 );

    标签对象.detachEvent( 'on'事件类型 , 事件处理函数);

注意: 使用专门的函数方法 删除绑定的事件处理函数, 只能删除 绑定的函数名称 不能删除 绑定的匿名函数

代码演示:

<body>
    <div>点击</div>
    <script>
        const oDiv = document.querySelector("div");
        // 使用专门的函数方法 删除绑定的事件处理函数
        //  只能删除 绑定的函数名称 不能删除 绑定的匿名函数

        // 定义函数
       function fun(){
        console.log("大聪明码农徐");
       }
        //回调函数调用函数
        oDiv.addEventListener("click",fun);
         // 只能删除 绑定的函数名称
        oDiv.removeEventListener("click",fun);

        // 不能删除 绑定的匿名函数
        // 所以后台输出123456789仍会执行
        oDiv.addEventListener("click",function(){
            console.log(123456789);
        })
        oDiv.removeEventListener("click",function(){
            console.log(123456789);
        })

        oDiv.onclick = function(){console.log("大聪明码农徐");}
// on语法绑定事件的删除
        oDiv.onclick = null;


    </script>
</body>

运行结果:

 

三、默认事件的阻止

3.1  定义

a标签的点击跳转,form标签的点击提交,鼠标右键菜单都属于默认事件

3.2  阻止默认事件

在事件处理函数中定义一个形参 形参名称一般是 e / event

    标签对象.addEventListener('事件类型' , function( e / event ){

        // 阻止默认事件执行

        形参.preventDefault() ;

    })

代码演示:

<body>
    <script>
        // 获取标签对象
        const oBody = document.querySelector("body");
        // contextmenu 鼠标右键点击事件  
        oBody.addEventListener("contextmenu",function(e){
            // 后台输出确保事件触发了
            console.log("鼠标右键已经按下");
            // 正常网页右键点击会有菜单
            // 默认事件阻止后不会有菜单产生
            e.preventDefault() ;
        })
    </script>
</body>

运行结果: 

 

3.3  兼容性

3.3.1  标准浏览器

        e.preventDefault() ;

3.3.2  低版本IE浏览器

        e.returnValue = false;

四、阻止事件的传播/阻止冒泡事件 

4.1  定义

父级标签 和 后代标签 添加了相同类型的事件,后代标签 触发事件 父级标签 也会触发 相同类型的事件,这样的执行原理 称为 事件的传播 / 冒泡事件。

4.2  阻止事件传播语法

标签对象.addEventListener(事件类型, function(e / event){

        e.stopPropagation();

    })

代码演示:

<body>
    <div>
        <h1></h1>
    </div>
    <script>
        // 获取标签对象
        const oDiv = document.querySelector("div");
        const oH = oDiv.querySelector("h1");
        // 给div添加点击事件
        oDiv.addEventListener("click",function(){
            console.log("你点击了一下div标签");
            
        })
        // 给h1添加点击事件
        oH.addEventListener("click",function(e){
            console.log("你点击了一下h1标签");
         // 事件传播阻止
            e.stopPropagation();
        })
    </script>
</body>

 运行结果:

阻止前:点击h1 标签 ,div的点击事件也会触发.

阻止后:点击h1只会执行h1的事件。

4.3  兼容性 

4.3.1  标准浏览器

        e.stopPropagation();

4.3.2  低版本IE浏览器

        e.cancelBubble = true ;

五、 常见的事件类型

5.1  window相关的事件类型

window.addEventListener( 'resize' , function(){} )  浏览器视窗窗口大小监听事件
window.addEventListener( 'scroll' , function(){} )  页面滚动监听事件
window.addEventListener( 'load' , function(){} )    浏览器加载事件
window.open(url地址)  新窗口打开URL链接
window.open(URL地址)关闭当前窗口

document.addEventListener('visibilitychange')

document.visibilityState     查询值为hidden/visible

窗口最小化监听事件

前五个属性在我之前的博客都有详细解释,需要请查看往期博客,这里主要演示最后一种窗口最小化监听事件。

代码演示:

<body>
    <script>
        document.addEventListener("visibilitychange",function(){
            
            console.log(document.visibilityState);
        })
    </script>
</body>

运行结果: 

 

5.2  鼠标相关的事件类型

click          鼠标左键单击

dblclick

鼠标左键双击
contextmenu  鼠标右键单击
mousedown  鼠标按键按下
mouseup  鼠标按键抬起
mouseover  鼠标移入
mouseout    鼠标移出
mouseenter  鼠标移入
mouseleave  鼠标移出

 代码演示:

<body>
    <div></div>
    <script>
        const oDiv = document.querySelector("div");
        oDiv.addEventListener("click",function(){
            console.log("鼠标左键单击");
        })
        oDiv.addEventListener("dblclick",function(){
            console.log("鼠标左键双击");
        })
        oDiv.addEventListener("contextmenu",function(){
            console.log("鼠标右键单击");
        })
        oDiv.addEventListener("mousedown",function(){
            console.log("鼠标按键按下");
        })
        oDiv.addEventListener("mouseup",function(){
            console.log("鼠标按键抬起");
        })
    </script>
</body>

运行结果:

注意: 

mouseover   鼠标移入  mouseout    鼠标移出。经过标签对象边界时触发一次,给当前事件的后代标签也会触发事件。

mouseenter  鼠标移入  mouseleave  鼠标移出。经过标签对象边界时触发一次,给当前标签添加事件后代标签不会触发事件。

代码演示:

<body>
    <div>
        <h1></h1>
    </div>
    <script>
        const oDiv = document.querySelector("div");
        oDiv.addEventListener("mouseover",function(){
            console.log("鼠标移入");
        })
        oDiv.addEventListener("mouseout",function(){
            console.log("鼠标移出");
        })
        oDiv.addEventListener("mouseenter",function(){
            console.log("鼠标移入(后代不会触发)");
        })
        oDiv.addEventListener("mouseleave",function(){
            console.log("鼠标移出(后代不会触发)");
        })

    </script>
</body>

运行结果:

5.3  键盘的相关事件类型

5.3.1  事件类型

keydown    键盘按键按下
keypress    键盘按键按下
keyup      键盘按键抬起
e.keyCode    键盘按键编号
e.altKey
e.ctrlKey
e.shiftKey                                                                                
都是 判断 有没有 按下按键
如果 按下 返回值是 true 
如果 没有按下 返回值是 false

注意:

keydown 和 keypress 的区别,所有的按键都会触发 keydown 事件 有些特殊按键不会触发 keypress 事件。例如 esc ctrl alt shift back等 都不会触发 keypress 事件 

5.3.2  兼容性

低版本的火狐浏览器 使用 
e.which 存储 按键编号 
现在所有的浏览器都是用 
e.keyCode e.which 同时存储 按键编号

5.3.3  注意事项

1,  键盘事件 默认只有可以获取焦点的标签支持
    一般 只是 input标签 和 textarea
    以及 document document.documentElement document.body

2,  div等无法获取焦点的标签 可以通过 事件的抛发 绑定 键盘事件

3,  键盘按下事件 如果一直按住键盘按钮 会 一直触发事件

代码演示:

<body>
    <input type="text">
    <script>
        const oIpt = document.querySelector("input");
        oIpt.addEventListener("keydown",function(){
            console.log("键盘按下了(keydown)");
        })
        oIpt.addEventListener("keypress",function(){
            console.log("键盘按下了(keypress) esc ctrl alt shift back 等 都不会触发 keypress 事件 ");
            
        })
        oIpt.addEventListener("keyup",function(){
            console.log("键盘抬起了");
        })
    </script>
</body>

运行结果:

5.4  表单的相关事件类型

submit表单提交事件        绑定给form标签 点击提交按钮 触发提交事件时触发 提交事件
focus标签获取焦点      标签获取焦点时 触发事件
blur        标签失去焦点        标签失去焦点时 触发事件
change      标签失去焦点同时数据改变       标签失去焦点 并且数据改变时 触发事件
input      输入数据      每次输出数据时都会触发事件

代码演示:

<body>
    <form>
        <input type="text">
        <button>提交</button>
    </form>
    
    <script>
        const oForm = document.querySelector("form");
        const oIpt = document.querySelector("input");
        oIpt.addEventListener("focus",function(){
            //  标签获取焦点时 触发事件
            console.log("获取焦点");
        })
        oIpt.addEventListener("blur",function(){
            // 标签失去焦点时 触发事件
            console.log("失去焦点");
        })
        oIpt.addEventListener("change",function(){
            // 标签失去焦点同时数据改变
            console.log("标签失去焦点 并且数据改变时 触发事件");
        })
        oIpt.addEventListener("input",function(){
            // 每次输出数据时都会触发事件
            console.log("您输入数据了");
        })
    </script>
</body>

运行结果: 

5.5  移动端事件

touchstart  触摸开始
touchend    触摸结束
touchmove  触摸移动

由于博主功力尚浅,暂不能详细解释此类事件,见谅! 

5.6  特殊事件

transitionstart    过渡开始
transitionend      过渡结束
animationstart      动画开始
animationend        动画结束

由于博主功力尚浅,暂不能详细解释此类事件,见谅! 

六、事件点击中的坐标

6.1  相对于 触发事件的标签对象 左上角的坐标

e.offsetX

e.offsetY

 代码演示:

    <script>
        const oDiv = document.querySelector("div");
        oDiv.addEventListener("click",function(e){
            // 相对于 触发事件的标签对象 左上角的坐标
            console.log(e.offsetX);
            console.log(e.offsetY);
        })
    </script>

运行结果:

 

6.2  相对于 视窗窗口 左上角的坐标

e.clientX

e.clientY

代码演示: 

<body>
    <div></div>
    <script>
        const oDiv = document.querySelector("div");
        oDiv.addEventListener("click",function(e){
             // 相对于 视窗窗口
            console.log(e.clientX);
            console.log(e.clientY);
        })
    </script>
</body>

 运行结果:

 

 

6.3  相对于 HTML页面 左上角的坐标

e.pageX

e.pageY

代码展示: 

<body>
    <div></div>
    <script>
        const oDiv = document.querySelector("div");
        oDiv.addEventListener("click",function(e){
            // 相对于 HTML页面 左上角的坐标
            console.log(e.pageX);
            console.log(e.pageY);
        })
    </script>
</body>

 运行结果:

 

七、事件对象 event

7.1  定义

事件处理函数 中 参数 存储的数据数值是 触发事件的对象 相关数据信息

    触发事件的对象 和 绑定事件的的 不一定是同一个对象

    触发事件时 JavaScript程序 自动向 形参中 存储实参 也就是 向 事件对象 中 自动储存 触发事件的标

7.2  语法

事件源.addEventListener( 事件类型 , function( 事件对象 ){

事件对象.target 

})


八、事件委托

8.1  定义

不是直接给标签对象绑定事件,给 父级标签 绑定事件 ,通过 事件对象.target 判断 触发事件的不同的标签对象,执行 不同的函数程序。

8.2  语法

对象对象.target 就是一个 DOM标签对象

对象对象.target.tagName 是 大写英文字符的标签名称

对象对象.target 执行 DOM 操作 判断 点击的是什么标签

8.3  优点

(1)只给一个标签事件添加对象,通过判断执行不同的程序,执行效率更高

(2)更加有利于 动态渲染生成的标签 添加事件

因此 动态渲染生成的标签 使用 事件委托 ,给一直存在的父级 添加 事件 ,通过 事件委托 判断 事件对象.target 是 什么标签 触发什么程序。

<!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>
    <style>
        footer{
            width: 1000px;
            height: 800px;
            background-color: blue;
            margin: auto;
        }
        div{
            width: 800px;
            height: 600px;
            margin: auto;
            background-color: blueviolet;
        }
        h1{
            width: 600px;
            height: 400px;
            margin: auto;
            background-color: red;
        }
        p{
            width: 400px;
            height: 200px;
            margin: auto;
            background-color: pink;
        }
    </style>
</head>
<body>
<footer>
    <div>
        <h1>
            <p></p>
        </h1>
    </div>
</footer>
<script>
    const oFooter = document.querySelector("footer");

    oFooter.addEventListener("click",function(e){
        // 通过事件委托判断点击的标签对象,执行对应的程序
        if(e.target.tagName === "FOOTER"){
            console.log("您点击的是footer");
        }else if(e.target.tagName === "DIV"){
            console.log("您点击的是div");
        }else if(e.target.tagName === "H1"){
            console.log("您点击的是h1");
        }else if(e.target.tagName === "P"){
            console.log("您点击的是p");
        }
    })
</script>
</body>
</html>

运行结果:

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大聪明码农徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值