javascript 知识点 第七篇 事件

233 阅读4分钟

七事件

一 事件基础

1.事件的核心内容

事件的核心内容
 a:通过谁触发事件(事件源)
 b、事件对象
 c、事件处理程序
 语法:
    obj.onclick = function(){}     

2.常用事件

鼠标事件:
          onclick
          ondblclick      双击
          oncontextmenu   右击
          
          onmouseover   onmouseout    鼠标移入移出(查一下两个的区别)
          onmouseenter  onmouseleave  鼠标移入移除
          onmousedown    onmousemove   onmouseup... 鼠标按下 滑动 抬起

    滚轮事件
          onmousewheel

    键盘事件
          onkeyup    键盘抬起
          onkeydown  键盘按下(任何键都可以)
          onkeypress 键盘按下 (字母键数字键)
    
    滚动条事件
          onscroll 
          window.onscroll = function(){}

     

    表单事件
          onfocus   获得焦点
          onblur    失去焦点
          oninput   文本框输入事件(实时监控文本框)
          onchange  文本框失去焦点内容发生改变时触发
          onsubmit  表单提交  form才有
案例;
  //鼠标移入
    oBox[0].onmouseover = function(){
        console.log(1);
    }
    //鼠标移出
    oBox[0].onmouseout = function(){
        console.log(2);
    }
    鼠标移出
    oBox[0].onmouseenter = function(){
        console.log(1);
    }
    //鼠标移出
    oBox[0].onmouseleave = function(){
        console.log(2);
    }
     //鼠标按键按下
     oBox[0].onmousedown = function(){
        console.log(1);
    }
    //鼠标移动
    oBox[0].onmousemove = function(){
        console.log(2);
    }
    //鼠标按键抬起
    oBox[0].onmouseup = function(){
        console.log(3);
    }
     //鼠标滚轮
     oBox[0].onmousewheel= function(){
        console.log(aaa);
    }


//键盘事件
键盘按下
document.onkeydown  = function(){
        console.log(1);
    }
//键盘抬起
document.onkeyup  = function(){
        console.log(2);
    }

var oInput = $('input');
//获取焦点时打印
oInput[0].onfocus = function(){
      console.log(1);
}
//失去焦点时打印
oInput[0].onblur = function(){
      console.log(2);
}

二 事件对象

事件对象:当触发 onclick, onkeyup ,.........这些事件时,会产生一个事件对象event。
        不同事件产生的事件对象对应的属性不同
        谷歌浏览器  : window.event   事件参数   evt
        火狐 或  ie : window.event
语法:
       事件源.事件 = function(e){
        e = e || window.event;    获取事件对象并且处理兼容问题
        //事件处理程序
            }
		注:点击谁,谁就是事件源
事件对象:
        1.事件类型
                e.type ----获取结果没有on
        2.鼠标位置
            offsetX   offsetY      鼠标再元素上面的位置
            clientX   clientY      鼠标距离浏览器窗口左 上的位置
            pageX     pageY        client + 滚动条的距离
            screenX   screenY      距离屏幕的距离
案例:
//事件源获取
        document.onclick = function(e){
            e = e || window.event;
            console.log(e);
        }
 //获取事件类型
        document.onclick = function(e){
            e = e || window.event;
            console.log(e.type);
        }
案例:
//鼠标显示位置
var txt = $('textarea');
        document.onmousemove = function(e){
            e = e || window.event;
            var 
                x = e.clientX,
                Y = e.clientY;
            txt[0].value = '距离左侧:'+x+'距离顶部:'+Y;

        }
        
 //图片跟随着鼠标进行移动
 var oImg = $('img');
       
        document.onmousemove = function(e){
            //获取事件信息
            e = e || window.event;
            //获取鼠标的位置信息
            var 
                l = e.clientX,
                t = e.clientY;
                //根据鼠标位置信息,
                oImg[0].style.left = l - 50 + 'px';
                oImg[0].style.top = t - 50 + 'px';

        }
        //鼠标点击更改图片(按下)
        document.onmousedown = function(){
            oImg[0].src = './img/2.jpg';
        }
        //鼠标点击更改图片(抬起)
        document.onmouseup = function(){
            oImg[0].src = './img/1.jpg';
        }
      
