DOM--事件

2、事件(核心)

1、事件概述

事件:页面上的元素在某种状态(浏览器实现的)达成时,要执行的提前设定好程序,称之为事件句柄,简称事件。

三要素:

  1. 事件源
  2. 事件类型
  3. 事件处理程序

事件的绑定方式(三种):

  • 行内式(两种写法):

1、直接在时间里面写处理程序

<div class='box' onclick='console.log('666666')'>点我</div>

2、调用外面的事件程序。

<div class='box' onclick='javaScript:myconsole.mylog()'>点我</div>

//<div class='box' οnclick='myconsole.mylog()'>点我</div>

    
<script>
    var myconsole={
        mylog:()=>{
            console.log('666666');
        }
    }
</script>
  • 属性绑定
<style>
    .fa {
        width: 100px;
        height: 100px;
        background-color: pink;

    }
</style>    


<div class="fa">点我变色</div>
<script>
    var fa = document.querySelector('.fa');
    fa.onclick = function () {
        fa.style.backgroundColor = 'hotpink';
    }
</script>

只能绑定一个处理程序,后面的会覆盖前面的效果

  • 给元素添加一个事件监听器(尽量使用这种)

    addEventListener( )-----异步非阻塞函数

<style>
    div {
        width: 100px;
        height: 100px;
        background-color: pink;
    }
</style>

<div>点我</div>

<script>
    var box = document.querySelector('div');
    box.addEventListener('click', function () {
        box.style.backgroundColor = 'blue';
        console.log('111111');
    })
    box.addEventListener('click', function () {
        box.style.backgroundColor = 'green';
        console.log('2222');

    })
</script>

点击一次后:打印11111 和2222,但是div颜色直接变成green。

IE浏览器的事件绑定(了解):attachEvent

box.attachEvent('click', function () {
    console.log(3333);
})

兼容:

box.adde = box.addEventListener || box.attachEvent;
box.adde('click', function () {
    console.log(44444);
});
解绑:

解绑情况:强红包,点一次就不能点了。

  • 属性、行内解绑
box.onclick=null;
  • 监听解绑:里面必须存在两个属性,第一个表示事件类型,第二个表示解绑函数。
box.removeEventListener('click',fn1);  //绑多次,解绑对应函数fn1
2、事件类型
1、鼠标事件
鼠标事件描述
click单击鼠标按钮时触发;
dblclick当用户双击主鼠标按钮时触发(鼠标第一次按下到第二次松开,鼠标指针在被选区域内部);
mousedown当用户按下鼠标还未弹起时触发;
mouseup当用户释放鼠标按钮时触发;
mouseover当鼠标移到某个元素上方时触发;
mouseout当鼠标移出某个元素上方时触发;
mousemove当鼠标指针在元素上移动时触发;(拖拽)
mouseenter在鼠标光标从元素外部首次移动至元素范围内触发,不参与冒泡;
mouseleave鼠标移出;

校招考试:事件链冒泡来记,父元素进入子元素触发吗?

onmouseover、onmouseout子元素会影响到父元素, 而onmouseenter和onmouseleave 子元素不会影响父元素

2、键盘事件。
键盘事件描述
keydown当用户按下键盘上任意键时触发,如果按住不放,会重复触发;
keyup当用户释放键盘上的键触发;
keypress当用户按下键盘上的字符键时触发,如果按住不放,会重复触发;
3、HTML事件。
HTML事件描述
load当页面完全加载后在window上面触发,浏览器加载完毕:五大BOM的功能加载完毕后,或当框架集加载完毕后在框架集上触发;
unload当页面完全卸载后在window上面触发,或当框架集卸载后在框架集上触发;
select当用户选择文本框(input或textarea)中的一个或多个字符触发;
change当文本框(input或textarea)内容改变且失去焦点后触发;
input输入;和keydown的区别是,输入内容了就触发了,而keydown必须是键盘输入才触发。
focus当页面或者元素获得焦点时在window及相关元素上面触发;
blur当页面或元素失去焦点时在window及相关元素上触发;
3、事件对象
1、鼠标的事件对象
鼠标的事件对象描述
clientX返回鼠标相当于浏览器窗口的x轴坐标
clientY返回鼠标相当于浏览器窗口的y轴坐标
pageX返回鼠标相当于整个网页文档的x轴坐标
pageY返回鼠标相当于整个网页文档的y轴坐标
screenX返回鼠标相当于屏幕的x轴坐标
screenY返回鼠标相当于屏幕的y轴坐标
altKey鼠标事件发生时,是否按下alt键,返回一个布尔
ctrlKey鼠标事件发生时,是否按下ctrl键,返回一个布尔
metaKey鼠标事件发生时,是否按下windows/commond键,返回一个布尔
movementX,movementY返回一个位移值,单位为像素,表示当前位置与上一个
mousemove事件之间的距离
offsetX/offsetY相对于元素自己的x,y 跟他是否是定位的元素无关
2、keycode(键码):

