js事件

文档碎片

1.创建50W个节点,添加到页面上。
50W个创建 50W次插入
2.先创建50W个节点,将50W节点插入到一个节点中,再将这个节点插入到页面中。

JS事件

1.什么是事件
一件事情发生了,对其进行处理或者响应。
2. 事件的三要素
事件源,事件类型,事件处理
比如:点击右上角的X,页面关闭。 事件源:X,事件类型:点击 事件处理:页面关闭。
谁引发的后续事件,谁就是事件源。

事件源:DOM节点(一般为元素节点)
事件类型
事件处理 函数(代码块)

事件类型:
1.鼠标事件
2.键盘事件
3.浏览器事件
4.表单事件

1.鼠标事件

click == 鼠标左键单击

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onclick = function() {
                console.log("鼠标左键单击");
            }
        }
    </script>

dbclick == 鼠标左键双击

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.ondbclick  = function() {
                console.log("鼠标左键双击");
            }
        }
    </script>

contextmenu == 鼠标右键单击

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.oncontextmenu   = function() {
                console.log("鼠标右键单击");
            }
        }
    </script>

mousewheel == 鼠标滚动

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmousewheel  = function() {
                console.log("鼠标滚动");
            }
        }
    </script>

mousedown == 鼠标单击事件 不管是左键还是右键,还是滚动都可以触发

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmousedown = function() {
                console.log("鼠标点击");
            }
        }
    </script>

button:用来表示咱们按下的是哪一个按键
0 左键
1 滚轮
2 右键

 <body>
    <div id="box"></div>
</body>
    <script>
        window.onload = function() {
             var box = document.getElementById("box");
            box.onmousedown = function(event) {
                var event = event || window.event;
                console.log(event.button);

                if (event.button == 0) {
                    console.log("鼠标左键按下");

                } else if (event.button == 1) {
                    console.log("鼠标滚轮按下");

                } else if (event.button == 2) {
                    console.log("鼠标右键按下");

                }
            }
        }
    </script>

在这里插入图片描述

mouseup == 鼠标抬起

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmouseup = function() {
                console.log("鼠标抬起");
            }
        }
    </script>

mousemove == 鼠标移动

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmousemove  = function() {
                console.log("鼠标移动");
            }
        }
    </script>

mouseover、mouseout会引发事件传播
mouseover == 鼠标移入

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmouseover = function() {
                console.log("鼠标移入");
            }
        }
    </script>

mouseout == 鼠标移出

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmouseout  = function() {
                console.log("鼠标移出");
            }
        }
    </script>

mouseenter == 鼠标移入

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmouseenter  = function() {
                console.log("鼠标移入");
            }
        }
    </script>

mouseleave == 鼠标移出

    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onmouseleave  = function() {
                console.log("鼠标移出");
            }
        }
    </script>

2.键盘事件

不是所有的元素都能触发
表单元素(选中效果),document ,window

keydown
键盘按下


<body>
    <input type="text">
</body>
<script>
        window.onload = function() {
            var inp = document.querySelector("input");
            inp.onkeydown = function(event) {
                var event = event || window.event;
                console.log("键盘按下");

            }
        }
    </script>

在这里插入图片描述

keypress
键盘按下
在文本框中输入的内容必须与你按下的键是一致的


<body>
    <input type="text">
</body>
<script>
        window.onload = function() {
            var inp = document.querySelector("input");
            inp.onkeypress = function(event) {
                var event = event || window.event;
                console.log("键盘按下");

            }
        }
    </script>

在这里插入图片描述

keyup
键盘抬起


<body>
    <input type="text">
</body>
<script>
        window.onload = function() {
            var inp = document.querySelector("input");
            inp.onkeyup = function(event) {
                var event = event || window.event;
                console.log("键盘抬起");
            }
        }
    </script>

在这里插入图片描述

3.浏览器事件

又称window事件

load 页面加载完毕后执行函数体

<script>
        window.onresize = function() {
            console.log("hhh");
        }
    </script>

scroll 页面滚动