//放大境效果
<div class="imgShow">
        <img src="./img/img/small.jpg" alt="">
        <span class="flter"></span>
        <div class="bigBox">
            <img class= "bigImg" src="./img/img/big.jpg" alt="">
        </div>
    </div>
    <script src='../../myAPi/myApi.js/myAPI.js'></script>
    <script>
        /*
            1.遮罩层随着鼠标移动而移动(鼠标移动的范围在小图里面)
            2.大图随着遮罩层的移动而移动
        */
        /*
            遮罩层/bigBox =  小图/ 大图
            150/500 = 300/1000 
        */
        var 
            oImgShow = $('.imgShow')[0],
            oFilter = $('.flter')[0],
            oBigImg = $('.bigImg')[0],
            oBigBox = $('.bigBox')[0];
            oImgShow.onmousemove = function(e){
                e = e || window.event;
                //获取鼠标移动的位置
                var 
                    l = e.clientX - oImgShow.offsetLeft - oFilter.offsetWidth/2,
                    t = e.clientY - oImgShow.offsetTop - oFilter.offsetHeight/2;
                    //对鼠标移动的边界进行处理
                    l = l <= 0 ? 0 : (l >= 150 ? 150 :l);
                    t = t <= 0 ? 0 : (t >= 150 ? 150 :l);
                    oFilter.style.left = l +'px';
                    oFilter.style.top = t +'px';
                    //控制大图的位置()
                    oBigImg.style.left = -l/0.3 +'px';
                    oBigImg.style.top = -t/0.3 +'px';

            }
            oImgShow.onmouseover = function(){
                oFilter.style.display = 'block';
                oBigBox.style.display = 'block';
            }
            oImgShow.onmouseout = function(){
                oFilter.style.display = 'none';
                oBigBox.style.display = 'none';
            }
    </script>

三 键盘事件

//获取按键的ascii码值
        document.onkeydown = function(e){
            e = e || window.event;
            //获取按键
            var keyCode = e.keyCode || e.which;
            console.log(keyCode);
            //将ascii码转成对应的字符
            console.log(String.fromCharCode(keyCode));
        }


//打字游戏

/*
            1.获取box中字符的ascii码
            2.如果输入的字母和box中的相对应,
            3则随机产生一个字符(65-90),并且放在box里面
        */
        var oBox = document.querySelector('div');
        document.onkeydown = function (e) {
            //获取事件对象的信息
            e = e || window.envent;
            var letterCode = oBox.innerHTML.charAt(0).charCodeAt(0);
            console.log(letterCode);
            //获取输入字符的ascii码
            var keyCode = e.keyCode || e.which;//解决兼容问题
            //输入的字符和当前字符做对比
            if (keyCode == letterCode) {
                var num = randomNumber(65, 90);
                oBox.innerHTML = String.fromCharCode(num);
            }

        }
