2021-01-13事件对象

一、事件对象

对象可以看成 属性的集合 函数也是属性的一种。(属性和函数的集合)
事件对象主要包含一些事件的信息。
事件绑定:
元素节点.on+事件类型 = 匿名函数;
事件对象的产生:在事件绑定完成后,就自动生成了一个事件对象。
事件绑定函数,因为不是在代码中直接调用函数,所以没有办法直接传参.
浏览器会给咱们一个默认的参数,这个参数就是事件对象。
获取事件对象:
在标准浏览器中。
直接在事件处理函数上定义一个形参。
会在事件触发的时候,由浏览器自动传递实参。
IE低版本
window.event
在标准浏览器下也可以使用
兼容写法:

var event = event || window.event;

HTML:

<div class="box">
        123
    </div>

JS:

function box() {
// 存储实参的
                console.log(arguments.length);
            }
            box();

在这里插入图片描述

box.onclick = function(event) {
                alert(arguments.length);
                console.log(arguments[0]);
            }

在这里插入图片描述
在这里插入图片描述

box.onclick = function(event) {
这三种写法都会触发
                //IE低版本无法使用
                // console.log(event);
                //IE低版本使用,其它也适用
                // console.log(window.event);
                //兼容写法
                var event = event || window.event;
                console.log(event);
            }

在这里插入图片描述

二、鼠标事件对象

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

  • 获取当前鼠标的位置(原点不同)
 clienX  可视窗口的左上角为原点
 clienY 
 pageX   整个页面的左上角为原点
 pageY
 screenX  电脑屏幕的左上角为原点
 screenY
 offsetX 以事件触发的元素为原点
 offsetY
.box {
            margin: 50px;
            width: 300px;
            height: 300px;
            background-color: brown;
        }
window.onload = function() {
            var box = document.querySelector(".box");
            box.onmousedown = function(event) {
                var event = event || window.event;
                console.log(event.button);
                console.log("clientX=" + event.clientX);
                console.log("clientY=" + event.clientY);
                console.log("pageX=" + event.pageX);
                console.log("pageY=" + event.pageY);
                console.log("screenX=" + event.screenX);
                console.log("screenY=" + event.screenY);
                console.log("offsetX=" + event.offsetX);
                console.log("offsetY=" + event.offsetY);
            }
        }

在这里插入图片描述

三、获取元素尺寸

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

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

clientWidth
clientHeight
元素的内容 + 内边距

.box {
            width: 300px;
            height: 300px;
            padding: 50px;
            border: 10px solid;
            margin: 100px auto;
            background-color: brown;
            /* display: none;隐藏时不会有宽高 */
            /* opacity: 0; 透明时仍会有宽高*/
        }
window.onload = function() {
            var box = document.querySelector(".box");
            console.log("offsetWidth=" + box.offsetHeight);
            console.log("offsetHeight=" + box.offsetHeight);
            console.log("clientWidth = " + box.clientWidth);
            console.log("clientHeight = " + box.clientHeight)
        }

在这里插入图片描述

四、获取元素偏移量

一个元素对于参考系的坐标位置。

  • offsetParent
    语法:元素.offsetParent
    作用:拿到该元素获取偏移量时的参考父级
    默认以body为参考系,如果父辈里有定位属性,则获取该父辈元素。
  • offsetLeft offsetTop
    语法:元素.offsetLeft 元素.offsetTop
    作用:拿到元素相对于参考系的相对偏移量。
.father {
            position: relative;
            background-color: burlywood;
            width: 600px;
            height: 600px;
            margin: 200px;
            overflow: hidden;
        }
        
        .box {
            width: 300px;
            height: 300px;
            padding: 50px;
            border: 10px solid;
            margin: 100px auto;
            margin-left: 50px;
            background-color: brown;
        }
window.onload = function() {
        var box = document.querySelector(".box");
        console.log("offsetParent=" + box.offsetParent);
        console.log("offsetLeft=" + box.offsetLeft);
        console.log("offsetTop=" + box.offsetTop);
    }

在这里插入图片描述

五、获取浏览器窗口尺寸

  • BOM
    innerWidth
    innerHeight
  • DOM 文档 html的元素尺寸
    document.documentElement.clientWidth
    document.documentElement.clientHeight
window.onload = function() {
    console.log(window.innerWidth);
    console.log(window.innerHeight);
    console.log(document.documentElement.clientWidth);
    console.log(document.documentElement.clientHeight);
}

浏览器进行伸缩时,刷新会重新获取当前尺寸
在这里插入图片描述