<script>
		//当页面滚动时执行函数体
        window.onresize = function() {
            console.log("hhh");
        }
    </script>

resize 窗口尺寸改变

<script>
		//浏览器窗口大小发生变化时执行函数体
        window.onresize = function() {
            console.log("hhh");
        }
    </script>

offline 网络断开

<script>
		//浏览器断网时执行函数体
        window.onoffline = function() {
            console.log("hhh");
        }
    </script>

online 网络恢复

<script>
		//浏览器网络恢复时执行函数体
        window.ononline = function() {
            console.log("hhh");
        }
    </script>

4.表单事件

表单事件:
失去焦点
blur
获取焦点
focus
提交:
submit
重置:
reset
表单事件主要是表单元素和form标签的
change 表单内容发生改变时,而且已经失去焦点时触发。

<body>
    <input type="text">
</body>
<script>
        window.onload = function() {
            var inp = document.querySelector("input");
            inp.onchange = function() {
                console.log(inp.value);

            }
        }
    </script>

input 表单输入事件

<body>
    <input type="text">
</body>
<script>
        window.onload = function() {
            var inp = document.querySelector("input");
            inp.oninput = function() {
                console.log(inp.value);

            }
        }
    </script>

在这里插入图片描述

focus 获取焦点

<body>
    <input type="text">
</body>
<script>
        window.onload = function() {
            var inp = document.querySelector("input");
            inp.onfocus  = function() {
                console.log(inp.value);

            }
        }
    </script>

在这里插入图片描述

blur 失去焦点

<body>
    <input type="text">
</body>
<script>
        window.onload = function() {
            var inp = document.querySelector("input");
            inp.onblur   = function() {
                console.log(inp.value);

            }
        }
    </script>

在这里插入图片描述

submit 表单提交(submit与reset是针对表单内容的操作,所以事件源都是表单)

<body>
    <form>
        <input type="text">
        <input type="submit" value="提交">
    </form>
</body>
<script>
        window.onload = function() {
            var form = document.querySelector("form");
            form.onsubmit = function() {
                alert("表单提交了")
            }
        }
    </script>

reset 表单重置

<body>
    <form>
        <input type="text">
        <input type="reset" value="重置">
    </form>
</body>
<script>
        window.onload = function() {
            var form = document.querySelector("form");
            form.onreset= function() {
                alert("表单重置了")
            }
        }
    </script>

事件传播细化

分类:事件捕获、事件冒泡

  • 捕获:dom事件触发时,浏览器会从根节点开始由外到内进行事件传播(点击了子元素,如果父元素通过事件捕获方式注册了对应的事件的话,会先触发父元素绑定的事件)
  • 冒泡:与事件捕获相反,浏览器会从子节点开始由内到外进行事件传播
<body>
    <div id="div1">
        <h1 id="div2">
            <div id="div3"></div>
        </h1>
    </div>
</body>
 <script>
        window.onload = function() {
            var boxs = document.getElementsByTagName("div");
            for (var i = 0; i < boxs.length; i++) {
                boxs[i].index = i + 1;
                boxs[i].onclick = function(event) {
                    var event = event || window.event;
                    alert(this.getAttribute("id"));
                    //阻止事件传播,加上以下代码事件传播就阻止了
                    // if (event.stopPropagation) {
                    //     event.stopPropagation();
                    // } else {
                    //     event.cancelBubble = true;
                    // }
                }
            }
        }
    </script>

首先获取是div的元素节点
在标准浏览器中:
event.stopPropagation();
【注意】 书写在事件处理函数中
在IE低版本中:
event.cancelBubble = true;
兼容写法:

  if (event.stopPropagation) {
       event.stopPropagation();
   } else {
       event.cancelBubble = true;
   }

循环绑定事件:
1.资源浪费
2.新增的节点没有绑定事件,需要手动再绑定一次。

事件绑定三种方式

1.行内式