//聊天框
 <section class="txtShow">
            <!-- <p>文本文本文本文本文本文本</p> -->
    </section>
    <div class="box">
        <input type="text" class="info">
        
        <button class="btn">发送</button>
    </div>
    <script src="../../myAPi/myApi.js/myAPI.js"></script>
    <script>
    /*
        业务逻辑:
            1.获取info输入的内容信息
            2.将内容信息填到一个新元素中
            3.将新元素放section中
            新添加功能:
            1.文字输入完,输入框清空
            2.空格不能发送
            3.输入文字显示时间
            4.在添加Div,在div中添加span 和p 标签
    
    */
   var  
        oInfo = $('.info')[0],
        oBtn = $('.btn')[0],
        oTxtShow = $('.txtShow')[0];
        function info(){
            if(oInfo.value){//如果输入的信息不为空时在执行;
            //获取输入信息
            var infoVal = oInfo.value;
            //创建一个div div用来存放时间 和 p
            var createDiv = document.createElement('div');
            var createP = document.createElement('p');//创建节点,存放info信息
            createP.innerHTML = infoVal;//把info中的信息,存放在p中
            //将p中的信息放到div中
            createDiv.appendChild(createP);
            //发送每一条信息都带有时间
            var date = new Date();//获取现在的时间
            //把时间放在一个span标签中
            var createSpan = document.createElement("span");
            //把时间放在span中
            createSpan.innerHTML = mendZero(date.getHours())+':'+mendZero(date.getMinutes())+':'+mendZero(date.getSeconds());
            //将span加到Div 中
            createDiv.appendChild(createSpan);

            oTxtShow.appendChild(createDiv);//将Div放在oTxtShow中
            oTxtShow.scrollIntoView(true);//让内容始终在可视区域
            oInfo.value = '';//清空输入框

        }
    }
        //事件绑定
        oBtn.onclick = function(){
            info();
        }
        //键盘触发
        document.onkeydown = function(e){
            e = e || window.event;
            var keyCode = e.keyCode || e.which;
            //回车发送
            if( keyCode == 13 && e.ctrlKey){
                info();
            }
        }

    </script>

四 阻止浏览器默认

1.什么是浏览器的默认行为

  	 a、右键会出现菜单

     b、点击超链接会发生跳转

     c、点击 type="submit"的按钮会提交表单

     d、图片拖拽


2.阻止浏览器默认行为

1、利用事件对象属性 和 returnValue (以后都用这两种)
     
     preventDefault是一个方法:e.preventDefault();
     returnValue的值是一个常量:e.returnValue = false;           //ie8及以下浏览器

2、兼容
     if(e.preventDefault){
         e.preventDefault(); 
     }else{
         e.returnValue = false;
     }

3、右键菜单事件
     document.oncontextmenu = function(e){}


//阻止浏览器的默认行为
function preventDefault(e){
    return e.preventDefault ? e.preventDefault() : e.returnValue = false;
}

案例:制作一个右键菜单
<div class="menu"></div>
    <script src="../../myAPi/myApi.js/myAPI.js"></script>
    <script>
    var oMenu = $('.menu');
    document.oncontextmenu = function(e){
        e = e || window.event;
        preventDefault(e);
        var 
            l = e.clientX,
            t = e.clientY;
            oMenu[0].style.display = 'block';
            oMenu[0].style.left = l + 'px';
            oMenu[0].style.top = t + 'px';
    }

五 事件监听

1.DOM 0级事件

场景 现在有元素div,用属性形式给div添加两次点击事件

      div.onclick = function(){
          alert(1)
     }

     div.onclick = function(){
          alert(2);
     }

缺陷:重复定义事件后面的会覆盖前面的

2.事件监听: dom2级事件

addEventListener()方法特点:

    - element.addEventListener(event, function, useCapture)中的第三个参数可以控制指定事件是否在捕获或冒泡	阶段执行。true - 事件句柄在捕获阶段执行。false- 默认- 事件句柄在冒泡阶段执行。

    - addEventListener() 可以给同一个元素绑定多个事件,不会发生覆盖的情况。如果给同一个元素绑定多个事件,那么	 采用先绑定先执行的规则。

    - addEventListener() 在绑定事件的时候,事件名称之前不需带 on 。

    - 注意该方法的兼容性,如果要兼容 IE6-8 ,不能使用该方法,可以采用以下方法。

    - 可以使用 removeEventListener() 来移除之前绑定过的事件。
    
    attachEvent()方法特点:

* attachEventIE 有的方法,它不遵循W3C标准,而其他的主流浏览器如FF等遵循W3C标准的浏览器都使用addEventListener,所以实际开发中需分开处理。