左上右下:37 38 39 40

enter键:13

案例:

  1. 遍地生花:鼠标点下后出现一朵花:

    <style>
        div {
            width: 100px;
            height: 100px;
            position: absolute;
            top: 0;
            left: 0;
    
        }
    
        img {
            width: 100%;
            height: 100%;
        }
    </style>
    
    <body>
        <div class="box"></div>
    
        <script>
            document.addEventListener('mousedown', function (e) {
    
                //动态生成盒子来装图片
                var box = document.createElement('div');
                var body = document.body;
                body.appendChild(box);
                //pageX,pageY得到鼠标距离文档的x,y坐标,这里要注意的是:设置给盒子偏移量时top取y坐标的值,left取x坐标的值,这里再减去盒子宽高的一半,使鼠标位于花朵的中间;
                box.style.top = (e.pageY - 50) + 'px';
                box.style.left = (e.pageX - 50) + 'px';
                //动态生成图片
                var img = document.createElement('img');
                box.appendChild(img);
                img.src = './image/flower2.png';
            })
        </script>
    </body>
    
    </html>
    
  2. 鼠标拖拽:盒子随鼠标变动位置。

    <div class="login">点击拖拽我</div>
    
    <script>
        var div = document.querySelector('div');
    
        div.addEventListener('mousedown', function (e) {
            var x = e.pageX - div.offsetLeft;
            var y = e.pageY - div.offsetTop;
    
            document.addEventListener('mousemove', move);
    
            function move(e) {
                div.style.left = (e.pageX - x) < 0 ? 0 : (e.pageX - x) + 'px';
                div.style.top = (e.pageY - y) < 0 ? 0 : (e.pageY - y) + 'px';
            }
    
            document.addEventListener('mouseup', function () {
                document.removeEventListener('mousemove', move);
            })
        })
    </script>
    
4、其他事件

1、scroll
scroll:常用于绑定在window对象上,滚动鼠标时触发
window.οnscrοll=func

wheel : 鼠标的滚动。

2、load
load:等待网页资源下载完毕再执行。

img.onload 图片节点加载完毕不会调用 要资源加载完毕就会调用。

window.onload:等待页面所有资源下载完成才执行,包括图片资源的下载,所以它是最慢的。

网页加载顺序:url–>下载页面–>domTree,cssTree并行–>渲染树renderTree–>绘制页面–>继续下载图片资源,下载完毕再放到页面上去onload。
domTree:domTree的形成,是先把元素翻译成的节点对象挂到 domTree上去,再把属性 img_src放到渲染树上去

每年都考的面试题:用户从地址栏输入网址按下回车到页面展示出来 整个过程发生了什么?
答案:前端=>网络=>后端=>网络=>前端 这4步都得分析

5、事件中的this

1.行内:

<button type="button" onclick="fn(this)">xxx</button>
<script type="text/javascript">
		function fn (e) {
			console.log(e,this)//btn和window
		}
</script>

行内绑定时 行内的环境对象是btn 函数的调用者是window 无法获取事件对象

2.元素属性:
this指向的是dom元素本身
事件对象在参数中

3.addEventListener:
this指向的是dom元素本身
事件对象在参数中

4.attachEvent:
this指向 window
事件对象在参数中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值