JS事件的绑定和传播

事件的绑定

使用对象.事件 = 函数来绑定响应函数。
它只能同时为一个元素的一个事件绑定一个响应函数,而不能绑定多个,一旦绑定后,后面的响应函数将会覆盖前面的。

<script type="text/javascript">
window.onload = function(){
    var btn01 = document.getElementById("btn01");
    btn01.onclick = function(){
        console.log("哈哈哈~");
    };
    btn01.onclick = function(){
        console.log("hhhhhhh");
    };
};
</script>
<!-- 输出hhhhhhh-->

这是可以使用addEventListener()来绑定函数
他需要三个参数:1)事件的字符串,不要on (例如onclick,写成click)
2)回调函数
3)是否在捕获阶段触发事件,一般都传false
eg: btn.addEventListner("click" , function(){} , false );
当事件触发时,响应函数会按照函数的绑定顺序执行
但是IE8及以下浏览器不支持
可以使用attachEvent()
两个参数:1)事件字符串,要on
2)回调函数
他是先绑定,后执行。执行顺序与addEventListener()相反,它支持IE8及以下浏览器

创建一个bind函数,来兼容所有浏览器

<script type="text/javascript">
window.onload = function(){
    var btn01 = document.getElementById("btn01");
    //三个参数:obj 要绑定事件的对象,eventStr 事件的字符串(不要on),callback 回调函数
    function bind( obj , eventStr , callback){
        if(obj.addEventListener){
            obj.addEventListener(eventStr , callback , false);
        }else{
            obj.attachEvent("on"+eventStr , function(){
                /*
                * addEventListener中this是绑定事件的对象,
                * attachEvent中this是window
                * 需要统一两个方法中的this
                * 在匿名函数中调用回调函数,改变attachEvent中的this
                */
                callback.call(obj);
            });
        }
    };
    bind(btn01 , "click" , function(){
        console.log("hi~");
    });
    bind(btn01 , "click" , function(){
        alert("hello~");
    });
};
</script>
<!-- hi~ hello~ -->

事件的传播

W3C将事件的传播分为三个阶段,
1)捕获阶段:在捕获阶段时,从最外层的祖先元素开始向目标元素进行事件的捕获,淡漠人不会触发事件
2)目标阶段:事件捕获到目标元素,捕获结束,开始在目标元素上触发事件
3)冒泡阶段:时间从目标元素开始向祖先元素传递,依次触发祖先元祖上的事件

如果希望在捕获阶段就触发事件,可将addEventListener()中的第三个参数设为true,但是注意IE8及以下浏览器没有捕获阶段

拖拽页面

setCapture() 对鼠标按下相关的事件进行捕获,(只有IE支持),当调用一个元素的setCapture()方法后,这个元素会把下一次所有鼠标按下的相关事件捕获到自身上
releaseCapture() 取消捕获

注意:在网页中,拖拽网页中的内容时,浏览器默认会去搜索引擎中搜索选中的内容,这时会导致拖拽功能异常。如果不希望有该行为,可以通过 renturn false 来取消默认行为,但是在IE8中不起作用。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            #box1{
                width: 100px;
                height: 100px;
                background-color: blueviolet;
                position: absolute;
            }
        </style>
        <script type="text/javascript">
            window.onload = function(){
                //获取box1函数对象
                var box1 = document.getElementById("box1");

                drag(box1);

                function drag(obj){
                    //创建box1的按下鼠标响应函数
                    obj.onmousedown = function(event){
                        //开启鼠标按下的捕获
                        box1.setCapture && box1.setCapture();

                        //div的偏移量  鼠标.clientX - box1.offsetLeft
                        //             鼠标.clientY - box1.offsetTop
                        var ol = event.clientX - obj.offsetLeft;
                        var ot = event.clientY - obj.offsetTop;

                        //创建document的鼠标移动
                        document.onmousemove = function(event){
                            event = event || window.event;
                            //获取鼠标所在位置的坐标
                            var x = event.clientX - ol;
                            var y = event.clientY - ot;
                            //设置box1的位置
                            obj.style.left = x + "px";
                            obj.style.top = y + "px";

                        };
                        //创建document鼠标松开响应函数
                        document.onmouseup = function(){
                            //取消鼠标移动函数
                            document.onmousemove = null;
                            //取消鼠标松开函数
                            document.onmouseup = null;
                            //取消鼠标的捕获
                            obj.releaseCapture();
                        };
                    };
                };
            };

        </script>

    </head>
    <body>
        <div id="box1"></div>
    </body>
</html>

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值