在标签中直接通过on+事件类型 属性 去绑定事件
1.一个方法需要多次引用,而且不符合 行为、结构、样式 相分离的原则。
2.当js的函数名更改,html标签内的方法也需要更改。
【注】使用行内式绑定事件时,JS要使用内嵌式,位置没有限制,但是绑定的事件不能是HTML页面加载完之后再执行JS(绑定事件不能写在window.οnlοad=function(){中)

<body>
    <div id="box" onclick="show()">点我一下</div>

</body>
<script>
        function show() {
            alert("我被点击了")
        }
    </script>

2.内联式

优:符合 行为、结构、样式 相分离的原则
缺:只能绑定一个同类事件
(1)直接绑定匿名函数

<body>
    <div id="box">点我一下</div>
</body>
<script>
        window.onload = function() {
        var box = document.getElementById("box");
        box.onclick = function() {
                    alert("我被点击了")
                }
         }
    </script>

(2)先定义函数,再去绑定

<body>
    <div id="box">点我一下</div>
</body>
<script>
        window.onload = function() {
        var box = document.getElementById("box");
        function change() {
               alert("我被点击了")
           }
         box.onclick = change;
    </script>

3.监听 addEventListener

优:符合 行为、结构、样式 相分离的原则,可以绑定多个同类事件
多个事件处理函数执行顺序是按照绑定顺序来的,先绑定先执行
语法:

事件源.addEventListener("事件名" , "事件处理函数" , ["布尔值"]);
//布尔值可选,为false 事件冒泡           true   事件捕获  
//阻止默认事件preventDefault()
//阻止事件冒泡stopPropagation()

在IE低版本不支持

<body>
    <div id="box">点我一下</div>
</body>
<script>
        window.onload = function() {
        var box = document.getElementById("box");
        function change() {
               alert("我被点击了")
           }
          function change1() {
                alert("我又被点击了")
            }
          box.addEventListener("click", change1);
          box.addEventListener("click", change);
    </script>

attachEvent()
IE低版本支持
语法:事件源.attachEvent(“on+事件类型”,事件处理函数);
多个事件处理函数的执行顺序是按照绑定顺序的倒序来的
先绑定后执行
对于非监听方式,可以直接将null赋值。

对于监听方式绑定
标准浏览器
removeEventListener(“事件类型”,事件处理函数);
【注意】 如果你想要解绑事件,那么你在绑定事件时,一定要将函数单独定义。使用函数名的方式去绑定事件。

IE低版本
detachEvent(“on+事件类型”,事件处理函数);
对象可以看成 属性的集合 函数也是属性的一种。(属性和函数的集合)
事件对象主要包含一些事件的信息。

函数事件对象

元素节点.on+事件类型 = 匿名函数;

事件对象的产生:在事件绑定完成后,就自动生成了一个事件对象。

事件绑定函数,因为不是在代码中直接调用函数,所以没有办法直接传参.
浏览器会给咱们一个默认的参数,这个参数就是事件对象。

<body>
    <div id="box">点我一下</div>
</body>
<script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onclick = function(event) {
                console.log(event);

            }
        }
    </script>

在这里插入图片描述

获取事件对象:
在标准浏览器中。
直接在事件处理函数上定义一个形参。
会在事件触发的时候,由浏览器自动传递实参。

IE低版本
window.event
在标准浏览器下也可以使用

兼容写法:

 var event = event || window.event;

鼠标事件对象

属性:
button:用来表示咱们按下的是哪一个按键
0 左键
1 滚轮
2 右键

获取当前鼠标的位置

(原点不同)
clienX 可视窗口的左上角为原点
clienY
pageX 整个页面的左上角为原点
pageY

 	<style>
        body {
            width: 2000px;
            height: 2000px;
        }
        
        #box {
            width: 200px;
            height: 200px;
            background-color: teal;
        }
    </style>
    <body>
    <div id="box"></div>
	</body>
    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onclick = function(event) {
                console.log("clientX" + event.clientX);
                console.log("clientY" + event.clientY);
                console.log("pageX" + event.pageX);
                console.log("pageY" + event.pageY);
            }
        }
    </script>

在这里插入图片描述

