第二十天H5进阶

来源:互联网 发布:lockin china 知乎 编辑:程序博客网 时间:2024/06/05 18:20

绑定响应函数

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>        <script type="text/javascript">            /*             * 定义一个为元素绑定响应函数的方法可以兼容所有的浏览器             */            function bind(obj , eventStr , callback){                //判断obj中是否包含addEventListener                if(obj.addEventListener){                    //兼容ie8以上的浏览器                    obj.addEventListener(eventStr , callback , false);                }else{                    //兼容ie8以下的浏览器                    //这个方法绑定的回调函数中this永远都是window                    //手动指定函数的this                    obj.attachEvent("on"+eventStr , function(){                        //在匿名函数中调用回调函数                        //使用obj作为this来调用函数                        callback.call(obj);                    });                }            }            window.onload = function(){                var btn = document.getElementById("btn");                bind(btn , "click" , function(){                    alert(this);                });            };        </script>    </head>    <body>        <button id="btn">我是一个按钮</button>    </body></html>

事件的传播(事件流)

- 当触发了一个页面中某一个事件时,它实际上经过了三个阶段:    1.捕获阶段        - 指从最外层的元素开始向目标元素捕获事件(由外向内)    2.目标阶段        - 事件传播到了触发事件的对象    3.冒泡阶段        - 冒泡阶段指的是事件由目标元素,向他的祖先元素传导。(由内向外)- 一般来说我们的事件都是在冒泡阶段执行的,在IE8以下的浏览器中没有捕获阶段,    如果我们希望事件在捕获阶段执行,则需要使用addEventListener()来绑定响应函数,        还要将它的第三个参数指定为true。

事件的委派

- 当需要为多个元素去绑定响应函数时,我们可以将这些事件统一绑定给他们的父元素,    这样当后代元素上的事件触发时,会调用祖先元素上的响应函数,这样只需要绑定一个响应函数        所有的后代元素都会触发,这样简化我们的开发,同时提高了程序的性能,这个我们就称为事件的委派。

拖拽

拖拽相关的三个事件:    onmousedown:当鼠标按下时触发    onmousemove: 当鼠标移动时触发    onmouseup:当鼠标松开时触发注意:    1.onmousedown给被拖拽的对象绑定    2.onmousemove和onmouseup需要给document绑定    3.onmousemove和onmouseup这两个事件需要在onmousedown响应函数内绑定    4.onmouseup时需要清除两个事件:onmousemove和onmouseup

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>        <style type="text/css">            #box1{                width: 100px;                height: 100px;                background-color: red;                position: absolute;            }        </style>        <script type="text/javascript">            /**             * 提取出一个拖拽的函数             */            function drag(obj){                //为box1绑定一个鼠标按下的事件                obj.onmousedown = function(event){                    //处理事件对象的兼容性问题                    event = event || window.event;                    try{                        //设置box1捕获所有的事件                        obj.setCapture();                    }catch(e){                    }                    //获取鼠标和元素的相对的位置                    //位置 = 鼠标的坐标 - 元素的偏移量                    var mLeft = event.clientX - obj.offsetLeft;                    var mTop = event.clientY - obj.offsetTop;                    //当鼠标移动时改变元素的位置                    //如果将onmousemove事件绑定给移动的元素,则如果鼠标移动过快                    //则鼠标很容易移出元素,这样元素将不能跟随鼠标的位置,所以这个事件绑定给box1并不合适                    document.onmousemove = function(event){                        //处理事件对象的兼容性问题                        event = event || window.event;                        //获取垂直和水平的坐标                        var top = event.clientY - mTop;                        var left = event.clientX - mLeft;                        //处理水平方向的边界                        if(left < 10){                            left = 0;                        }else if(left > document.documentElement.clientWidth - obj.offsetWidth -10){                            //如果left > 总宽度 - 元素的宽度                            left = document.documentElement.clientWidth - obj.offsetWidth;                        }                        //处理垂直方向的边界                        if(top < 10){                            top = 0;                        }else if(top > document.documentElement.clientHeight - obj.offsetHeight - 10){                            //如果left > 总宽度 - 元素的宽度                            top = document.documentElement.clientHeight - obj.offsetHeight;                        }                        //修改元素的坐标                        /*                         * 简单的设置元素坐标为鼠标的坐标,这样元素的左上角总是和鼠标重叠                         * 但是我们希望,元素和鼠标的相对位置是不变                         */                        obj.style.left = left + "px";                        obj.style.top = top + "px";                    };                    //为box1绑定一个鼠标松开的事件                    /*                     * 如果将鼠标松开的事件绑定给box1,当鼠标移入到到其他元素上时,将不能触发事件                     * 导致鼠标松开以后元素依然会移动,所以绑定在box1上不合适                     */                    document.onmouseup = function(){                        //鼠标一松开,元素的位置就固定了                        //取消元素的鼠标移动事件                        document.onmousemove = null;                        //清空onmouseup                        document.onmouseup = null;                        //取消box1对事件的捕获                        try{                            //releaseCapture可以释放当前元素对所有事件的捕获                            obj.releaseCapture();                        }catch(e){                        }                    }                    /*                     * 在页面中当选中了文字或者图片时,浏览器会默认启动内部的拖动事件                     *  使这些文字,图片可以直接在新窗口中打开,或者是在搜索引擎中搜索                     * 所有这些操作实际上都是浏览器对onmousedown的默认的行为                     * 所以如果不希望产生这些行为,可以取消默认行为                     *                      * 取消默认行为这招在IE8中不好使                     */                    return false;                   };            }            window.onload = function(){                /*                 * 使用鼠标拖动元素,可以将元素拖动到页面中的任意位置                 * 拖拽的流程:                 *  1.当鼠标在被拖拽的元素上按下时,开始拖拽 onmousedown                 *  2.当鼠标指针移动时,同时修改元素的位置 onmousemove                 *  3.当鼠标松开时,则将元素定位 onmouseup                 */                //alert(document.documentElement.clientWidth);                //alert(document.documentElement.clientHeight);                //获取box1                var box1 = document.getElementById("box1");                //获取box2                var box2 = document.getElementById("box2");                //获取img1                var img1 = document.getElementById("img1");                //为box1设置拖拽                drag(box1);                //为box2设置拖拽                drag(box2);                //为图片设置拖拽                drag(img1);            };        </script>    </head>    <body>        <div id="box1"></div>        <div id="box2" style="width: 100px; height: 100px; background-color: #ff0; position: absolute;  top:200px; left: 500px;"></div>        <img id="img1" src="img/an.jpg" style="position: absolute;"/>    </body></html>

滚轮滚动事件

其他浏览器:    onmousewheel火狐:    DOMMouseScroll    - 注意火狐中的事件必须通过addEventListener()来绑定滚轮方向的判断:    其他浏览器中:使用:event.wheelDelta        当值大于0时,向上滚动,当值小于0是,向下滚动    火狐浏览器:使用:event.detail        当值大于0时,向下滚动,当值小于0是,向上滚动

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>        <style type="text/css">            #box1{                width: 100px;                height: 100px;                background: red;            }        </style>        <script type="text/javascript">            window.onload = function(){                /*                 * 使box1可以根据滚轮的滚动方向增长或缩短                 */                //获取box1                var box1 = document.getElementById("box1");                //处理函数                function wheel(event){                    event = event || window.event;                    //根据滚轮的滚动方向增长或缩短box1                    //滚轮向上滚动时,div缩短,向下滚动时div增长                    /*                     * 判断滚轮滚动方向时,数值本身我们是不使用的,只是使用它来判断滚轮滚动的方向                     */                    //向上滚动 +120  向下滚-120(IE和chrome)                    //wheelDelta这个属性火狐不支持                    //alert(event.wheelDelta);                    //向上滚-3 向下滚+3(火狐)                    //alert(event.detail);                    //指定一个默认的高度                    var height = 0;                    //判断滚轮滚动的方向                    if((event.wheelDelta && event.wheelDelta > 0) || event.detail < 0){                        //向上滚动,缩短长度                        height = -10;                    }else{                        //向下滚动,增加长度                        height = 10;                    }                    //修改div的高度                    box1.style.height = box1.offsetHeight + height + "px";                    /*                     * 当页面中有滚动条时,会导致页面中的滚动条滚动,而div是不变                     * 这个也是浏览器的默认行为,所以如果不希望滚动条滚动,取消默认行为                     *                      * 注意:通过addEventListener()绑定的响应函数不能通过return false来取消默认行为                     * event.preventDefault()                     */                    //停止火狐的默认行为                    /*                     * ie中不支持preventDefault方法,使用会抛出异常                     */                    /*try{                        event.preventDefault();                    }catch(e){                    }*/                    event.preventDefault && event.preventDefault();                    return false;                   }                //为box1绑定鼠标滚轮滚动的事件                //onmousewheel火狐不支持                box1.onmousewheel = wheel;                /*                 * 火狐中鼠标滚轮滚动的事件:                 *  DOMMouseScroll,而且这个事件必须通过addEventListener()方法来绑定                 */                bind(box1,"DOMMouseScroll",wheel);            };            function bind(obj , eventStr , callback){                //判断obj中是否包含addEventListener                if(obj.addEventListener){                    //兼容ie8以上的浏览器                    obj.addEventListener(eventStr , callback , false);                }else{                    //兼容ie8以下的浏览器                    //这个方法绑定的回调函数中this永远都是window                    //手动指定函数的this                    obj.attachEvent("on"+eventStr , function(){                        //在匿名函数中调用回调函数                        //使用obj作为this来调用函数                        callback.call(obj);                    });                }            }        </script>    </head>    <body style="height: 3000px;">        <div id="box1"></div>    </body></html>

键盘事件:

- 一般情况键盘事件都会绑定给输入框或者是documentonkeydown --> 当按键按下时触发onkeyup --> 当按键被松开时触发   - 键盘相关的事件属性:    keyCode:按键的编码(可以获取到哪个按键被按下)    altKey    ctrlKey    shiftKey        - 这三个用来检查alt ctrl shift是否被按下,如果按下则返回true,否则返回false

<!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title></title>        <style type="text/css">            #box1{                width: 100px;                height: 100px;                background: red;                position: absolute;            }        </style>        <script type="text/javascript">            window.onload = function(){                /*                 * 根据键盘的按键来移动div                 * <- 向左移动37                 * -> 向右动 39                 * v 向下移动 40                 * ^ 向上移动 38                 */                var box1 = document.getElementById("box1");                document.onkeydown = function(event){                    event = event || window.event;                    //定义一个变量                    var speed = 10;                    //当ctrl键按下时要求加快速度                    if(event.ctrlKey){                        speed = 300;                    }                    switch(event.keyCode){                        case 37:                            //向左 ,减小left值                            box1.style.left = box1.offsetLeft - speed +"px";                            break;                        case 38:                            //向上,减少top值                            box1.style.top = box1.offsetTop - speed +"px";                            break;                        case 39:                            //向右,增加left值                            box1.style.left = box1.offsetLeft + speed +"px";                            break;                        case 40:                            //向下,增加top值                            box1.style.top = box1.offsetTop + speed +"px";                            break;                    }                };            };        </script>    </head>    <body>        <div id="box1"></div>    </body></html>