attachEvent()是 后绑定先执行。

绑定时间时,attachEvent必须带 on,如 onclickonmouseover
ele.addEventListener(事件类型,回调函数,布尔值)    //存在兼容问题
 参数解析:
     事件类型:click   contentmenu  mouseover  mouseout........
              回调函数:事件处理程序
             布尔值:  一般不去设置,控制事件流  如果为true 为事件捕获   否则为事件冒泡

ele.attachEvent(事件,回调函数)           //IE
  参数解析
       事件:   onclick    onmouseover
       回调函数:  事件处理程序
       
       ------------------------------------------------

        

案例:封装事件监听(解决兼容问题)
function addEventListener(ele, eventType, fn) {
            return ele.addEventListener ? ele.addEventListener(eventType, fn) : ele.attachEvent('on' + eventType, fn);
        }
        addEventListener(document, 'click', function () {
            console.log(1);
        })

六事件流

1.事件冒泡和事件捕获

1、什么是事件流
     当一个HTML元素产生一个事件时,该事件会在元素节点与根节点之间的路径传播,路径所经过的节点都会收到该事件,这个传播的过程叫做DOM事件流

     简单理解:元素触发事件时,事件的传播过程称为事件流,过程分为捕获和冒泡两种
 2.冒泡和捕获
 冒泡事件流:
          微软提出了名为事件冒泡(event bubbling)的事件流
         
          事件冒泡可以形象地比喻为把一颗石头投入水中,泡泡会一直从水底冒出水面。也就是说,事件会从最内层的元素		开始发生,一直向上传播,直到根节点
                   
          如果你的手指指向一个靶子,并射中某一环,并不仅仅是对某一环产生了操作,而是对全局都产生了操作
    
    
     捕获事件:
    
           网景提出另一种事件流名为事件捕获(event capturing)。事件的传播由父元素到子元素传递的过程,称为事件捕获

老版本IE,没有事件捕获的特性

浏览器的事件默认执行并传播的顺序是:

window---->document----->html----->body----->.........---->目标元素   捕获过程
目标元素---->.........----->body---->html---->document---->window  冒泡过程


2.阻止事件冒泡

 e.stopPropagation()    //兼容    ie方法
 e.cancelBubble = true    //属性

//阻止事件冒泡
function stopPropagation(e){
    return e.stopPropagation ? e.stopPropagation() : e.cancelBubble = true;
}

七 事件代理

1.什么是事件源

1、什么是事件源
     概念:真正触发事件的元素

     事件对象是一个属性

     源是一个元素

2、怎么获取事件源?
     1、先获取事件对象
     
     2、e、target||e.srcElement

3、事件源有什么作用
     通过事件源可以知道真正触发事件的元素

2.事件代理/事件委托

1.事件代理:
        把事件绑定到父元素上,对事件源进行判断,然后执行不同的代码块;(className tagName)

2、事件源:真正触发事件的对象
     var target = e.target||e.srcElement

       tagName能找到事件源的元素名

3、原理:利用冒泡机制,将子元素的事件委托给父元素去监听(给父元素添加事件),当子元素触发事件时,事件冒泡到父级如果希望指定的子元素才能触发事件,可以通过事件对象(event)获得事件源(target),然后通过条件判断是不是期望的子元素,如果是的话,执行事件,否则不执行

4、事件委托的好处
     
     1、实现对未来元素事件的绑定
          未来元素:绑定事件时,页面上还不存在的元素

     2、减少事件绑定,提高性能 

