当前位置: 首页 > news >正文

DOM--事件

文章目录

    • 2、事件(核心)
        • 1、事件概述
          • 解绑:
        • 2、事件类型
          • 1、鼠标事件
          • 2、键盘事件。
          • 3、HTML事件。
        • 3、事件对象
          • 1、鼠标的事件对象
          • 2、keycode(键码):
        • 4、其他事件
        • 5、事件中的this

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
事件对象在参数中

相关文章:

  • 这12款idea插件,能让你代码飞起来
  • 基于springboot+vue的新生宿舍管理系统 elementui
  • spring 事务的传播行为
  • 再写一遍的网络流
  • Linux之 如何查看文件是`硬链接`还是`软链接`
  • Anaconda的安装与卸载
  • k8s 集群部署(二)
  • AMS笔记
  • SAP 电商云 Spartacus UI 的 Product Category Navigation UI 实现
  • 【Hive】各种join连接用法
  • 科研试剂mPEG-Lys(MAL)-DBCO,甲氧基聚乙二醇赖氨酸马来酰亚胺二苯并环辛炔
  • pytorch 优化器
  • Elasticsearch(016):es常见的字段映射类型之对象类型(object)
  • 顺丰2023秋招笔试 第二题(C++ 二叉树思想)
  • Docker - 容器的网络模式
  • [case10]使用RSQL实现端到端的动态查询
  • [译] 怎样写一个基础的编译器
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 30秒的PHP代码片段(1)数组 - Array
  • Android 控件背景颜色处理
  • C++类中的特殊成员函数
  • CSS 专业技巧
  • Git 使用集
  • Java Agent 学习笔记
  • mysql 5.6 原生Online DDL解析
  • mysql_config not found
  • node-sass 安装卡在 node scripts/install.js 解决办法
  • Vue 重置组件到初始状态
  • 数组大概知多少
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 中文输入法与React文本输入框的问题与解决方案
  • 回归生活:清理微信公众号
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • # 计算机视觉入门
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)springboot建达集团公司平台 毕业设计 141538
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (蓝桥杯每日一题)love
  • (四)模仿学习-完成后台管理页面查询
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转载)hibernate缓存
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET delegate 委托 、 Event 事件
  • .NET/C# 的字符串暂存池
  • .net下简单快捷的数值高低位切换
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • @ConfigurationProperties注解对数据的自动封装
  • @ModelAttribute注解使用
  • @在php中起什么作用?
  • [2016.7.Test1] T1 三进制异或
  • [Android Studio 权威教程]断点调试和高级调试
  • [Angularjs]ng-select和ng-options
  • [HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页