screenX 电脑屏幕的左上角为原点
screenY
offsetX 以事件触发的元素为原点
offsetY

 	<style>
        body {
            width: 2000px;
            height: 2000px;
        }
        
        #box {
            width: 200px;
            height: 200px;
            background-color: teal;
        }
    </style>
    <body>
    <div id="box"></div>
	</body>
    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onclick = function(event) {
                console.log("screenX" + event.screenX);
                console.log("clientY" + event.screenY);
                console.log("offsetX " + event.offsetX);
                console.log("offsetY " + event.offsetY);
            }
        }
    </script>

在这里插入图片描述

获取元素尺寸

元素的占地面积
(宽高+内边距+边框) IE盒模型 设置的宽高就是元素的占地尺寸

offsetWidth
offsetHeight
元素的内容+内边距+边框

clientWidth
clientHeight
元素的内容 + 内边距

 	<style>
        body {
            width: 2000px;
            height: 2000px;
        }
        
        #box {
            width: 200px;
            height: 200px;
            background-color: teal;
            border: 10px solid burlywood;
            margin: 100px;
            padding: 40px;
        }
    </style>
    <body>
    <div id="box"></div>
	</body>
    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onclick = function(event) {
                console.log("offsetWidth " + box.offsetWidth);
                console.log("offsetHeight" + box.offsetHeight);
                console.log("clientWidth " + box.clientWidth);
                console.log("clientHeight " + box.clientHeight);
            }
        }
    </script>

在这里插入图片描述

一个元素对于参考系的坐标位置。
offsetParent
语法:元素.offsetParent
作用:拿到该元素获取偏移量时的参考父级
默认以body为参考系,如果父辈里有定位属性,则获取该父辈元素。

offsetLeft offsetTop
语法:元素.offsetLeft 元素.offsetTop
作用:拿到元素相对于参考系的相对偏移量。

 	<style>
        body {
            width: 2000px;
            height: 2000px;
        }
        
        #box {
            width: 200px;
            height: 200px;
            background-color: teal;
            border: 10px solid burlywood;
            margin: 100px;
            padding: 40px;
        }
    </style>
    <body>
    <div id="index">
        <div id="box"></div>
    </div>
	</body>
    <script>
        window.onload = function() {
            var box = document.getElementById("box");
            box.onclick = function(event) {
                 console.log("offsetLeft  " + box.offsetLeft);
                console.log("offsetTop " + box.offsetTop);
                console.log("offsetParent " + box.offsetParent);
            }
        }
    </script>

在这里插入图片描述

BOM
innerWidth
innerHeight

DOM 文档 html的元素尺寸
document.documentElement.clientWidth
document.documentElement.clientHeight

键盘事件对象

判断你按下的是哪个键

属性:
key:你按下的是哪个键 区分大小写。
在IE低版本不适用

<script>
        window.onkeydown = function(event) {
            console.log(event.key);

        }
    </script>

在这里插入图片描述

keycode:
以编码格式返回 不区分大小写。
空格 32
回车(Enter) 13

<script>
        window.onkeydown = function(event) {
            console.log(event.keyCode);

        }
    </script>

在火狐低版本使用which属性。

尽量用keycode去判断你按下的键位。

altkey 判断是否按下alt键
shiftkey 判断是否按下shift键
ctrlKey 判断是否按下ctrl键
metaKey 判断是否按下 window win键 苹果系统(mac) comment键

以上四个值返回是布尔值,IE低版本不支持。

事件委托

原理:冒泡
步骤:
1.找到要操作的节点的共同的父节点或者祖先节点。
2.将事件添加到父节点上。
3.找到事件目标,判断事件目标是否是想要触发的对象,如果是,则触发响应的事件。

获取焦点:
元素节点.focus()
默认行为:
a标签 自带点击效果
form 表单自己会提交
框选
鼠标右键菜单

阻止浏览器默认行为

要在你阻止的行为中添加阻止方法。

标准浏览器:
event.preventDefault();
IE低版本:
event.returnValue = false;
兼容写法:

   if(event.preventDefault){
              event.preventDefault();
          }else{
              event.returnValue = false;
          }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值