案例:实时编辑(重要)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        *{
            margin:0;
            padding:0;
        }
        div{
            width:800px;
            overflow:hidden;
            background:orange;
            margin-top:30px;
        }
        h2,h3{
            font-size:24px;
            line-height:30px;
            text-align:center;
            float:left;
        }
        h2{
            width:150px;
            background:orangered;
        }
        h3{
            width:500px;
            background:orchid;
        }
        span{
            width:150px;
            float:right;
            font-size:24px;
            color:#fff;
            font-weight:bold;
            line-height:30px;
            text-align:center;
            background:pink;
        }
        section{
            width:800px;
            margin-top:30px;
        }
        article{
            width:800px;
            overflow:hidden;
            background:powderblue;
            border:3px solid black;
           
        }
        article h2,article h3{
            color:#fff;
        }

    </style>
</head>

<body>
    <label for="">学员姓名</label>
    <input type="text" class='stuName'>
    <label for="">联系方式</label>
    <input type="text" class='tel'>
    <button class ='btn'>信息发布</button>
    <div>
        <h2>名称</h2>
        <h3>联系方式</h3>
        <span>删除信息</span>
    </div>
    <sectio class="infroBox">
        <!-- <article>
            <h2>王小名</h2>
            <h3>1111111</h3>
            <span>delete</span>
        </article> -->
    </section>
    <script src="../../myAPi/myApi.js/myAPI.js"></script>
    <script>
    /*  1.获取输入框中的元素
        2.创建新的元素
        3.将获取的元素放到新元素里面
    
    */
    var    
        stuN =document.querySelectorAll('.stuName')[0],
        oTel = document.querySelectorAll('.tel')[0],
        oBtn = document.querySelectorAll('.btn')[0],
        oInfo = document.querySelectorAll('.infroBox')[0];
        function student(){
            var 
                stuNval = stuN.value,
                oTelVal = oTel.value;
                if(stuNval && oTelVal){
                    //创建新元素
                    var createArticle = document.createElement('article');
                    var createH2 = document.createElement('h2');
                    var createH3 = document.createElement('h3');
                    var createSpan = document.createElement('span');
                    //将获取的内容放到新元素中
                    createH2.innerHTML = stuNval;//把名称放到h2中
                    createH3.innerHTML = oTelVal;//把联系方式放到h3中
                    createSpan.innerHTML = 'delete';
                    createArticle.appendChild(createH2);
                    createArticle.appendChild(createH3);
                    createArticle.appendChild(createSpan);
                    oInfo.appendChild(createArticle);

                }
        }

        //事件代理:
        function del(e){
            //获取事件对象
            e = e || window.event;
            //获取事件源(触发事件的元素)
            var target = e.target || e.srcElement;
            //对事件源进行判断
            if(target.tagName =='SPAN'){
                //如果事件源是span, 则删除其父元素
                target.parentNode.remove();
            }
        }
        //绑定事件
        // oBtn.onclick = function(){
        //     student();
        // }
        //绑定事件第二种方法(事件监听)
        addEventListener(oBtn,'click',student);
        addEventListener(oInfo,'click',del);

    </script>
</body>

</html>

八 拖拽(重要)

1、拖拽的场景
     a、音乐进度条
     
     b、消息框

     c、滑动验证码

2、拖拽三剑客   
     onmouseDown/onmousemove/onmouseUp
     
     onmouseDown:鼠标按下

     onmouseUp:鼠标抬起
     
     onmousemove:鼠标移动

3、拖拽原理

     a、给目标元素添加onmouseDown事件,拖拽的前提是在目标元素按下左键

     b、当onmouseDown发生以后,此时给document添加onmousemove,这就意味着此时鼠标在网页的移动都将改变目标元素的位置

     c、在onmousemove事件中,通过事件对象获取鼠标位置,更改元素的left top值
          
目标元素的left = 鼠标的clientX – (鼠标和元素的横坐标差,即offsetX)
目标元素的top = 鼠标的clientY– (鼠标和元素的纵坐标差,即offsetY)

          document.onmousemove = null;
     d、给documen添加onmouseUp事件,意味着此刻鼠标在网页的任意位置松开鼠标,都会放弃拖拽的效果,在onmouseup事件中,取消document的onmousemove事件即可。

