事件二

一 ~事件的俩个行为

1.事件冒泡

从里到外冒泡 里面有一个按钮添加了点击事件 外面有个盒子也添加了点击事件 在你触发对应的按钮的点击的时候 同时他会自动调用对应盒子的点击事件 而这个机制就叫做事件冒泡

<script>
        var Box = document.querySelector(".box")
        var Box1 = document.querySelector(".box1")
        var Box2 = document.querySelector(".box2")

        Box.onclick=function(){
            console.log("点击了大盒子");
        }
        Box1.onclick=function(){
            e.stoppropageation()
            console.log("点击了二盒子");
        }
        Box2.onclick=function(e){
            //阻止事件冒泡
            e.stoppropageation()
            console.log("点击了三盒子");
            
        }
    </script>

 

2.事件捕获

直接进行捕获处理

 

二 ~ 阻止事件冒泡

e.stoppropagation() *

e.cancelBubble = true (兼容ie的写法)

document.querySelector("div").onclick = function(){
    console.log("大盒子被点击了");
}
document.querySelector("button").onclick = function(e){
    e = e || window.event
    // // 阻止事件冒泡
    // e.stopPropagation() //适用大多数的浏览器 *
    // //兼容ie 取消冒泡
    // e.cancelBubble = true
    //兼容写法
    if(e.stopPropagation){
        e.stopPropagation()
    }else{
        e.cancelBubble = true
    }
    //三目运算写法
    e.stopPropagation?e.stopPropagation():e.cancelBubble = true
    console.log("按钮被点击了");
}
兼容写法
e.stopPropagation?e.stopPropagation():e.cancelBubble = true

 

三 ~ 阻止默认行为

概述:元素自身拥有的一些行为

form的submit按钮会自动提交 然后跳转页面

a标签 直接默认跳转页面

鼠标右键点击 会出现菜单栏

 

阻止a标签默认跳转的行为
    <a href="http://www.baidu.com">百度</a>
    <script>
        document.querySelector("a").onclick = function(e){
        e = e || window.event
        //阻止a标签默认跳转的行为
        // e.preventDefault() //阻止默认行为 *
        //ie浏览器兼容
        // e.returnValue = false //阻止默认行为 returnValue 同样适用于高版本浏览器(可能会被废弃)
        console.log("a标签被点击了");
        return false //阻止默认行为 一般写在最后
    }
    </script>

 

右键菜单栏事件
document.oncontextmenu

 

四 ~ 拖拽

思路

1.鼠标按下 mousedown (获取点击在元素上的位置)

2.鼠标移动 mousemove (获取在文档上移动的位置 控制对应的元素移动)

3.鼠标弹起 mouseup (将弹起事件和移动事件清除)

 

实现代码

 

<!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>Box drag</title>
    <style>
        div {
            width: 100px;
            height: 100px;
            background-color: pink;
            position: absolute;
        }
    </style>
</head>

<body>

    <div></div>

</body>
<script>
    //1.获取页面元素
    var div = document.querySelector("div")
    //2.鼠标点击
    div.onmousedown = function (e) {
        e = e || window.event
        // 获取鼠标在div中的位置 offset
        var curX = e.offsetX;
        var curY = e.offsetY;
        console.log(curX, curY);


        //3.盒子在文档中移动
        document.onmousemove = function (e) {
            e = e || window.event
            // 移动 = 新的位置减去旧的位置
            // 旧的位置 curX curY
            //新的位置 e.pageX e.pageY
            var tagerX = e.pageX - curX
            var tagerY = e.pageY - curY

            //div 的位置等于移动后的位置
            div.style.left = tagerX + "px"
            div.style.top = tagerY + "px"

        }

        //4.取消移动和抬起事件
        document.onmouseup = function () {
            document.onmousemove = document.onmouseup = false;
        }

    }
</script>

</html>

五 ~ 区间拖拽

思路

1.给元素添加按下事件 (获取元素的父盒子的位置 在网页上的位置 获取对应的鼠标在元素里面的位置)