六、鼠标跟随(案例)

  • 1.需求:让div跟随鼠标移动
  • 分析代码:
    鼠标移动事件
    1 获取鼠标的坐标位置
    2.更改div的坐标位置
     <style>
        .box {
            width: 100px;
            height: 100px;
            background-image: url("img/jl.gif");
            background-size: contain;
            position: absolute;
        }        
        body {
            background-color: black;
        }
    </style>
    <script>
        window.onload = function() {
            var box = document.getElementsByClassName("box")[0];
            document.onmousemove = function(event) {
                var event = event || window.event;
                var w = event.pageX;
                var h = event.pageY;
                box.style.left = w - box.offsetWidth / 2 + "px";
                box.style.top = h - box.offsetHeight / 2 + "px";
            }
        }
    </script>

在这里插入图片描述

七、键盘事件对象

键盘事件对象:可以判断你按下的是哪个键。
属性:

  • key:你按下的是哪个键 区分大小写。
    在IE低版本不适用
  • keycode:
    以编码格式返回 不区分大小写。
    空格 32
    回车(Enter) 13
    在火狐低版本使用which属性。
    尽量用keycode去判断你按下的键位。
        altKey  判断是否按下alt键
        shiftKey  判断是否按下shift键
        ctrlKey  判断是否按下ctrl键
        metaKey 判断是否按下 window  win键  苹果系统(mac)  comment键 

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

document.onkeydown = function(event) {
            var enent = event || window.event;
            console.log("您按下的是" + event.key + ",编码为:" + event.keyCode);
            console.log(event.metaKey);
            console.log(event.altKey);
            console.log(event.shiftKey);
            console.log(event.ctrlKey);
        }

在这里插入图片描述

八、键盘控制小块移动

要求:
1. 按下键盘上的方向键,让div按照对应的方向进行移动。
2. 如果按下shift + 方向键, 让移动的速度乘以2。
步骤:
1.获取元素节点。
2.添加键盘事件
?键盘事件添加给谁 document
添加什么事件 keydown
3.事件中判断按下是什么键
如果是 → 让盒子向右移动,每次让它移动10px。
怎么让他移动? 绝对定位 设置:left
4.移动范围
移动时判断移动范围是否超过大盒子。

<style>
        * {
            margin: 0;
            padding: 0;
        }
        
        #bigBox {
            width: 1000px;
            height: 600px;
            margin: 50px auto;
            border: 1px solid;
            position: relative;
        }
        
        #smallBox {
            width: 50px;
            height: 50px;
            background-color: burlywood;
            position: absolute;
            left: 0;
            top: 0;
        }
    </style> 
    <script>
        window.onload = function() {
            var bigBox = document.getElementById("bigBox");
            var smallBox = document.getElementById("smallBox");
            document.onkeydown = function(event) {
                var event = event || window.event;
                var speed = 40;
                var l = parseInt(getComputedStyle(smallBox).left);
                var t = parseInt(getComputedStyle(smallBox).top);
                if (event.shiftKey) {
                    speed *= 2;
                }
                switch (event.keyCode) {
                    case 37:
                        if (l <= 0) {
                            smallBox.style.left = 0;
                        } else {
                            smallBox.style.left = smallBox.offsetLeft - speed + "px";
                        }
                        break;
                    case 39:
                        if (l >= bigBox.offsetWidth - smallBox.offsetWidth - speed) {
                            smallBox.style.left = bigBox.offsetWidth - smallBox.offsetWidth;
                        } else {
                            smallBox.style.left = smallBox.offsetLeft + speed + "px";
                        }
                        break;
                    case 38:
                        if (t <= 0) {
                            smallBox.style.top = 0;
                        } else {
                            smallBox.style.top = smallBox.offsetTop - speed + "px";
                        }
                        break;
                    case 40:
                        if (t > bigBox.offsetHeight - smallBox.offsetHeight - speed) {
                            smallBox.style.top = bigBox.offsetHeight - smallBox.offsetHeight;
                        } else {
                            smallBox.style.top = smallBox.offsetTop + speed + "px";
                        }
                        break;
                    default:
                        break;
                }

            }
        }
    </script>

九、事件传播机制

当你在一个元素上触发行为的时候,
会按照父级的顺序,从下往上进行传播行为,直到window为止。
事件传播只会传播同一类型的事件。

<div id="div1">
        <div id="div2">
            <div id="div3"></div>
        </div>
        <div id="other"></div>
</div>
window.onload = function() {
            var boxs = document.getElementsByTagName("div");
            for (var i = 0; i < boxs.length; i++) {
                boxs[i].dataset.index = i + 1;
                boxs[i].onclick = function() {
                    alert("div" + this.dataset.index);
                }
            }
        }

点击div3会依次弹出div3,div2,div1
点击div2会依次弹出div2,div1
点击div1会弹出div1
在这里插入图片描述
只有在div3上移动时才会触发
在这里插入图片描述

十、冒泡和捕获

在事件的对象中,有一个属性叫做 target
表示本次事件触发,准确触发的对象。
事件目标。
事件:事件源,事件类型,事件处理函数
在低版本的IE中不支持

IE支持:srcElemen