案例:图片拖拽
<img src="./1.jpg" alt="">
    <script src="../../myAPi/myApi.js/myAPI.js"></script>
    <script>
        var oImg = document.getElementsByTagName('img')[0];
        oImg.onmousedown = function(e) {
            e = e || window.event;
            //阻止浏览器的默认行为
            preventDefault(e);
            //获取鼠标在元素中距离左侧和上侧的位置
            var
                x = e.offsetX,
                y = e.offsetY;
                console.log(x,y);
            //鼠标移动
            document.onmousemove = function (e) {
                e = e || window.event;
                preventDefault(e);
                //获取鼠标的位置
                var
                    l = e.clientX,
                    t = e.clientY;
                //图片跟着鼠标进行移动
                oImg.style.left = l - x + 'px';
                oImg.style.top = t - y + 'px';
                //鼠标按键抬起
                document.onmouseup = function () {
                    document.onmousemove = null;
                }

            }
        }
    </script>

案例:
<body>
    <div class = 'box'></div>
    <script>
    var oBox = document.getElementsByClassName('box')[0];
    /*
        拖拽三剑客:
            onmousedown
            onmousemove
            onmouseup

    */
   oBox.onmousedown = function(e){
       //获取事件对象
        e = e || window.event;
        //当鼠标按下时,获取鼠标距离元素左侧和上侧的距离
        var     
            x = e.offsetX,
            y = e.offsetY;
            //当鼠标移动时,元素也进行移动
            document.onmousemove = function(e){
                e = e || window.event;
                //获取鼠标的位置
                var
                    l = e.clientX,
                    t = e.clientY;
                    //div 移动的位置(注:一定要减去鼠标在元素内部的距离)
                    oBox.style.left = l - x +'px';
                    oBox.style.top = t - y +'px';
            }
            //单鼠标抬起时
            document.onmouseup = function(){
                //鼠标移动清空
                document.onmousemove = null;
            }

   }

 // ele.addEventListener('事件类型',回调)  事件监听
 // ele.removeEventListener('事件类型',回调) 事件解绑

<style>
        * {
            margin: 0;
            padding: 0;
        }

        .box {
            height: 100px;
            width: 100px;
            background: red;
            position: absolute;
        }
    </style>
</head>

<body>
    <div class="box"></div>
    <script src="./myApi.js"></script>
    <script>
        var oBox = $('.box')[0];
        var fn = null;
        //事件监听
        addEventListener(oBox, 'mousedown', function (e) {
            e = e || window.evnet;
            var
                x = e.offsetX,
                y = e.offsetY;
            addEventListener(document,'mousemove',function (e) {
                e = e || window.event;
                var
                    l = e.clientX,
                    t = e.clientY;
                oBox.style.left = l - x + 'px';
                oBox.style.top = t - y + 'px';
                //事件解绑
                addEventListener(document, 'mouseup', function () {
                    document.removeEventListener('mousemove', fn);
                })
            })

        })
    </script>

//音乐进度条
<section>
        <div></div>
        <span></span>
    </section>
    <script src="../../myAPi/myApi.js/myAPI.js"></script>
    <script>
    var 
        oDiv = document.getElementsByTagName('div')[0],
        oSpan = document.getElementsByTagName('span')[0];
        oSpan.onmousedown = function(e){
            e = e || window.event;
            //获去鼠标距span左侧和上侧的位置
            var x = e.offsetX;
            console.log(x);
            document.onmousemove = function(e){
                e = e || window.event;
                //获取section(父元素)距离左边的位置
                var sectionLeft = oSpan.parentNode.offsetLeft;
                console.log(sectionLeft);
                //获取鼠标的位置
                var l = e.clientX - x - sectionLeft;
                console.log(l);
                //对span的运动边界进行限制
                l = l <= 0 ? 0 : ( l >= 984 ? 984 : l);
                oSpan.style.left = l+'px';
                oDiv.style.width = l+'px';
                document.onmouseup = function(){
                    document.onmousemove = null;
                }
            }
        }