2.在按下事件里面添加移动事件(父元素添加) (获取当前鼠标在父盒子里面的位置 - 对应的鼠标在元素的位置 设置对应的位置 )

3.在弹起事件里面取消对应的移动事件以及弹起事件

代码
<!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>盒子坐牢记</title>
    <style>
        .box {
            width: 500px;
            height: 500px;
            border: 1px #000 solid;
            margin: 100px;
            position: absolute;
        }

        .moveBox {
            width: 100px;
            height: 100px;
            background-color: skyblue;
            position: absolute;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="moveBox">

        </div>
    </div>
    <script>
        //1.获取页面元素
        // 获取 box 和moveBox
        var box = document.querySelector(".box")
        var moveBox = document.querySelector(".moveBox")
        //2.给小盒子绑定鼠标按下事件
        moveBox.onmousedown = function (e) {
            e = e || window.event;
            //  获取鼠标在小盒子中的位置
            var curX = e.offsetX;
            var curY = e.offsetY;

            //3.给大盒子绑定鼠标移动事件
            box.onmousemove = function (e) {
                e = e || window.event;
                //获取鼠标在大盒子中的位置
                //新的 位置 =  鼠标在页面上的的位置 - 大盒子到页面上的距离
                var moX = e.pageX - this.offsetLeft - curX
                var moY = e.pageY - this.offsetTop - curY

                //最大值 = 大盒子的宽度 - 小盒子的宽度
                var MaxX = this.offsetWidth - moveBox.offsetWidth;
                var MaxY = this.offsetHeight - moveBox.offsetHeight;
                //if 判断是否超出
                if (moX < 0) {
                    moX = 0
                }
                if (moY < 0) {
                    moY = 0
                }
                //超出最大值时 就等于最大值
                if (moX > MaxX) {
                    moX = MaxX
                }
                if (moY > MaxY) {
                    moY = MaxY
                }
                // console.log(this);
                // 给小盒子的位置赋值
                moveBox.style.left = moX + "px"
                moveBox.style.top = moY + "px"
            }

            //4.给大盒子绑定鼠标鼠标抬起事件
            box.onmouseup = function () {
                box.onmousemove = box.onmouseup = false
            }
        }

    </script>
</body>

</html>

 

 

六 ~ offset家族

offset家族是获取对应的偏移的位置 他有奶便是娘 (他的父元素谁加了定位他就基于谁 否则基于body)

offsetParent 偏移的父元素(选择离他最近加了定位的父元素)

offsetLeft 左偏移

offsetTop 上偏移

offsetWidth 偏移元素的宽度

offsetHeight 偏移元素的高度

 

七 ~  事件监听器

1.采用了观察者模式(observer)

2.同一个事件可以有多个处理函数

3.在添加事件的时候对应的处理函数不能是匿名函数(不然是不能被移除的)

添加事件监听 addEventListener

addEventListener(监听事件名,处理函数,冒泡false 还是捕获 true)

移除事件监听 removeEventListener

removeEventListener(事件名,处理函数)

var btn =  document.querySelector("button")
function hanlder(){
    console.log("123");
}
//添加监听 同一个事件可以有多个处理函数
btn.addEventListener('click',hanlder,false)
btn.addEventListener('click',function(){
    console.log("456");
},false) //是否捕获
//移除事件监听 函数的指向不一样 开辟俩个内存空间 地址是不一样 移除不了
//移除对应的事件名中某个匹配处理函数
btn.removeEventListener('click',hanlder)
//兼容 ie8以下
// btn.attachEvent("onclick",fn) 添加
// btn.detachEvent("onclick",fn) 移除

 

封装的兼容方法
//事件监听器的兼容
//添加事件的元素 事件类型 处理函数
function addEvent(element,type,fn){
    element.addEventListener?element.addEventListener(type,fn):element.attachEvent(`on${type}`,fn)
}
function removeEvent(element,type,fn){
    element.removeEventListener?element.removeEventListener(type,fn):element.detachEvent(`on${type}`,fn)
}

 

posted @ 2022-06-13 01:21  懿贰懿  阅读(80)  评论(0)    收藏  举报