兼容写法:

var event = event || window.event;
var target = event.srcElement || event.target;
  • 冒泡:
    从 事件目标 到 window 的顺序来执行所有的事件。
  • 捕获:
    从 window 到 事件目标 的顺序来执行所有的事件。

addEventListener 第三个参数为true的话 表示捕获。 false 表示 冒泡。

<div id="div1">
        <div id="div2">
            <div id="div3"></div>
        </div>
</div>
 var boxs = document.getElementsByTagName("div");
            for (var i = 0; i < boxs.length; i++) {
                boxs[i].dataset.index = i + 1;
                使用监听去冒泡,从内到外获取
                boxs[i].addEventListener("click", function () {
                    alert("div" + this.dataset.index);
                });
            }

点击div3会依次弹出div3,div2,div1
点击div2会依次弹出div2,div1
点击div1会弹出div1
在这里插入图片描述

var boxs = document.getElementsByTagName("div");
            for (var i = 0; i < boxs.length; i++) {
                boxs[i].dataset.index = i + 1;
                使用监听去捕获,从外到内获取
                boxs[i].addEventListener("click", function() {
                    alert("div" + this.dataset.index);
                }, true);

点击div3会依次弹出div1,div2,div3
点击div2会依次弹出div1,div2
点击div1会弹出div1
在这里插入图片描述

var boxs = document.getElementsByTagName("div");
            for (var i = 0; i < boxs.length; i++) {
                boxs[i].onclick = function(event) {
                    // alert("div" + this.dataset.index);
                    // console.log(this);
                    console.log(event.target);
                }
            }

在这里插入图片描述

var div1 = document.getElementById("div1");
div1.onclick = function(event) {
     var event = event || window.event;
     var target = event.srcElement || event.target;
     console.log(target);
}

在这里插入图片描述

十一、mouseenter

mouseenter mouseleave 他们不会进行事件传播。

var box = document.getElementById("box");
            var intor = document.getElementById("intor");
            box.onmouseenter = function () {
                console.log("box移入了");
            }
            box.onmouseleave = function () {
                console.log("box移出了");
            }
            intor.onmouseenter = function () {
                console.log("intor移入了");
            }
            intor.onmouseleave = function () {
                console.log("intor移出了");
            }
        }

在这里插入图片描述

		 box.onmouseover = function() {
                console.log("box移入了");
            }
            box.onmouseout = function() {
                console.log("box移出了");
            }
            intor.onmouseover = function() {
                console.log("intor移入了");
            }
            intor.onmouseout = function() {
                console.log("intor移出了");
            }

在这里插入图片描述
在这里插入图片描述

十二、阻止事件传播

在标准浏览器中:

event.stopPropagation();

【注意】 书写在事件处理函数中
在IE低版本中:

 event.cancelBubble = true;

兼容写法:

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

阻止事件传播之后,点击div3只能显示div3

 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("div" + this.index);
                    // 阻止事件传播兼容写法
                    if (event.stopPropagation) {
                        event.stopPropagation();
                    } else {
                        event.cancelBubble = true;
                    }

                    // 标准浏览器
                    // event.stopPropagation();
                }
            }

十三、事件委托

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

  • 事件委托:
    原理:冒泡
    步骤:
    1.找到要操作的节点的共同的父节点或者祖先节点。
    2.将事件添加到父节点上。
    3.找到事件目标,判断事件目标是否是想要触发的对象,如果是,则触发响应的事件。
  • 获取焦点:
    元素节点.focus()
<button>添加</button>
<ul>
    <li>111</li>
    <li>222</li>
    <li>333</li>
    <li>444</li>
</ul>          
			获取ul li
		    var lis = document.getElementsByTagName("li");
            var ul = document.querySelector("ul");
            for (var i = 0; i < lis.length; i++) {            
                lis[i].onclick = function() {
                点击li时让背景色变换
                    this.style.backgroundColor = "red";
                }
            }
            获取按钮
            var btn = document.querySelector("button");
            btn.onclick = function() {
            点击按钮时创建一个元素节点
                var li = document.createElement("li");
                li.innerHTML = (lis.length + 1) * 111;
                在父节点ul的最后添加新的子节点
                ul.appendChild(li);
            }

新增的节点点击没有背景色
在这里插入图片描述

var lis = document.getElementsByTagName("li");
            var ul = document.querySelector("ul");
            var btn = document.querySelector("button");
            ul.onclick = function(event) {
                var event = event || window.event;
                var target = event.target || event.srcElement;
                // 元素节点的nodeName 是大写的标签名
                if (target.nodeName === "LI") {
                    target.style.backgroundColor = "red";
                }
            }
            btn.onclick = function() {
                var li = document.createElement("li");
                li.innerHTML = (lis.length + 1) * 111;
                ul.appendChild(li);
            }

新添加的节点点击可以改变背景色
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值