淘宝验证
  <section>
        <div></div>
        <span></span>
    </section>
    <script src='../../myAPi/myApi.js/myAPI.js'></script>
    <script>
        var
            oSpan = $('span')[0],
            oDiv = $('div')[0];
        var speed = 10;
        oSpan.onmousedown = function (e) {
            e = e || window.event;
            preventDefault(e);
            var x = e.offsetX;
            document.onmousemove = function (e) {
                e = e || window.event;
                preventDefault(e);
                //获取元素距左侧的位置
                var sectionLeft = oSpan.parentNode.offsetLeft;
                //获取鼠标的位置
                var l = e.clientX - x - sectionLeft;
                console.log(l);
                //对运动边界的处理
                l = l <= 0 ? 0 : (l >= 964 ? 964 : l);
                oSpan.style.left = l + 'px';
                oDiv.style.width = l + 'px';
                //如果拖拽到最右侧,改变div颜色
                if (l == 964) {
                    oDiv.style.background = 'green';
                }
                document.onmouseup = function () {
                    document.onmousemove = null;
                    //判断div是否拖拽到最右侧
                    if (oDiv.offsetWidth < 964) {
                        //div和span 回归到原点
                        var timer = setInterval(function(){
                            //定时器控制div的宽
                            oDiv.style.width = oDiv.offsetWidth - speed + 'px';
                            //控制span向left移动
                            oSpan.style.left = oSpan.offsetLeft - speed + 'px';
                            //通过div的宽,关闭定时器
                            if (oDiv.offsetWidth < speed) {
                                //注:关闭定时器不要加引号,加引号会成为字符串,识别不了
                                clearInterval(timer);
                                oDiv.style.width = 0;
                                oSpan.style.left = 0;
                            }
                        }, 30)
                    }
                }
            }
        }


//魅族验证
<body>
    <section>
        <article></article>
        <span></span>
    </section>
    <div>
        <h2></h2>
    </div>
    <script src="../../myAPi/myApi.js/myAPI.js"></script>
    <script>
        var
            oH2 = document.querySelector('h2'),
            oDiv = document.querySelector('div'),
            oSpan = document.querySelector('span');
        oH2.onmousedown = function (e) {
            e = e || window.event;
            preventDefault(e);
            var x = e.offsetX;
            document.onmousemove = function (e) {
                e = e || window.event;
                preventDefault(e);
                var l = e.clientX - x - oDiv.offsetLeft;
                l = l <= 0 ? 0 : (l >= 270 ? 270 : l);
                oH2.style.left = l + 'px';
                //小图随着下面的图移动
                oSpan.style.left = l + 'px';
                document.onmouseup = function () {
                    document.onmousemove = null;
                    //判断验证是否成功
                    if (oSpan.offsetLeft >= 190 && oSpan.offsetLeft <= 210) {
                        alert('验证成功');
                        oSpan.style.left = '200px';
                        oH2.style.left = '200px';
                    } else {
                        alert('验证失败');
                        oSpan.style.left = 0;
                        oH2.style.left = 0 ;
                    }
                }
            }

        }
    </script>

九 checked

获取复选框的状态
     
     checkbox.checked   true(当前为选择状态) false(未选择状态)
     
     if(checkbox.checked){}

更改复选框的状态
     checkbox.checked = true;//选中

     checkbox.checked = false;//取消

  var 
            aInput = document.querySelectorAll('input');
            aSpan = document.querySelector('span');
            aSpan.onclick = function(){
                for(var i = 0 ;i < aInput.length;i++){
                    //未被选中时false
                    if(aInput[i].checked){
                        aInput[i].checked = false;
                    }else{
                        aInput[i].checked = true;
                    }
                }
            }