DOM实战

作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主。有不正确的地方,欢迎批评指正

视频来源:https://www.bilibili.com/video/av26087098

DOM

课程内容介绍

1.1 DOM与BOM的概念

 文档结构树

 BOM与DOM完整结构图

 document对象

 示例代码 document

<script>
    // document.URL  可以获取当前文档的地址
    console.log( window.document.URL );

    // document.title   获取或者是设置  head标签中的title标签的文本内容
    console.log( window.document.title );

    document.title = "我学习的视频是老马前端系列视频";

    console.log( document.title );
    //  输出编码
    console.log( document.charset );
    </script>

示例代码  浏览器时钟

 <script>
    //  window.setIntervar()
    //  可以传两个参数
    //  1 要执行的代码段(可以是一个函数,也可以是一段代码字符串)
    //  2 要间隔执行代码段的毫秒数

    var t = setInterval(function(){
        // console.log(1);
        console.log(new Date());
    },1000);
    
    //不推荐使用  代码字符串的方式
    // setInterval("console.log(new Date());",2000);

    //setTimeout(fun,delay); //延迟delay毫秒之后,执行代码段(函数)但只执行一次
    setTimeout(function(){
        console.log( "laoma" );
        console.log( t );
        clearInterval( t ); //停止间断循环执行的setInterval
    },5000);

    </script>

案例

示例代码   跑马灯

 <script>
    // console.log( document.title );
    // 没隔0.5s 让title的最后一个文字放到title的最前面去
    // 1s = 1000ms
    setInterval(function(){
        //  让title最后一个文字放到title最前面去
        //  使用字符数组的方法
        // 数组   pop 方法可以从数组的最后一个位置弹出一个元素
                //unshift方法可以从数组的头部添加元素
                
        // 字符串转字符数组
        var charArray = document.title.split("");
        // 让字符数组的最后一个元素出数组
        var lastChar = charArray.pop();
        // 把最后一个元素查到数组的开头
        charArray.unshift( lastChar );
        // 把字符数组转成字符串
        var newTitle = charArray.join( "" );
        // 把新的标题改到浏览器上去
        document.title = newTitle;

    },500);
    </script>

 示例代码  跑马灯slice方法

<script>
    //  实现跑马灯
    var intervalID = setInterval(function(){
        //  拿到当前的页面的title
        var oldTitle = document.title;

        //  拿到当前页面title的最后一个字符
        //  slice方法,可以接受两个参数
        //  第一个参数 截取字符串起始位置  第二个参数 技术位置
        //  slice方法不影响原来的字符串,截取到最后一个字符串的前一个位置
        var lastChar = oldTitle.slice( oldTitle.length - 1 );

        var beforeStr = oldTitle.slice( 0,oldTitle.length - 1 );
        document.title = lastChar + beforeStr;

    },500);

    //  5秒钟之后,执行清除时钟的代码

    setTimeout(function(){
        clearInterval( intervalID );
    },5000);
    
    </script>

 访问DOM树上的节点

 getElementById

 示例代码

<body>
    <!-- p#p${段落$}*3 -->
    <p id="p1">段落1</p>
    <p id="p2">段落2</p>
    <p id="p3">段落3</p>

    <div class= "" id = "d1"></div>
    <script>
    //  根据标签的id的值在文档中搜索标签
    var elementP = document.getElementById( "p2" );
    console.log( elementP );

    //elementP → HTMLParagraphElement(段落标签原型) → HTMLElement(所有HTML标签的基类  接口) → Element → Node → EventTarget → Object → null
    //接口  有自己规定的方法  属性  但必须有子类给他实现  Element Node
    //类型  可直接创建实例  比如 Number类型
    var d1 = document.getElementById( "d1" );
    //d1 => HTMLDivElement

    var d2 = document.getElementById( "ufsoi" );
    //d2 => null   一般情况下如果函数没有具体的值,一般都会返回null
    </script>
</body>

 Element 元素对象接口详解

 示例代码

<body>
    <div id = "d1" class = "ts" laoma = "sss" >
        <span>你好</span>
        <p>大家好</p>
    </div>
    <script>
    //  获取到id = d1 的div标签
    var d1 = document.getElementById( "d1" );
    //  d1 HTMLDivElement HTMLElement   Element

    //  d1.attributes();    //属性
    console.log( d1.attributes );
    //  d1.attributesa(0)
    console.log( d1.attributes.item(0) );

    //  设置属性的值
    d1.setAttribute( "laoma","123" );
    console.log(d1.getAttribute("class"));

    console.log( d1.className );
    console.log( d1.id );

    //  删除属性
    d1.removeAttribute( "laoma" );
    
    </script>
</body>
getElementsByTagName

示例代码

<body>
    <p>1-1</p>
    <p>2-2</p>
    <p>3-3</p>
    <p>4-4</p>
    <h1>我是老马</h1>
    <div class = "tem" >混淆</div>
    <script>
    //  把页面中所有的p标签选择出来
    //  获取当前文档中的所有p标签
    var array = document.getElementsByTagName( "p" );
    //  此方法返回  HTMLCollection 集合对象  是一个伪数组
    //  array → HTMLCollection → Object.prototype
    console.log( array );

    //  要求吧当前页面中所有p标签的内部文字打印
    for( i = 0;i < array.length;i++ ){
        console.log( array[i].innerHTML );
    }
    //伪数组变数组
    var a = Array.prototype.slice.call(array,0);
    
    console.log( a );
    </script>
</body>

HTMLCollection

示例代码

<body>
    
    <p name = "p1">k1</p>
    <p name = "p2">k2</p>
    <div name = "dd1" class="pss1">hi  div1</div>
    <div name = "dd1" class="pss2">hi  div2</div>
    <div name = "dd1" class="pss3">hi  div3</div>
    <script>
    //  把当前页面中所有的标签都获取来
    var all = document.getElementsByTagName( "*" );

    //  all =>  HTMLCollection
    for( var i = 0;i < all.length;i++ ){
        console.log( all[i] );
    }
    //  HTMLCollection  是动态集合   当标签发生变化的时候,HTMLCollection会自动更新同步
    //  HTMLCollection item() 通过索引获取标签对象 Element 同[]  

    var a = Array.prototype.slice.call( all,0 ); 
    console.log( a );
    </script>
</body>

 querySelector

支持IE8及其以上版本

示例代码

<body>
    <div class = "c1">第一个div</div>

    <p class = "tm">老马的qq学习视频</p>

    <h3 id = "tmd">这里有好山好水好风景</h3>
    <script>
    //  querySelector可以接受一个css的选择器字符串作为参数,来搜索页面中的标签元素
    var element1 = document.querySelector( ".c1" );
    console.dir( element1 );

    var p1 = document.querySelector( ".tm" );
    console.dir( p1 );

    var h = document.querySelector( "#tmd" );
    console.dir( h );
    
    var p2 =document.querySelector( "p .c" );
    console.dir( p2 );  //null
    </script>
</body>

 querySelectorAll案例

示例代码

<body>
    <p>ss1</p>
    <p class = "tm">ss2</p>
    <p class = "tm">ss3</p>


    <script>
    //  querySelectorAll案例
    //  把页面中所有的p标签包含tm像是类的标签选出来
    var arr = document.querySelectorAll( "p.tm" );
    //  arr 伪数组不会自动更新
    //  arr 是一个NodeList接口的示例。NodeList的原型是 Object.prototype
    console.log( arr );

    //  用forEach接收一个函数对数组中的元素进行处理
    //  函数第一个参数是数组的元素,第二个参数是元素对应的索引
    arr.forEach( function(elem,index){
        console.log( index + ":" + elem.innerHTML );
    } );

    </script>
</body>

 NodeList对象节点集合

 了解Node对象(接口)

 

DOM继承关系图

 1.3 事件

 

 事件的概念

 

 元素绑定事件

 

 第一种示例代码  不推荐

<body>
    <p onclick="alert('123')">前端学习</p>
    <input type="button" value="点击我" onclick="alert('点击了')">
</body>

 上述代码分析

事件源:p标签
事件名:onclick
事件行为:window.alert('123')

 代码的方法对标签进行绑定事件示例代码

<body>
    <div id = "tm">
        前端学习视频
    </div>

    <script>
    //  第一步拿到  要绑定事件的div
    var d = document.querySelector( "#tm" );    ///id选择器
    d.onclick = function(){
        alert( "123" );
    };
    //  事件的三个要素:1div对象  2onclick  3行为 匿名函数

    //这种绑定事件的方式,只能绑定一个方法
    // d.onclick = function(){
    //     console.log( 1 );
    // };
    </script>
</body>

案例

 示例代码

<body>
    <ul id="cityList">
        <li>背景1</li>
        <li>背景2</li>
        <li>背景3</li>
        <li>背景4</li>
        <li>背景5</li>
    </ul>
    <script>
    //  第一种方法
    //  给所有的li标签绑定点击事件,并且弹出li标签的内容
    //  第一步,先找到所有的li标签
    // var liNodeList = document.querySelectorAll( "#cityList li" );
    // liNodeList.forEach(function(element,index){
    //     //  绑定点击事件
    //     element.onclick = function(){
    //         alert( this.innerHTML );
    //     };
    // });
    //  li标签的事件响应方法都是一样的,没必要每循环一次创建一个响应事件函数对象
    
    // 第二种方法 优化方法
    var liNodeList = document.querySelectorAll( "#cityList li" );
    liNodeList.forEach(function(element,index){
        //  绑定点击事件响应方法 指向一个声明的函数
        element.onclick = liOnClickHander;
    });
    //  li标签点击时候出发执行的事件响应方法
    function liOnClickHander(){
            alert( this.innerHTML );
    };
    
    </script>
</body>

 事件流

 

 

 示例代码

<!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>事件流</title>
    <style>
    div {
        border:1px solid red;
    }
    
    .parent {
        height: 200px;
         200px;
        padding: 30px;
        background-color: pink;
    }
    .child {
        height: 100px;
         100px;
        background-color: yellow;
    }
    
    </style>
</head>
<body>
    <div class="parent">
        我是父div
        <div class="child">
            我是子div
        </div>
    </div>

    <script>
    //  事件流  本案例会发生冒泡
    //  点击了子元素标签的时候,父元素绑定的点击事件也会被执行:原因事件魔炮
    //  给父元素绑定一个点击事件  点击子元素,看是否事件响应方法执行

    var parentDiv = document.querySelector( ".parent" );

    parentDiv.onclick = function(){
        alert( "我是父div触发" );
    };
    
    window.onclick = function(){
        alert( "我是window触发" );
    }
    </script>
</body>
</html>

绑定事件(DOM2级)

 示例代码

<!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>addEventListener案例</title>
    <style>
    div {
        border:1px solid red;
        background-color: pink;
    }
    .parent {
        height: 200px;
         200px;
        padding: 30px;
    }
    .child {
         100px;
        height: 100px;
        background-color: yellow;
    }
    </style>
</head>
<body>
    <input id="btn" type="button" value="点击我">
    <div class="parent">
        父亲div
        <div class="child"> 
            子div
        </div>

    </div>
    
    <script>
    //  拿到了按钮的DOM元素对象
    var btn = document.querySelector( "#btn" );
    //  第一种 DOM的绑定方式
    //  btn.onclick = function(){
    //      alert( "点击我的响应" );
    //  };
    // 缺点:  1 不能绑定多个事件处理程序
    //         2 只能在冒泡阶段执行事件响应程序 
    

    //  第二种绑定事件的方式  传递三个参数
    //  第一个参数是 事件类型字符串不带on
    //  第二个参数是 事件处理程序
    //  第三个参数是 是否在捕获阶段执行事件处理程序

    btn.addEventListener("click",function(){
        alert( "按钮被点击1" );
    },false);
    //  给一个按钮的点击事件绑定了两个事件处理程序
    btn.addEventListener("click",function(){
        alert( "按钮被点击2" );
    },false);
    //  DOM2绑定事件的方式  事件执行顺序是注册的事件处理程序顺序

    //  控制在捕获阶段执行事件的响应函数
    var parentDiv = document.querySelector( ".parent" );
    var childDiv = document.querySelector( ".child" );

    //  捕获阶段执行事件处理程序
    // parentDiv.addEventListener("click",function(){
    //     alert( "父div" );
    // },true);
    // childDiv.addEventListener("click",function(){
    //     alert( "子div" );
    // },true);

    //  冒泡阶段执行事件响应程序
    parentDiv.addEventListener("click",function(){
        alert( "父div" );
    },false);
    childDiv.addEventListener("click",function(){
        alert( "子div" );
    },false);
    </script>
</body>
</html>

 案例

 

 示例代码

<!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>五角星案例</title>
    <style>
        div {
            font-size:30px;
            cursor:pointer;
        }
    </style>
</head>
<body>
    <div class="wjx-wrap">
        <span>☆</span>
        <span>☆</span>
        <span>☆</span>
        <span>☆</span>
        <span>☆</span>
    </div>

    <script>
    //  五角星案例
    //  拿到所有的五角星的span的NodeList集合
    var wjxList = document.querySelectorAll( ".wjx-wrap span" );

    // //  给所有的五角星绑定点击事件
    // wjxList.forEach( function(element,index){
    //     element.addEventListener("click",function(){
    //         //  先把所有的五角星设置为空心
    //         wjxList.forEach( function(ele,ind){
    //             ele.innerHTML = "☆";
    //         } );
    //         //  再把选中的五角星设置为实心
    //         element.innerHTML = "★";
    //     },false);
    // } );


    //  循环注册事件的时候,一定要注意内存消耗的问题
    wjxList.forEach( function(element,index){
        element.addEventListener("click",wjxClickHandler,false);
    } );

    //  五角星点击事件的处理程序
    function wjxClickHandler(){
            //  先把所有的五角星设置为空心
            wjxList.forEach( function(ele,ind){
                ele.innerHTML = "☆";
            } );
            //  再把选中的五角星设置为实心
            //  在事件处理函数的 作用域中,this就指向当前注册事件的标签元素
            this.innerHTML = "★";
        }
    </script>
</body>
</html>

 示例代码

<!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>自动添加li标签效果</title>
</head>
<body>
    <input id="btnAdd" type="button" value="添加">
    <ul class="list">

    </ul>
    <script>
    //  拿到btn按钮
    var btnAdd = document.querySelector( "#btnAdd" );   //ie8开始支持
    var index = 1;
    btnAdd.addEventListener("click" ,function(){
        //  拿到ul标签
        var list = document.querySelector( ".list" );
        list.innerHTML += "<li>" + index + "</li>";
        index++;
    },false);   //ie8都不支持
    
    </script>
</body>
</html>

 解除绑定事件(DOM2级)

 

 代码示例

<!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>解除事件绑定</title>
</head>
<body>
    <input type="button" value="点击按钮" id="btnClick">
    <input type="button" value="解除绑定事件" id="btnRemove">
    
    <input type="button" value="按钮3" id="btn3">
    <script>
        var btnClick = document.querySelector("#btnClick");
        var btnRemove = document.querySelector("#btnRemove");

        //  DOM0绑定事件
        btnClick.onclick = function(){
            alert( "DOM0 级点击事件" );
        };

        //  DOM2绑定事件
        btnRemove.addEventListener("click",function(){
            //  给btnClick按钮的DOM0事件解除绑定
            btnClick.onclick = null;
            //  给btnClick按钮解绑DOM2级别的事件
            btnClick.removeEventListener("click",btnClickHander);
        });

        //  DOM2级事件绑定和解绑
        btnClick.addEventListener("click",btnClickHander);
        
        //  事件处理程序
        function btnClickHander(){
            alert("DOM2级的绑定事件");
        }
    
        //以下方法不正确  因为两个function不是同一对象
        var btn3 = document.querySelector("#btn3");
        btn3.addEventListener('click',function(){
            alert("3");
        });
        btn3.removeEventListener('click',function(){
            alert("3");
        });

    </script>
</body>
</html>

 IE8的事件绑定和解绑

 检查命令应用的浏览器版本:https://caniuse.com/#search=addEvent

<!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>IE的事件绑定程序</title>
</head>
<body>
    <!-- 此案例在IE8910可以用  在chrome和ie11不能用 -->
    <input type="button" value="点击" id="btn">
    <input type="button" value="解绑" id="btnDetach">
    <script>
    //  获取按钮btn
    var btn = document.getElementById("btn");
    var btnDetach = document.getElementById("btnDetach");

    //  给IE浏览器绑定点击事件
    btn.attachEvent( "onclick",k );
    btnDetach.attachEvent("onclick",function(){
        //  对IE浏览器进行解绑事件
        btn.detachEvent( "onclick",k );
    });
    //  事件处理程序
    function k(){
        alert( "ok" );
    }
    </script>
</body>
</html>

 跨浏览器兼容绑定事件

 示例代码

<!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>事件绑定兼容处理</title>
</head>
<body>
    <input type="button" value="点击" id="btn">
    <script>
    //  兼容ie和其他浏览器
    var btn = document.querySelector("#btn");

    //  所有刘浏览器都兼容DO0的注册绑定事件的方法
    //  btn.onclick = funtion(){
        // alert("ok");
    // };

    //  兼容ie浏览器和其他浏览器的兼容方法

    if( btn.addEventListener ){
        btn.addEventListener( "click",clickHandler );
    }else{
        btn.attachEvent( "onclick",clickHandler );
    }
    
    function clickHandler(){
        alert( "兼容处理" );
    }
    </script>
</body>
</html>

 事件响应方法的执行顺序

 示例代码

<!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>事件注册的执行顺序</title>
</head>
<body>
    <input type="button" value="点击" id="btn">
    <script>
    var btn = document.getElementById("btn");
    //  DOM0的绑定事件响应方法
    btn.onclick = function(){
        alert("DOM0");
    };
    //  DOM2的绑定事件的方式
    if(btn.addEventListener){
        btn.addEventListener("click",function(){
            alert("DOM2  1");
        });
        btn.addEventListener("click",function(){
            alert("DOM2  2");
        });
        btn.addEventListener("click",function(){
            alert("DOM2  3");
        });
    }else{
        btn.attachEvent("onclick",function(){
            alert("DOM2 IE 1");
        });
        btn.attachEvent("onclick",function(){
            alert("DOM2 IE 2");
        });
        btn.attachEvent("onclick",function(){
            alert("DOM2 IE 3");
        });
    }
    </script>
</body>
</html>

 1.4 事件对象

 

 示例代码

<!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>事件对象</title>
</head>
<body>
    <input type="button" value="按钮" id="btn">
    <script>
    var btn = document.getElementById("btn");
    //  DOM0绑定事件的方式,兼容性最好
    btn.onclick = function(e){
        //  标准浏览器,e就是事件对象
        //  IE浏览器中是通过window.event属性获取当前的事件对象
        e = e ? e : window.event;
        console.dir(e);

        //  e.target;//事件源
        //  e.serElement;//ie
        if(e.target === this){
            //  判断事件是自己触发的还是冒泡来的
        }
    };
    </script>
</body>
</html>

 阻止事件冒泡与默认行为

阻止事件冒泡

 示例代码

<!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>阻止事件冒泡</title>
    <style>
    div {
        height: 200px;
         200px;
        border: 1px solid red;
        text-align: center;
        line-height: 200px;
    }
    </style>
</head>
<body>
    <div id="box">
        <input type="button" value="子元素" id="btn">
    </div>
    <script>
    var box = document.getElementById("box"),
        btn = document.getElementById("btn");
    
    box.onclick = function(e){
        alert("div");
    };
    
    btn.onclick = function(e){
        alert("btn");
        //  阻止自按钮的点击事件冒泡到父盒子的方法
        e = e || window.event;
        if( e.stopPropagation ){
            e.stopPropagation();    //标准浏览器  阻止事件冒泡
        }else{
            e.cancelBubble = true;  //IE8及以下  阻止事件冒泡
        }
    };
    </script>
</body>
</html>

 阻止事件捕获

示例代码

<!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>阻止事件捕获</title>
    <style>
    div {
         200px;
        height: 200px;
        border: 1px solid red;
        text-align: center;
        line-height: 200px;
    }
    </style>
</head>
<body>
    
    <div id = "pDiv">
        <input type="button" value="按钮" id="btn">
    </div>
    <script>
    var pDiv = document.getElementById("pDiv");
    var btn = document.getElementById("btn");
    pDiv.addEventListener("click",function(e){
        alert("父div");
        e.stopPropagation();    //阻止事件冒泡或者事件捕获
    },true);
    
    btn.addEventListener("click",function(){
        alert("子btn");
    },true);
    </script>
</body>
</html>

阻止默认行为 

示例代码

<!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>阻止默认行为</title>
</head>
<body>
    <a id="baidu" href="http://www.baidu.com">百度</a>
    <script>
        var baidu = document.getElementById("baidu");
        baidu.onclick = function(e){
            //  兼容处理事件对象
            e = e || window.event;
            //  标准浏览器
            if(e.preventDefault){
                e.preventDefault();   //阻止默认行为
            }else{
                e.returnValue = false;  //兼容IE8及其以下
            }
            return false;   //返回值给一个false,也可以实现阻止默认行为
        };
    </script>
</body>
</html>

事件处理程序的返回值

 示例代码

<!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>阻止表单提交</title>
</head>
<body>
    <form action="#">
        用户名:<input type="text" name="txt" id="txtName">
        <hr>
        <input type="submit" value="提交" id="btnSub">
    </form>
    <script>
        var btnSub = document.getElementById("btnSub");
        btnSub.onclick = function(e){
            e = e || window.event;
            return false;   //可以阻止表单的提交
        };
    </script>
</body>
</html>

 案例

 示例代码

<!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>keypress</title>
</head>
<body>
    <input type="text" id="txt">
    <hr>
    <input type="number" name="" id="">
    <script>
    var txt = document.getElementById("txt");
    //  onkeypress事件,当 键盘上键被按下的时候回触发
    txt.onkeypress = function(e){
        e = e || window.event;
        
        //  事件对象中的keyCode属性就是按下的键盘上的键的编码
        //  console.log(e.keyCode);
        //  0=>48    9=>57
        if( e.keyCode < 48 || e.keyCode > 57 ){
            console.log( e.keyCode );
            return false;
        }
    };
    
    </script>
</body>
</html>

 提醒用户是否离开

<!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>提醒用户是否离开</title>
</head>
<body>
    <form action="http://www.baidu.com">
        用户名:<input type="text" name="" id="">
        <hr>
        <input type="submit" value="提交" id="">
    </form>
    <script>
    window.onbeforeunload = function(){
        return "您是否要离开";
        //  返回一个字符串,浏览器在跳转其他页面或者关闭的时候,会提醒用户
    }; 
    </script>
</body>
</html>

 示例代码

<!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>提醒用户是否离开</title>
</head>
<body>
    <form action="http://www.baidu.com">
        用户名:<input type="text" name="" id="txtName">
        <hr>
        <input type="submit" value="提交" id="btnSub">
    </form>
    <script>
    window.onbeforeunload = function(){
        return "您是否要离开";
        //  返回一个字符串,浏览器在跳转其他页面或者关闭的时候,会提醒用户
    }; 


    // DOM0的
    var txtName = document.getElementById("txtName");
    var btnSub = document.getElementById("btnSub");

    // btnSub.onclick = function(){
    //     //取消默认操作(DOM0级中)  可以使用return false
    //     //判断用户名的文本是否为空
    //   if( !txtName.value ){
    //       alert( "用户名不能为空" );
    //       return false; //所有浏览器都支持,但是只能在DOM0绑定事件中使用
    //   }  
    // };

    //DOM2的
    if( btnSub.addEventListener ){
        //  标准浏览器
        btnSub.addEventListener("click",btnSubHandler,false);
    }else{
        btnSub.attachEvent("onclick",btnSubHandler);
    }
    //  提交按钮的事件处理程序
    function btnSubHandler(e){
        e = e || window.event;
       
        if( !txtName.value ){
            //  取消默认行为,取消表单提交
            alert( "用户名不能为空" );
            if(e.preventDefault){
                e.preventDefault(); //标准浏览器阻止默认行为
            }else{
                e.returnValue = false;  //IE8
            }
         
        }
    }
    </script>
</body>
</html>

1.5 事件类型

文档加载完成事件

 示例代码

<!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>onload</title>
</head>
<body>
    <script>
    //  页面的内容全加载完成后,才触发此事件
    window.onload = function(){
        var btn = document.getElementById("btn");
        btn.onclick = function(){
            console.log("ok");
            alert("1");
        };
    };
    
    </script>
    <input type="button" id="btn" value="点击">
</body>
</html>

 示例代码

<!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>window的加载事件优化</title>
    <script>
    //  兼容以下  标准浏览器和ie浏览器,在文档加载完成后立即绑定事件
    //  ie9以上才支持
    // document.addEventListener('DOMContentLoaded',function(e){
    //     console.log("DOMContentLoaded");
    //     //  给按钮绑定事件
    //     var btn = document.getElementById("btn");

    //     btn.addEventListener("click",function(e){
    //         alert("ok");
    //     },false);
    // },false);
    
    //  document.onDOMContentLoaded = function(){};

    //  所有的窗口中元素都加载完成后才触发(不包括ajax请求内容)
    //  window.onload = function(){console.log("window.onload");};

    //  ie8 文档加载完成后就立即绑定dom事件
    // document.onreadystatechange = function(e){
    //     console.log(document.readyState);
    //     if( document.readyState == "interactive" ){
    //         var btn = document.getElementById("btn");
    //         btn.onclick = function(){
    //             alert("ok");
    //         };
    //     }
    // };

    //  jQuery 实现文档加载完成后事件的原理
    document.myReady = function( callback ){
        //  封装标准浏览器和ie浏览器
        if( document.addEventListener ){
            document.addEventListener("DOMContentLoaded",callback,false);
        }else if(document.attachEvent){
            //  兼容IE8及以下的浏览器
            document.attachEvent("onreadystatechange",function(){
                //  文档的状态为interactive表示,文档dom对象可以进行访问
                if(document.readyState == "interactive"){
                    callback(window.event);
                }
            });
        }else{  //  其他特殊情况
            window.onload = callback;
        }
    };

    
    document.myReady(function(e){
        //  注册事件
        var btn = document.getElementById("btn");
        btn.onclick = function(){
            alert("ok2");
        };
    });


    </script>
</head>
<body>
    <input type="button" value="按钮" id="btn">
</body>
</html>

 窗口事件

 示例代码

<!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>onscroll</title>
</head>
<body>
    <h1>1</h1>
    <h1>2</h1>
    <h1>3</h1>
    <h1>4</h1>
    <h1>5</h1>
    <h1>6</h1>
    <h1>7</h1>
    <h1>8</h1>
    <h1>9</h1>
    <h1>10</h1>
    <h1>11</h1>
    <h1>12</h1>
    <h1>13</h1>
    <h1>14</h1>
    <h1>15</h1>
    <h1>16</h1>
    <h1>17</h1>
    <h1>18</h1>
    <h1>19</h1>
    <h1>20</h1>
    <h1>21</h1>
    <h1>22</h1>
    <h1>23</h1>
    <h1>24</h1>
    <h1>25</h1>
    <script>
    //  scroll 事件会进行重复触发
    window.onscroll = function(e){
        console.log("scroll");
        console.log(window.pageYOffset);
        //  window.pageXOffset  //都是标准浏览器才有的
        //  ie不支持pageXOffset  pageYOffset

        console.log(document.documentElement.scrollTop || document.body.scrollTop);
        //                  ie支持                                 标准浏览器支持
    };
    
    </script>
</body>
</html>

 滚动案例1

 示例代码 滚动

<!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>滚动案例</title>
    <script src="../js/documentReady.js"></script>
    <script>
    document.myReady(function(){
        window.onscroll = function(){
            //  拿到滚动的距离
            var scrollH = document.documentElement.scrollTop || document.body.scroll;
            //  拿到整个网页的高度
            var pageH = document.body.clientHeight;
            //  拿到整个窗口的高度
            var viewportH = document.documentElement.clientHeight;
            
            //  底部的高度   = 整个网页高度 - 滚动高度 - 窗口高度
            var bottomH =   pageH - scrollH - viewportH;
            if( bottomH < 50 ){
                var list = document.getElementById("list");
                var tempstr = "";
                for( var i=0;i < 10;i++  ){
                    tempstr += "<li>"+ new Date() +"</li>";
                }
                list.innerHTML += tempstr;
            }
        };
    });
    
    
    </script>
</head>
<body>
    <ul id="list">
        <li>
            <h1>1</h1>
        </li>
        <li>
            <h1>2</h1>
        </li>
        <li>
            <h1>3</h1>
        </li>
        <li>
            <h1>4</h1>
        </li>
        <li>
            <h1>5</h1>
        </li>
        <li>
            <h1>6</h1>
        </li>
        <li>
            <h1>7</h1>
        </li>
        <li>
            <h1>8</h1>
        </li>
        <li>
            <h1>9</h1>
        </li>
        <li>
            <h1>10</h1>
        </li>
        <li>
            <h1>11</h1>
        </li>
        <li>
            <h1>12</h1>
        </li>
        <li>
            <h1>13</h1>
        </li>
        <li>
            <h1>14</h1>
        </li>
        <li>
            <h1>15</h1>
        </li>
        <li>
            <h1>16</h1>
        </li>
        <li>
            <h1>17</h1>
        </li>
        <li>
            <h1>18</h1>
        </li>
        <li>
            <h1>19</h1>
        </li>
        <li>
            <h1>20</h1>
        </li>
        <li>
            <h1>21</h1>
        </li>
        <li>
            <h1>22</h1>
        </li>
        <li>
            <h1>23</h1>
        </li>
        <li>
            <h1>24</h1>
        </li>
        <li>
            <h1>25</h1>
        </li>
        <li>
            <h1>26</h1>
        </li>
        <li>
            <h1>27</h1>
        </li>
        <li>
            <h1>28</h1>
        </li>
        <li>
            <h1>29</h1>
        </li>
        <li>
            <h1>30</h1>
        </li>
        <li>
            <h1>31</h1>
        </li>
        <li>
            <h1>32</h1>
        </li>
        <li>
            <h1>33</h1>
        </li>
        <li>
            <h1>34</h1>
        </li>
        <li>
            <h1>35</h1>
        </li>
        <li>
            <h1>36</h1>
        </li>
        <li>
            <h1>37</h1>
        </li>
        <li>
            <h1>38</h1>
        </li>
        <li>
            <h1>39</h1>
        </li>
        <li>
            <h1>40</h1>
        </li>
    </ul>
</body>
</html>

 滚动案例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>hao123页面滚动固定定位</title>
    <style>
    body,div,h1 {
        padding: 0;
        margin:0;
    }
    .top-wrap {
        height: 150px;
        background-color: pink;
    }
    .top-logo-wrap {
        height: 50px;
        background-color: green;
    }
    .top-search-wrap {
        height: 100px;
         100%;
        background-color: yellowgreen;
    }
    .top-search-wrap-fixed {
        position: fixed;
        top:0;
        left: 0;
    }
    </style>
    <script src="../js/documentReady.js"></script>
    <script>
    document.myReady(function(){
        //  当页面滚动到50像素的时候   让搜索的div进行固定定位
        var searchBox = document.getElementById("searchBox");
        window.onscroll = function(){
            //  拿到滚动的距离
            var scrollH = document.documentElement.scrollTop || document.body.scrollTop;
            if( scrollH > 50 ){  
                //  让搜索的div设置上样式 top-search-wrap-fixed
                searchBox.className ="top-search-wrap top-search-wrap-fixed";
            } else {
                searchBox.className ="top-search-wrap";
            }
        };
    });
    
    
    </script>
</head>
<body>
    <div class = "top-wrap">
        <div class="top-logo-wrap">可以卷进去的顶部</div>
        <div id="searchBox" class="top-search-wrap">固定定位的</div>
    </div>
    <h1>1</h1>
    <h1>2</h1>
    <h1>3</h1>
    <h1>4</h1>
    <h1>5</h1>
    <h1>6</h1>
    <h1>7</h1>
    <h1>8</h1>
    <h1>9</h1>
    <h1>10</h1>
    <h1>11</h1>
    <h1>12</h1>
    <h1>13</h1>
    <h1>14</h1>
    <h1>15</h1>
    <h1>16</h1>
    <h1>17</h1>
    <h1>18</h1>
    <h1>19</h1>
    <h1>20</h1>
</body>
</html>

 焦点事件

 示例代码

<!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>焦点事件</title>
</head>
<body>
    <input type="text" name="" id="txt1">
    <input type="text" name="" id="txt2">
    <input type="button" value="txt2获得焦点" id="btnFocus2">

    <script>
    window.onload = function(){
        var txt1 = document.getElementById("txt1");
        txt1.onfocus = function(){
            console.log("获得焦点");
        };
        txt1.onblur = function(){
            console.log("失去焦点");
        };

        var btnFocus2 = document.getElementById("btnFocus2");
         .onclick = function(){
            //  通过js代码设置文本框获得 焦点
            document.getElementById("txt2").focus();
        };
    };
    </script>
</body>
</html>

焦点事件案例

 

 示例代码

<!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>焦点事件</title>
</head>
<body>
    <input type="text" name="" id="txt1">
    <input type="text" name="" id="txt2">
    <input type="button" value="txt2获得焦点" id="btnFocus2">

    <script>
    window.onload = function(){
        var txt1 = document.getElementById("txt1");
        txt1.onfocus = function(){
            console.log("获得焦点");
        };
        txt1.onblur = function(){
            console.log("失去焦点");
        };

        var btnFocus2 = document.getElementById("btnFocus2");
        btnFocus2.onclick = function(){
            //  通过js代码设置文本框获得 焦点
            document.getElementById("txt2").focus();
        };

        //  要实现:文本框 2 不能为空
        var txt2 = document.getElementById("txt2");
        txt2.onblur = function(){
            //  判断文本框2的value属性是否为空
            if( txt2.value == "" ){
                //  如果为空 ,则让文本框2继续获得焦点
                txt2.focus();
                //  让文本框的边框设置为红色
                txt2.style.borderColor = "red";
            }else{
                txt2.style.borderColor = "";
            }
        };
    };
    </script>
</body>
</html>

 示例代码

<!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>文本框显示案例</title>
</head>
<body>
    <input type="text" placeholder="老马" id="">
    <input type="text" value="老马" id="txt2">
    <script>
    window.onload = function(){
        var txt2 = document.getElementById("txt2");
        //  文档加载完成后,直接设置提示文本为灰色
        txt2.style.color = "#ccc";
        //  文本框2 获得焦点时候,判断文本框值是否等于老马,如果是清空
        txt2.onfocus = function(){
            if( txt2.value == "老马" ){
                txt2.value = "";

                txt2.style.color = "#000";
            }
        };
        //  文本框2 离开加点的时候,判断文本框的值是否为空,空则设置回老马
        txt2.onblur = function(){
            if( txt2.value == "" ){
                txt2.value = "老马";

                txt2.style.color = "#ccc";
            }
        };
    };
    
    </script>
</body>
</html>

 文本框弹出提示选择框案例

<!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>文本框弹出提示选择案例</title>
    <style>
    html,body,div,ul,li,input {
        margin: 0;
        padding:0;
    }
    ul {
        list-style: none;
    }
    .search-box-wrap {
        margin:0 auto;
         300px;
        height: 400px;
        padding-top:30px;
        position: relative;
    }
    .search-box-wrap .list{
        border: 1px solid #ddd;
        198px;
        display: none;
        position: absolute;
    }
    .search-box-wrap .list li{
        height: 25px;
        line-height: 25px;
        padding-left: 5px;
    }
    .search-box-wrap .list li:hover {
        background-color: #eee;
        cursor: pointer;
    }
    .txt-search {
        border- 2px;
         191px;
        height: 20px;
        padding-left: 5px;
        line-height: 20px;
    }
    </style>
</head>
<body>
    <div class="search-box-wrap">
        <input type="text" id="txtSearch" class="txt-search">
        <ul class="list" id="tipList">
            <li>老马1</li>
            <li>老马2</li>
            <li>老马3</li>
            <li>老马4</li>
            <li>老马5</li>
        </ul>
    </div>
    <script>
        //  当文本框获得焦点,提示框显示,失去焦点,提示框关闭
    (function(){
        //  模拟的块级作用域,不会影响全局的变量
        window.onload = function(){
            var txtSearch = document.getElementById("txtSearch");
            var tipList = document.getElementById("tipList");
            var liList = tipList.getElementsByTagName("li");
            txtSearch.onfocus = function(){
                //  弹出提示框
                tipList.style.display = "block";
                //  弹出的提示框,不能影响原来的流式布局
            };
            txtSearch.onblur = function(){
                tipList.style.display = "none";
                //  关闭提示框
            };
            
            //  给所有li绑定点击事件,实现li点击后,把li上的文本放到文本框上去
            for( var i=0;i < liList.length; i++ ){
                liList[i].onmousedown = tipLiHandler;
                //  点击事件和失去焦点事件执行循序
                //  第一步 先执行mousedown事件   事件中,慧然被点击的元素获得焦点,
                //  那么原来获得焦点的元素失去焦点
                //  mousedown → 原来获得焦点元素blur事件 → 当前元素的mouseup → click事件执行
                //  如果mousedown事件中,阻止默认行为,那么此元素就不会获得焦点
            }
            
            //  所有li标签点击事件的绑定的事件处理程序,减少内存消耗
            function tipLiHandler(){
                var txt = this.innerHTML;   //  this = = = liList[i]
                txtSearch.value = txt;      //  把li标签的文本设置到文本框上去
            }
        };
    })();
    
    </script>
</body>
</html>

 1.6 鼠标事件

 示例代码

<!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>鼠标事件的区别</title>
    <style>
    div {
        border: 1px solid #ccc;
    }
    p {
        margin:20px;
        border:1px solid red;
    }
    </style>
</head>
<body>
    <div class="box" id="box">
        <p>我观看的是老马视频</p>
        <p>我观看的是老马视频</p>
        <p>我观看的是老马视频</p>
        <p>我观看的是老马视频</p>
        <p>我观看的是老马视频</p>
    </div>
    <script>
        // document.onDOMContentLoaded = function(){};
        // document.onreadystatechange = function(){};
    (function(){
        window.onload =function(){
            var  box = document.getElementById("box");
            box.onmousedown = function(){
                console.log("mousedown");   //  最先实行
            };

            box.onmouseup = function(){     //  其次执行
                console.log("mouseup");
            };

            //  如果鼠标不是当前元素上up  那么就不会触发click
            box.onclick = function(){
                console.log("click");
            };

            //  当鼠标进入元素范围后,只执行一次,不会冒泡
            box.onmouseenter = function(){
                console.log("enter");
            };

            //  离开元素范围后,只执行一次,不会冒泡
            box.onmouseleave = function(){
                console.log("leave");
            };

            //  在元素或者子元素上面的时候回触发,回冒泡
            box.onmouseover = function(e){
                console.log("over");
            };

            //  离开子元素或者自身的时候回触发,回冒泡;
            box.onmouseout = function(e){
                console.log("out");
            };
        };
    })();
    
    </script>
</body>
</html>

 鼠标事件对象(接口)

 鼠标事件对象的坐标位置

 案例

 示例代码

<!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>E41-蝴蝶跟随鼠标飞案例.html</title>
    <style>
    html,body {
        padding: 0px;
        margin:0px;
    }
    img {
        position: absolute;
    }
    </style>
</head>
<body>
    <img id="imgB" src="./a.gif" alt="蝴蝶" width="50px" height="50px">
    <script>
        (function(){
            window.onload = function(){
                //  给整个文档添加一个mousemove事件
                document.onmousemove = function(e){ //鼠标的事件对象
                    e = e || window.event;
                    //  获得鼠标移动的位置所在整个页面的坐标
                    //  var = e.pageX;
                    //  var = e.pageY;
                    
                    var pageX = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft);
                    var pageY = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop);

                    //  给固定定位的图片设置left和top值
                    var imgB = document.getElementById("imgB");
                    imgB.style.left = pageX - 25 + "px";
                    imgB.style.top = pageY - 25 + "px";
                };
            };
        })();
    </script>
</body>
</html>

拖动div案例

<!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>div的拖动案例</title>
    <style>
    html,body,div {
        margin:0;
        padding:0;
    }
    body{
        background-color: silver;
    }
    .box {
        position: absolute;
         100px;
        height: 100px;
        background-color: red;
        border: 1px solid yellow;
        cursor: move;
    }
    </style>
</head>
<body>
    <div id="box" class="box" style="left:200px;top:150px;"></div>

    <script>
    //  监听div:mousedown  开始计算鼠标移动的位移,通过鼠标位移水平方向位置设置div的left
    //  通过计算鼠标垂直方向移动的位移,来设置div的top值
    //  如果div mouseup触发了  那么计算和移动div就结束
    //  mousedown的时候,设置标志位true开始移动div  mouseup的时候,设置标志位为false
    //  停止移动div,mousemove的时候,记录当前的位置和上一次mousemove的位置坐移动距离的计算,并移动div

    (function(){
        
            //  移动标志
            var isMove = false;
            
            var box = document.getElementById("box");
            //定义鼠标移动的上一个页面坐标 
            var tempX = 0,
                tempY = 0;

            //  鼠标按下,开始移动div
            box.onmousedown = function(e){

                isMove = true;
                e = e || window.event;

                //  当鼠标点下去的时候,设置第一个鼠标上一次移动的位置
                 tempX = e.clientX + ( document.documentElement.scrollLeft || document.body.scrollLeft );
                 tempY = e.clientY + ( document.documentElement.scrollTop || document.body.scrollTop );
                
            };

            //  鼠标抬起,停止移动div
            box.onmouseup = function(e){
                isMove = false;
            };

            //  mousemove的时候移动div
            document.onmousemove =function(e){
                //  只有鼠标点下去的时候,才做移动处理
                if(!isMove){
                    return;
                }

                //  计算出当前坐标的位置
                //  screenX screenY clientX clientY 滚动问题
                //  pageX  pageY  
                e = e || window.event;

                //  下面是鼠标相对于页面的x 和 y 坐标
                var pageX = e.clientX + ( document.documentElement.scrollLeft || document.body.scrollLeft );
                var pageY = e.clientY + ( document.documentElement.scrollTop || document.body.scrollTop );
                
                //  移动距离
                var xH = pageX - tempX;
                var yH = pageY - tempY;
                console.log("xH:" + xH + "  yH:" + yH);
                
                //  要把移动的div,在x方向,移动xH 在y方向上移动yH
                //  设置元素的style.left  style.top
                //  一开始如果没有通过js设置style.left  和  style.top  那么值都为""
                //  js是拿不到css设置的left和top
                //  js指定能控制标签的style属性,并且可以读取标签的style属性中的top和left

                box.style.left = ( parseFloat(box.style.left) + xH) + "px";
                box.style.top = ( parseFloat(box.style.top) + yH) + "px";

                //  为鼠标下一次mousemove事件计算初始化鼠标位置
                tempX = pageX;
                tempY = pageY;
            };
        
    })();
    
    
    
    </script>
</body>
</html>

 鼠标事件对象的鼠标按钮信息 onmousedown

 鼠标键的兼容处理

案例

 示例代码

<!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>自定义右键菜单</title>
    <style>
    html,body,h1,ul,li {
        padding:0;
        margin:0;
    }
    ul {
        list-style: none;
    }
    .menu {
        position: absolute;
        background-color: #fff;
        border:1px solid red;
        display: none;
    }
    .menu .menu-item {
        border:1px solid #000;
        cursor: pointer;
        padding:5px;
    }
    .menu .menu-item:hover {
        background-color: #aaa;
    }
    </style>
</head>
<body>
    <h1 id="hTitle">我学习的老马前端</h1>
    <ul class="menu" id="menuList">
        <li class="menu-item" >老马1</li>
        <li class="menu-item" >老马2</li>
        <li class="menu-item" >老马3</li>
        <li class="menu-item" >老马4</li>
        <li class="menu-item" ><a href="http://www.baidu.com" target="_blank">老马5</a></li>
    </ul>

    <script>
    ;(function(){
        window.onload = function(){
            //  获取h1标签
            var hTitle = document.getElementById( "hTitle" );
            var menuList = document.getElementById( "menuList" );
            
            //  给标签添加鼠标按下的事件
            hTitle.onmousedown = function(e){
                e = e || window.event;

                //  e.button // 获得你点击时那个鼠标按钮
                if( e.button == 2 || e.button == 6 ){
                    // console.log( "右键点击了" );
                    //  弹出我们自定义的右键菜单
                    menuList.style.display = "block";

                    //  控制弹出来的菜单的位置为鼠标的位置
                    //  获取鼠标的位置
                    var pageX = e.clientX + ( document.documentElement.scrollLeft || document.body.scrollLeft );
                    var pageY = e.clientY + ( document.documentElement.scrollTop || document.body.scrollTop );

                    menuList.style.left = pageX + "px";
                    menuList.style.top = pageY + "px";
                }
            };

            //  点击文档,关闭右键弹出来的菜单
            document.onclick =function(e){
                menuList.style.display = "none";
            };
            //  在真个文档中屏蔽浏览器默认的右键菜单
            document.oncontextmenu = function(e){
                //  阻止默认行为就可以阻止浏览器弹出右键菜单
                e = e || window.event;
                if( e.preventDefault ){
                    e.preventDefault();
                }else{
                    e.returnValue = false;
                }

                return false;
            };
        };
    })();
    
    </script>
</body>
</html>

 鼠标事件对象的键盘信息

 示例代码

<!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>单选多选段落按钮</title>
    <style>
    .pBox p{
        cursor: pointer;
    }
    </style>
</head>
<body>
    <div id="pBox">
        <p>我是段落1</p>
        <p>我是段落2</p>
        <p>我是段落3</p>
        <p>我是段落4</p>
        <p>我是段落5</p>
    </div>
    <script>
        ;(function(){
            window.onload = function(){
                var pBox = document.getElementById( "pBox" );
                //  拿到所有的p标签都绑定点击事件
                //  或去所有的p标签,pList是一个伪数组
                var pList = pBox.getElementsByTagName("p");
                for( var i=0;i < pList.length;i++ ){
                    pList[i].onclick = pClickHandler;
                }
            };


            // 段落标签点击的事件处理程序
            function pClickHandler(e){
                e = e || window.event;
                //判断是否按下了键盘的ctrl键
                if( e.ctrlKey ){
                    //  多选
                    this.style.backgroundColor = "silver";
                }else{
                    //  单选
                    var pBox = document.getElementById( "pBox" );
                    //  拿到所有的p标签都绑定点击事件
                    //  或去所有的p标签,pList是一个伪数组
               
                    var pList = pBox.getElementsByTagName("p");
                    for( var i=0;i < pList.length;i++ ){
                        pList[i].style.backgroundColor = "#fff";
                    }
                    this.style.backgroundColor = "silver";
                }
            }
        })();
    </script>
</body>
</html>

 1.7 键盘和文本事件

示例代码

<!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>键盘事件</title>
    <script src="../js/documentReady.js"></script>
</head>
<body>
    <input type="text" name="" id="txt">
    <script>
    ;(function(){
        document.myReady(function(){
            //  可以进行绑定事件
            var txt = document.getElementById("txt");
            //  键盘上的键只要被按下 就会触发keydown事件
            //  keydown可以应用于所有的dom对象,比如p标签,div标签
            //  可以监听到功能键的按下事件  比如ctrl shift alt 方向键 f1 esc
            //  如果一直按着键不放开,那么会一直触发
            txt.onkeydown = function(e){
                e = e || window.event;
                console.log( "keydown==> keyCode:" + e.keyCode + "  charCode:" + e.charCode );
            };
            
            //  可以一直触发事件,智能监听,可打印的 字符键      退格键就不行
            //  keypress事件是区分按下是大写字符和小写字符

            txt.onkeypress = function(e){
                e = e || window.event;
                console.log( "keyPress==> keyCode:" + e.keyCode + "  charCode:" + e.charCode );
            };

            //  与keydown一样,不区分大小写,按下的一律按照大写字母的编码计算
            txt.onkeyup = function(e){
                e = e || window.event;
                console.log( "keyUp==> keyCode:" + e.keyCode + "  charCode:" + e.charCode );
            };
        });
    })();
    
    </script>
</body>
</html>

示例代码

<!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>文本框获得焦点案例</title>
    <script src="../js/documentReady.js"></script>
</head>
<body>
    <div id="wrap">
        <div id="box">
            <input type="text" name="" id="txt1">
            <input type="text" name="" id="txt2">
            <input type="text" name="" id="txt3">
        </div>
        <input type="button" value="提交" id="btn">
    </div>
    <script>
    ;(function(){
        document.myReady(function(){
            //  页面加载完成后执行
            //  首先获取所有的input标签 绑定keyup是按
            var box = document.getElementById("box");
            var inputList = box.getElementsByTagName("input );
            for( var i = 0;i < inputList.length;i++ ){
                (function(j){
                    inputList[j].onkeyup = function(e){
                        //  检测文本框输入的文本是否达到了三个字符的长度,达到三个就让下一个文本框获取焦点的
                        if( this.value.length >= 3 ){
                            //  让下一个文本框获得焦点
                            if( j<=1 ){
                                inputList[j+1].focus();
                            }else{
                                document.getElementById("btn").focus();
                            }
                        }
                        }
                })(i);
            }
        });
    })();
    </script>
</body>
</html>

 文本框change事件示例代码

<!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>文本框change事件</title>
    <script src="../js/documentReady.js"></script>
</head>
<body>
    用户名<input type="text" name="" id="txtName">
    <input type="button" value="提交" id="">
    <script>
    ;(function(){
        document.myReady(function(){
            var txtName = document.getElementById("txtName");
            txtName.onchange = function(e){
                //  判断一下文本框的长度为6-8  如果不是,提醒用户,并让当前文本框继续获得焦点
                if( this.value.length > 8 || this.value.length < 6 ){
                    alert("用户名必须6-8个字符");
                    this.focus();
                }
            };
        });
    })();
    
    </script>
</body>
</html>

 1.8 事件高级

 封装

EventUtil.js

//  事件封装
(function(window){
    //  第一个:封装绑定事件的兼容处理
    var EventUtil = {
        //  1给谁绑定  2绑定设么事件  3绑定事件的处理程序  4捕获冒泡
        addEvent:function( element,type,handler,isCapture ){
            if( element.addEventListener ){
                //  标准浏览器的绑定事件
                //  处理四个参数,保证isCapture一定是boolean类型的
                isCapture = isCapture ? true : false;
                element.addEventListener( type, handler, isCapture );
            }else if( element.attachEvent ){
                //  ie8的事件绑定方法
                element.attachEvent( "on"+type,function(){
                    //  window.event
                    return handler.call( element,window.event );    //函数调用模式
                    //  所有的事件处理中  this === target.event || event.scrElement
                } );
            }
        },
        //  获取事件对象 兼容处理
        getEvent:function(e){
            return e || window.event;
        },
        //  获取事件源对象
        getTarget:function(e){
            return e.target || e.srcElement;
        },
        //  阻止事件冒泡
        stopPropagation:function(e){
            if( e.stopPropagation ){
                e.stopPropagation();
            }else{
                e.cancleBubble = true;
            }
        },
        //  阻止默认行为
        preventDefault:function(e){
            if( e.preventDefault ){
                e.preventDefault();
            }else{
                e.returnValue = false;
            }
        }
    };

    //  把我们上面定义的对象赋值给window的属性
    window.EventUtil = EventUtil;
})(window || {});   // 自执行函数

 documentReady.js

//  jQuery 实现文档加载完成后事件的原理
/**
 * 
 * @param {*} callback 
 * 页面文档加载完成后的回调函数
 */
document.myReady = function( callback ){
    //  封装标准浏览器和ie浏览器
    if( document.addEventListener ){
        document.addEventListener("DOMContentLoaded",callback,false);
    }else if(document.attachEvent){
        //  兼容IE8及以下的浏览器
        document.attachEvent("onreadystatechange",function(){
            //  文档的状态为interactive表示,文档dom对象可以进行访问
            if(document.readyState == "interactive"){
                callback(window.event);
            }
        });
    }else{  //  其他特殊情况
        window.onload = callback;
    }
};

事件高级封装

<!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>事件高级封装</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>

<body>
    <input type="button" value="提交" id="btn">
    <script>
        (function () {
            document.myReady(function () {
                //  拿到按钮
                var btn = document.getElementById("btn");
                EventUtil.addEvent(btn, "click", function (e) {
                    console.log(e);
                    console.log(this == btn);
                    alert("ok");
                });// addEvent
            });//myReady
        })();//自执行函数


    </script>
</body>

</html>

事件委托案例

<!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>事件委托案例</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>
<body>
    <ul class="list" id="list" >
        <li>老马1</li>
        <li>老马2</li>
        <li>老马3</li>
        <li>老马4</li>
        <li>老马5</li>
        <li>老马6</li>
        <li>老马7</li>
        <li>老马8</li>
        <li>老马9</li>
        <li>老马10</li>
        <li>老马11</li>
        <li>老马12</li>
        <li>老马13</li>
        <li>老马14</li>
        <li>老马15</li>
        <li>老马16</li>
        <li>老马17</li>
        <li>老马18</li>
        <li>老马19</li>
        <li>老马20</li>
    </ul>

    <script>
    //  list中的li标签个数是不确定的,也可能动态添加,也可能动态减少
    //  li的标签非常多,可能达到100个
    (function(){
        document.myReady(function(){
            //拿到所有的li标签,绑定点击事件
            var ulList = document.getElementById("list");
            var liList = ulList.getElementsByTagName("li");

            //问题
            //1 动态添加li标签,是没有绑定上事件处理程序
                    // for( var i=0;i < liList.length;i++ ){
                    //     EventUtil.addEvent( liList[i],"click",function(e){
                    //         alert(this.innerHTML);
                    //     } );
                    // }
            //  2li的标签非常多的时候,产生很多都绑定事件的信息,浪费大量的内存空间和cpu计算

            //  解决以上的问题
            //  1 事件是有冒泡的
            //  2 弹出事件源对象的内容 e.target || e.scrElement
            //  3 getElementByTagName方法返回的伪数组是一个动态的,自动更新

            //  解决思路,子元素的事件,委托父容器来进行注册和处理
            window.EventUtil.addEvent( ulList,"click",function(e){
                //  子元素被点击的时候,也会冒泡到这来
                var target = EventUtil.getTarget(e);
                //  如果是点击了父容器自己,那么就设么也不干
                if( target == ulList ){
                    return ;
                }

                //  如果点击的是子元素
                alert( target.innerHTML );
            } );
        });
    })();
    
    </script>
</body>
</html>

1.9 节点操作 

 

 节点层次

 文档结构树

 DOM继承关系图

 Node接口

 示例代码

<!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>节点操作</title>
    <style>
        #lis {
            display: none;
        }
    </style>
</head>
<body>
    <ul id="list">
        <li>1</li>
        <li>2</li>
        <li id="lis">3</li>
        <li>4</li>
        <li>5</li>
    </ul>

    <script>
    ;(function(){
        window.onload = function(){
            var list = document.getElementById("list");
            console.log( "nodeType ==>" + list.nodeType );
            console.log( "nodeName ==>" + list.nodeName );
            console.log( "nodeValue ==>" + list.nodeValue );
            console.log( "innerHTML ==>" + list.innerHTML );
            console.log( "innerText ==>" + list.innerText );
            console.log( "textContent ==>" + list.textContent );
        };
    })();
    
    
    </script>
</body>
</html>

结果

   Node接口

节点关系

 示例代码

 略

节点操作

 Node的接口方法

 

 节点操作

 节点操作案例

 示例代码 第一种

<!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>动态创建菜单案例</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>
<body>
    <ul id="menu" >

    </ul>
    <script>
    //  数据:
    var data = [
      {name:'首页', url:'/index.html', id: 1},
      {name:'关于', url:'/about.html', id: 2},
      {name:'产品', url:'/product.html', id: 3},
      {name:'案例', url:'/usecase.html', id: 4},
      {name:'联系', url:'/contact.html', id: 5}
    ];
    
    //  页面加载完成后动态加载标签数据
    document.myReady(function(){
        loadMenu(); //初始化菜单数据
    });


    //加载数据菜单
    function loadMenu(){
        //  获得ul
        var menu = document.getElementById("menu");
        //   {name:'首页', url:'/index.html', id: 1},
        // ==>  <li id="menu1"><a href="/index.html">首页</a></li>
        for( var i=0;i < data.length;i++ ){
            //  创建li标签节点
            var liElement = document.createElement("li");
            //  给li设置id属性
            liElement.setAttribute( "id","menu" + data[i].id );
            //  创建a标签
            var menuLinkElement = document.createElement("a");
            //  给a设置超链接属性
            menuLinkElement.setAttribute("href",data[i].url);

            // menuLinkElement.innerHTML = data[i].name;   //所有浏览器兼容
            //  设置内容
            if( menuLinkElement.textContent ){
                menuLinkElement.textContent = data[i].name;
            }else{
                menuLinkElement.innerText = data[i].name;
            }
            //  把a标签加到li标签下
            liElement.appendChild( menuLinkElement );
            //  把li标签加到ul标签中去
            menu.appendChild( liElement );
        }
    }
    
    </script>
</body>
</html>

 示例代码  第二种

<!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>动态创建菜单案例</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>

<body>
    <ul id="menu">

    </ul>
    <script>
        ; (function () {
            //  数据:
            var data = [
                { name: '首页', url: '/index.html', id: 1 },
                { name: '关于', url: '/about.html', id: 2 },
                { name: '产品', url: '/product.html', id: 3 },
                { name: '案例', url: '/usecase.html', id: 4 },
                { name: '联系', url: '/contact.html', id: 5 }
            ];

            //  页面加载完成后动态加载标签数据
            document.myReady(function () {
                loadMenuData(); //初始化菜单数据
            });

            function loadMenuData(){
                var menu = document.getElementById("menu");
                var strArray = [];
                //  使用innerHTML的方法直接拼接字符串
                //  动态创建li标签
                // <li id="menu1"><a href="/index.html">首页</a></li>
                for( var i=0;i < data.length;i++ ){
                    var str = '<li id="' + 'menu' + data[i].id + '">';
                    str += '<a href="' + data[i].url + '">' + data[i].name + '</a>';
                    str += "</li>" ;
                    // menu.innerHTML += str;// 每创建一次li标签都会使得dom更新一次 
                    //  效率太低,把措辞跟dom的交互编程一次
                    strArray.push( str );
                }

                menu.innerHTML = strArray.join("");
            }
        })();

    </script>
</body>

</html>

 动态创建标签的方式及注意事项

 案例

<!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>关闭消息框案例</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
    <style>
    #msgBox {
         200px;
        height: 200px;
        border:1px solid red;
        position: absolute;
    }
    #msgCloseBtn {
         50px;
        height: 18px;
        position:absolute;
        right: 5px;
        top:5px;
        background: url("../imgs/close2.png");
        cursor: pointer;
    }
    </style>
</head>
<body>
    <div id="msgBox">
        <div id="msgCloseBtn">
            
        </div>
        广告信息
    </div>

    <script>
    ;(function(){
        document.myReady(function(){
            var msgBoxBtn = document.getElementById("msgCloseBtn");

            EventUtil.addEvent(msgBoxBtn,"click",function(e){
                this.parentNode.style.display = "none";
            });
        });
    })();
    
    </script>
</body>
</html>

 1.10 元素样式操作

 

 

 1.11 HTMLElement元素

 HTML元素的大小和位置

 

 

 

 

 

 表单操作

 HTMLInputElement对象的方法和属性

    

 

 示例代码

<!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>表单操作</title>
</head>
<body>
    <div id="box">
        <input type="text" name="" id="">
        <input type="text" name="" id="">
        <input type="text" value="22" id="">
        <input type="text" name="" id="">
        <input type="text" name="" id="">
        <input type="radio" name="se" id="se1">
        <label for="se1">选择1</label>
        <input type="radio" name="se" id="se2">
        <label for="se2">选择2</label>

    </div>
    <script>
    ;(function(){
        window.onload = function(){
            var box = document.getElementById("box");
            var inputList = box.getElementsByTagName("input");
            inputList[2].onclick = function(){
                alert(this.value);
            };
        };
    })();
    
    </script>
</body>
</html>

 HTMLFormElement接口  表单

 HTMLSelectElement接口

 HTMLOptionElement

<!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>动态创建下拉列表</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>
<body>
    <select name="sel" id="sel">

    </select>
    <script>
    ;(function(){

        // data
        var data = [
            {name:"北京",value:1},
            {name:"上海",value:2},
            {name:"天津",value:4},
            {name:"重庆",value:4}
        ];
        document.myReady(function(){
            //  初始化下拉列表的数据
            initSel(data);
        });

        //  初始化下拉列表
        function initSel(data){
            var sel = document.getElementById("sel");

            for( var i=0;i < data.length;i++ ){

                var opt = document.createElement("option");
                
                opt.value = data[i].value;
                //  opt.setAttribute("value",data[i].value);
                opt.text = data[i].name;
                //  opt.innerHTMTL = data[i].name
                if( opt.textContent ){
                    opt.textContent = data[i].name;
                }else{
                    opt.innerHTML = data[i].name;
                }

                // sel.add(opt,null);
                sel.appendChild(opt);
            }
        }
    })();
    
    </script>
</body>
</html>

 select  change的示例代码

<!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>动态创建下拉列表</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>
<body>
    <select name="sel" id="sel">

    </select>
    <script>
    ;(function(){

        // data
        var data = [
            {name:"北京",value:1},
            {name:"上海",value:2},
            {name:"天津",value:4},
            {name:"重庆",value:4}
        ];
        document.myReady(function(){
            //  初始化下拉列表的数据
            initSel(data);

            //  给下拉列表绑定change事件
            var sel = document.getElementById("sel");
            EventUtil.addEvent(sel,"change",function(){
                //  拿到选中的选项的valueh和text
                var selOpt = this.options[this.selectedIndex];
                console.log( selOpt.value );
                console.log( selOpt.text );

                //  如果只要value的值
                //  直接通过select标签的value属性就可以拿到
                console.log( this.value );
            });


        });

        //  初始化下拉列表
        function initSel(data){
            var sel = document.getElementById("sel");

            for( var i=0;i < data.length;i++ ){

                var opt = document.createElement("option");
                
                opt.value = data[i].value;
                //  opt.setAttribute("value",data[i].value);
                opt.text = data[i].name;
                //  opt.innerHTMTL = data[i].name
                if( opt.textContent ){
                    opt.textContent = data[i].name;
                }else{
                    opt.innerHTML = data[i].name;
                }

                // sel.add(opt,null);
                sel.appendChild(opt);
            }
        }
    })();
    
    </script>
</body>
</html>

 案例

 省市选择案例示例代码(支持ie8及以上)

<!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>省市选择案例</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>

<body>
    <select name="" id="pro"></select>
    <select name="" id="city"></select>
    <script>
        //  数据
        var data = [{ name: "北京", cities: ["西城", "东城", "崇文", "宣武", "朝阳", "海淀", "丰台", "石景山", "门头沟", "房山", "通州", "顺义", "大兴", "昌平", "平谷", "怀柔", "密云", "延庆"] },
        { name: "天津", cities: ["青羊", "河东", "河西", "南开", "河北", "红桥", "塘沽", "汉沽", "大港", "东丽", "西青", "北辰", "津南", "武清", "宝坻", "静海", "宁河", "蓟县", "开发区"] },
        { name: "河北", cities: ["石家庄", "秦皇岛", "廊坊", "保定", "邯郸", "唐山", "邢台", "衡水", "张家口", "承德", "沧州", "衡水"] },
        { name: "山西", cities: ["太原", "大同", "长治", "晋中", "阳泉", "朔州", "运城", "临汾"] },
        { name: "内蒙古", cities: ["呼和浩特", "赤峰", "通辽", "锡林郭勒", "兴安"] },
        { name: "辽宁", cities: ["大连", "沈阳", "鞍山", "抚顺", "营口", "锦州", "丹东", "朝阳", "辽阳", "阜新", "铁岭", "盘锦", "本溪", "葫芦岛"] },
        { name: "吉林", cities: ["长春", "吉林", "四平", "辽源", "通化", "延吉", "白城", "辽源", "松原", "临江", "珲春"] },
        { name: "黑龙江", cities: ["哈尔滨", "齐齐哈尔", "大庆", "牡丹江", "鹤岗", "佳木斯", "绥化"] },
        { name: "上海", cities: ["浦东", "杨浦", "徐汇", "静安", "卢湾", "黄浦", "普陀", "闸北", "虹口", "长宁", "宝山", "闵行", "嘉定", "金山", "松江", "青浦", "崇明", "奉贤", "南汇"] },
        { name: "江苏", cities: ["南京", "苏州", "无锡", "常州", "扬州", "徐州", "南通", "镇江", "泰州", "淮安", "连云港", "宿迁", "盐城", "淮阴", "沐阳", "张家港"] },
        { name: "浙江", cities: ["杭州", "金华", "宁波", "温州", "嘉兴", "绍兴", "丽水", "湖州", "台州", "舟山", "衢州"] },
        { name: "安徽", cities: ["合肥", "马鞍山", "蚌埠", "黄山", "芜湖", "淮南", "铜陵", "阜阳", "宣城", "安庆"] },
        { name: "福建", cities: ["福州", "厦门", "泉州", "漳州", "南平", "龙岩", "莆田", "三明", "宁德"] },
        { name: "江西", cities: ["南昌", "景德镇", "上饶", "萍乡", "九江", "吉安", "宜春", "鹰潭", "新余", "赣州"] },
        { name: "山东", cities: ["青岛", "济南", "淄博", "烟台", "泰安", "临沂", "日照", "德州", "威海", "东营", "荷泽", "济宁", "潍坊", "枣庄", "聊城"] },
        { name: "河南", cities: ["郑州", "洛阳", "开封", "平顶山", "濮阳", "安阳", "许昌", "南阳", "信阳", "周口", "新乡", "焦作", "三门峡", "商丘"] },
        { name: "湖北", cities: ["武汉", "襄樊", "孝感", "十堰", "荆州", "黄石", "宜昌", "黄冈", "恩施", "鄂州", "江汉", "随枣", "荆沙", "咸宁"] },
        { name: "湖南", cities: ["长沙", "湘潭", "岳阳", "株洲", "怀化", "永州", "益阳", "张家界", "常德", "衡阳", "湘西", "邵阳", "娄底", "郴州"] },
        { name: "广东", cities: ["广州", "深圳", "东莞", "佛山", "珠海", "汕头", "韶关", "江门", "梅州", "揭阳", "中山", "河源", "惠州", "茂名", "湛江", "阳江", "潮州", "云浮", "汕尾", "潮阳", "肇庆", "顺德", "清远"] },
        { name: "广西", cities: ["南宁", "桂林", "柳州", "梧州", "来宾", "贵港", "玉林", "贺州"] },
        { name: "海南", cities: ["海口", "三亚"] },
        { name: "重庆", cities: ["渝中", "大渡口", "江北", "沙坪坝", "九龙坡", "南岸", "北碚", "万盛", "双桥", "渝北", "巴南", "万州", "涪陵", "黔江", "长寿"] },
        { name: "四川", cities: ["成都", "达州", "南充", "乐山", "绵阳", "德阳", "内江", "遂宁", "宜宾", "巴中", "自贡", "康定", "攀枝花"] },
        { name: "贵州", cities: ["贵阳", "遵义", "安顺", "黔西南", "都匀"] },
        { name: "云南", cities: ["昆明", "丽江", "昭通", "玉溪", "临沧", "文山", "红河", "楚雄", "大理"] },
        { name: "西藏", cities: ["拉萨", "林芝", "日喀则", "昌都"] },
        { name: "陕西", cities: ["西安", "咸阳", "延安", "汉中", "榆林", "商南", "略阳", "宜君", "麟游", "白河"] },
        { name: "甘肃", cities: ["兰州", "金昌", "天水", "武威", "张掖", "平凉", "酒泉"] },
        { name: "青海", cities: ["黄南", "海南", "西宁", "海东", "海西", "海北", "果洛", "玉树"] },
        { name: "宁夏", cities: ["银川", "吴忠"] },
        { name: "新疆", cities: ["乌鲁木齐", "哈密", "喀什", "巴音郭楞", "昌吉", "伊犁", "阿勒泰", "克拉玛依", "博尔塔拉"] },
        { name: "香港", cities: ["中西区", "湾仔区", "东区", "南区", "九龙-油尖旺区", "九龙-深水埗区", "九龙-九龙城区", "九龙-黄大仙区", "九龙-观塘区", "新界-北区", "新界-大埔区", "新界-沙田区", "新界-西贡区", "新界-荃湾区", "新界-屯门区", "新界-元朗区", "新界-葵青区", "新界-离岛区"] },
        { name: "澳门", cities: ["花地玛堂区", "圣安多尼堂区", "大堂区", "望德堂区", "风顺堂区", "嘉模堂区", "圣方济各堂区", "路氹城"] }];
        (function () {
            document.myReady(function () {
                //  动态创建省的option
                initSel();

                //  绑定省下拉列表的改变事件
                var proSel = document.getElementById("pro");
                EventUtil.addEvent(proSel, "change", function (e) {
                    initCity();
                });
                //  页面加载完成和省的数据加载完成后,初始化城市的选项数据
                initCity();
            });

            //  初始化城市信息
            function initCity() {
                //  当省的改变的时候,加载省城市信息,并把城市创建出option加到城市的select标签中
                var cities,                 //  所有对应选择省的城市名字集合
                    proSel = document.getElementById("pro"),
                    proName = proSel.value, //  拿到当前选择的省
                    citySel = document.getElementById("city");  //城市下拉列表
                //  根据省的名字,拿到所有对应城市
                for (var j = 0; j < data.length; j++) {
                    if (data[j].name == proName) {
                        cities = data[j].cities;    //  拿到所有的城市集合
                    }
                }

                //  在输入新的城市之前,先清空之前的城市选项
                citySel.innerHTML = "";

                //  拿到城市后,把城市的名字创建成option添加到城市的select中去
                for (var m = 0; m < cities.length; m++) {
                    var optcity = document.createElement("option");
                    optcity.value = cities[m];
                    optcity.text = cities[m];
                    citySel.add(optcity, null);
                }
            }


            function initSel() {
                var proSel = document.getElementById("pro");
                //  遍历data数组创建省option
                for (var i = 0; i < data.length; i++) {
                    //  <option value="北京">北京</option>
                    var opt = document.createElement("option");
                    opt.value = data[i].name;
                    opt.text = data[i].name;
                    //  option添加到省的下拉列表中去
                    proSel.add(opt, null);
                }
            }






        })();
    </script>
</body>

</html>

 权限选择案例

<!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>权限选择</title>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
    <style>
    select {
         100px;
        height: 200px;
        float: left;
    }
    .box {
         100px;
        float: left;
        text-align: center;
    }
    input {
         51px;
    }
    
    </style>
</head>
<body>
    <select name="l" id="l" multiple="multiple">
        <option value="1">添加商品</option>
        <option value="2">读取商品</option>
        <option value="3">修改商品</option>
        <option value="4">删除订单</option>
        <option value="5">用户查看</option>
    </select>

    <div class="box" id="box">
        <input type="button" value=">" id="" dir="add">
        <input type="button" value=">>" id="" dir="addAll">
        <input type="button" value="<" id="" dir="del">
        <input type="button" value="<<" id="" dir="delAll">
    </div>
    <select name="r" id="r" multiple="multiple">

    </select>

    <script>
    (function(){
        document.myReady(function(){
            //  下面给四个input按钮绑定事件
            var box = document.getElementById("box");
            EventUtil.addEvent(box,"click",function(e){
                //  拿到事件源对象
                var target = EventUtil.getTarget(e);

                if( target === this ){
                    //  说明点击的是当前的div
                    return;     //直接结束当前的点击事件处理程序
                }

                var dir = target.getAttribute("dir");

                var l = document.getElementById("l");
                var r = document.getElementById("r");

                switch(dir) {
                    case "add":
                    add(false,l,r);
                    break;
                    case "addAll":
                    add(true,l,r);
                    break;
                    case "del":
                    add(false,r,l);
                    break;
                    case "delAll":
                    add(true,r,l);
                    break;
                }
            });
        });
        
        //  接受三个参数,第一个参数是否全部进行移动
        //  第二个和第三个参数是要处理的select标签
        function add(isAll,sel1,sel2){
            //  从sel1的option踢动到sel2的里面去
            //  先把所有的需要移动到sel2里面的option都取到array
            var tempArray = []; //  放要移动的选项的数组
            for( var i = 0;i < sel1.options.length; i++ ){
                if( isAll || sel1.options[i].selected ){
                    tempArray.push( sel1.options[i] );
                }
            }
            //  最后一步  要把要移动的选项放到sel2
            while( tempArray.length > 0 ){
                var opt = tempArray.pop();

                //  ie
                //  option的DOM选项对象都有index属性  就是索引
                sel1.remove(opt.index);
                sel2.add(opt,null);
            }
        }
    })();
    
    </script>
</body>
</html>

 全选和全不选案例

<!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>全选和全不选</title>
    <style>
    html,body,div,table,tr,td,th,thead,tbody {
        padding: 0;
        margin: 0;
    }
    .tab {
        border-collapse: collapse;
        line-height: 25px;
        border: 1px solid #ccc;
        text-align: center;
    }
    .tab thead {
        background-color: #aaa;
    }
    .tab tbody {
        background-color:#eee;
    }
    .tab tbody tr:nth-child(even) {
        background-color: #ddd;
    }
    .tab td,th {
        border:1px solid #ccc;
        padding:5px;
    }
    .tab tbody tr:hover {
        background-color:#fff;
    }
    </style>
    <script src="../js/documentReady.js"></script>
    <script src="../js/EventUtil.js"></script>
</head>

<body>
    <table class="tab" id="tab">
        <thead>
            <tr>
                <th><input type="checkbox" name="" id="ckAll"></th>
                <th>用户名</th>
                <th>性别</th>
                <th>级别</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td><input type="checkbox" name="" id=""></td>
                <td>老马</td>
                <td>男</td>
                <td>10</td>
            </tr>
            <tr>
                <td><input type="checkbox" name="" id=""></td>
                <td>神兽</td>
                <td>男</td>
                <td>10</td>
            </tr>
            <tr>
                <td><input type="checkbox" name="" id=""></td>
                <td>男神</td>
                <td>女</td>
                <td>10</td>
            </tr>
            <tr>
                <td><input type="checkbox" name="" id=""></td>
                <td>梅西</td>
                <td>男</td>
                <td>5</td>
            </tr>
        </tbody>
    </table>

    <script>
    (function(){
        document.myReady(function(){
            var ckAll = document.getElementById("ckAll");
            EventUtil.addEvent(ckAll,"click",function(e){
                //  this.checked  通过这个属性可以获得当前多选框是否被选中
                var inputArray = document.querySelectorAll("#tab tbody tr td:first-child input");

                for( var i = 0 ;i < inputArray.length; i++ ){
                    inputArray[i].checked = this.checked;
                }
            });
        });
    })();
    
    </script>
</body>

</html>

许愿墙案例:https://www.bilibili.com/video/av26087098/?p=69

<!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>许愿墙</title>
    <style>
        html,
        body,
        div,
        p {
            padding: 0;
            margin: 0;
        }

        body {
            background: red url(../imgs/bg.gif) repeat;
            font: 12px/20px Arial, "simsun", "Tahoma", "sans-serif";

        }

        .wall {
             960px;
            height: 627px;
            background: red url(../imgs/content_bg.jpg) no-repeat;
            margin: 0 auto;
            position: relative;
        }

        .tip {
             227px;
            position: absolute;
            cursor: move;
        }

        .tip .tip_h {

            height: 68px;
            background: url(../imgs/tip1_h.gif) no-repeat;
            position: relative;

        }

        .tip .tip_c {

            height: 60px;
            background: url(../imgs/tip1_c.gif) repeat-y;
            padding: 10px;
            overflow: hidden;
        }

        .tip .tip_f {

            height: 73px;
            background: url(../imgs/tip1_f.gif) no-repeat;
            text-align: right;
            line-height: 73px;
            color: blue;
            padding-right: 20px;
            font-size: 12px;
        }

        .tip .tip_h .head-msg {
            padding-top: 40px;
            padding-left: 10px;
        }

        .tip .tip_h .closeBtn {
            position: absolute;
            top: 20px;
            right: 20px;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div id="wall" class="wall">
        <!-- <div class="tip">
            <div class="tip_h">
                <div class="head-msg">
                    第[4445]条 2016-02-17 00:00:00
                </div>
                <i class="closeBtn">
                    X
                </i>

            </div>
            <div class="tip_c">
                我学习的是老马视频
                我学习的是老马视频
                我学习的是老马视频
                我学习的是老马视频
            </div>
            <div class="tip_f">
                老马
            </div>
        </div> -->
    </div>

    <script>
        var data = [{
            "id": 1,
            "name": "mahu",
            "content": "今天你拿苹果支付了么",
            "time": "2016-02-17 00:00:00"
        },
        {
            "id": 2,
            "name": "haha",
            "content": "今天天气不错,风和日丽的",
            "time": "2016-02-18 12:40:00"
        },
        {
            "id": 3,
            "name": "jjjj",
            "content": "常要说的事儿是乐生于苦",
            "time": "2016-03-18 12:40:00"
        },
        {
            "id": 4,
            "name": "9.8的妹纸",
            "content": "把朋友家厕所拉堵了 不敢出去 掏了半小时了都",
            "time": "2016-03-18 12:40:00"
        },
        {
            "id": 5,
            "name": "雷锋ii.",
            "content": "元宵节快乐",
            "time": "2016-02-22 12:40:00"
        },
        {
            "id": 6,
            "name": "哎呦哥哥.",
            "content": "据说今晚央视的元宵晚会导演和春晚导演是同一个人,真是躲得过初一,躲不过十五。",
            "time": "2016-02-22 01:30:00"
        },
        {
            "id": 7,
            "name": "没猴哥,不春晚",
            "content": "班主任:“小明,你都十二岁了,还是三年级,不觉得羞愧吗”?。小明:“一点也不觉得,老师你都四十多岁了,不也是年年在三年级混日子吗?羞愧的应该是你”。老师:……",
            "time": "2016-02-22 01:30:00"
        },
        {
            "id": 8,
            "name": "哎呦杰杰.",
            "content": "真搞不懂你们地球人,月亮有什么好看的,全是坑,还是对面那哥们好看,",
            "time": "2016-02-22 01:30:00"
        },
        {
            "id": 9,
            "name": "哎呦哎呦",
            "content": "今天哪里的烟花最好看!!?答:朋友圈。。。",
            "time": "2016-02-22 02:30:00"
        }
        ];

        (function () {
            var maxIndex = 1;
            var tipArray = [];  //  存放所有的tip
            var isMove = false; //  记录tip是否进行移动
            var tempX = 0;
            var tempY = 0;  //鼠标一开始点击的位置  x y
            var moveNode = null;
            window.onload = function () {
                //  页面加载完成后,加载 数据生成tip div并添加到wall
                loadTipDivs(data);

                //  给所有的tip绑定mousedown事件,当点击的时候zIndex最大
                for (var i = 0; i < tipArray.length; i++) {
                    tipArray[i].onmousedown = function (e) {
                        maxIndex += 1;
                        this.style.zIndex = maxIndex;

                        isMove = true;
                        e = e || window.event;
                        //  记录鼠标点击的位置,以及要进行设置移动的标志位
                        tempX = e.clientX + (document.documentElement.scrollLeft || document.body.scrollLeft);
                        tempY = e.clientY + (document.documentElement.scrollTop || document.body.scrollTop);

                        moveNode = this;    //  把当前的移动的div设置成鼠标按下的对应的tip标签
                    };

                    tipArray[i].onmouseup = function (e) {
                        isMove = false;
                    };

                    //  实现鼠标移动  tip跟着鼠标移动的代码
                    tipArray[i].onmousemove = function (e) {
                        e = e || window.event;
                        
                        var pageX = e.clientX + ( document.documentElement.scrollLeft || document.body.scrollLeft );
                        var pageY = e.clientY + ( document.documentElement.scrollTop || document.body.scrollTop );

                        var w = pageX - tempX;
                        var h = pageY - tempY;

                        if( isMove && moveNode == this){
                            this.style.left = parseFloat(this.style.left) + w + "px";
                            this.style.top = parseFloat(this.style.top) + h + "px";
                        }
                        
                        tempX = pageX;
                        tempY = pageY;
                    };

                }

                //给所有的额tip的关闭按钮绑定点击事件
                var closeBtns = document.getElementsByTagName("i");
                for (var j = 0; j < closeBtns.length; j++) {
                    closeBtns[j].onclick = function (e) {
                        this.parentNode.parentNode.style.display = "none";
                    };
                }

                //  


            };

            //  接受一个数组,创建tip的div
            function loadTipDivs(data) {
                var strHTMLArray = [];
                for (var i = 0; i < data.length; i++) {
                    //  拿到 每个 许愿的数据
                    var itemData = data[i];
                    var strHTML = "";

                    strHTML += '<div class="tip">';
                    strHTML += '<div class="tip_h">';
                    strHTML += '<div class="head-msg">';
                    strHTML += '第[' + itemData.id + ']条' + '  ' + itemData.time;
                    strHTML += '</div>';//         
                    strHTML += '<i class="closeBtn">';//         
                    strHTML += 'X';//            
                    strHTML += '</i>';//         
                    strHTML += '</div>';//     
                    strHTML += '<div class="tip_c">';//     
                    strHTML += itemData.content;//         
                    strHTML += '</div>';//     
                    strHTML += '<div class="tip_f">';//     
                    strHTML += itemData.name;//         
                    strHTML += ' </div>';
                    strHTML += '</div>';
                    strHTMLArray.push(strHTML);
                }
                //  把所有的许愿div放到wall里面去
                document.getElementById("wall").innerHTML += strHTMLArray.join("");
                //  遍历wall里面所有的tip节点,设置一个随机left和top值
                for (var i = 0; i < wall.childNodes.length; i++) {
                    if (wall.childNodes[i].nodeType == 1) {
                        wall.childNodes[i].style.left = Math.random() * (960 - 227) + "px";
                        wall.childNodes[i].style.top = Math.random() * (627 - 221) + "px";
                        wall.childNodes[i].style.zIndex = 1;    //默认所有的zIndex为1
                        tipArray.push(wall.childNodes[i]);
                    }
                }
            }





        })();
    </script>
</body>

</html>

tab切换案例:https://www.bilibili.com/video/av26087098/?p=73

 tab示例代码

<!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>table页签</title>
    <style>
    html,body,div,ul,li {
        padding:0;
        margin: 0;
    }
    ul,ol {
        list-style: none;
    }
    .tab {
         500px;
    }
    body {
        padding: 100px;
    }
    /* 设置tab头部样式 */
    .tab .tab-h {
        height: 30px;
        position: relative;
        z-index: 2;
        /*  500px; */
        /* border:1px solid magenta; */
    }
    .tab .tab-h .tab-h-item {
        float: left;
        border:1px solid #ccc;
        background-color:#eee;
    } 

    .tab .tab-h .tab-h-item a{
        color:#333;
        text-decoration: none;
         100px;
        float: left;
        line-height: 28px;
        text-align: center;
     
    }
    .tab .tab-h li.active{
        border-bottom-color: #fff;
        background-color:#fff;
    }
    /* 设置主体 */
    .tab .tab-b {
        border:1px solid #ccc;
        position: relative;
        z-index: 1;
        top:-1px;
    }

    .tab .tab-b .tab-b-item {
        display: none;
        height: 300px;
        padding:10px;
    }
    .tab .tab-b div.active{
        display:block;
    }
    </style>
</head>
<body>
    <div class="tab">
        <!-- tab的头部 -->
        <div class="tab-h">
            <ul class="tab-h-list" id="tabHeadList">
               <li class="tab-h-item active" tabid="1"><a href="javascript:void(0)">产品</a></li>
               <li class="tab-h-item" tabid="2"><a href="javascript:void(0)">用户</a></li>
               <li class="tab-h-item" tabid="3"><a href="javascript:void(0)">体育</a></li>
               <li class="tab-h-item" tabid="4"><a href="javascript:void(0)">新闻</a></li>
            </ul>
        </div>
        <!-- tab的主体 -->
        <div class="tab-b" id="tabBody">
            <div class="tab-b-item active" tabid="1">页签1</div>
            <div class="tab-b-item" tabid="2">页签2</div>
            <div class="tab-b-item" tabid="3">页签3</div>
            <div class="tab-b-item" tabid="4">页签4</div>
        </div>
    </div>


    <script>
    (function(){
        window.onload = function(){
            var tabHeadList = document.getElementById("tabHeadList");
            var liMenu = tabHeadList.getElementsByTagName("li");
            for( var i=0;i < liMenu.length;i++ ){
                liMenu[i].onclick = function(e){
                    //  第一 获得点击的tabid
                    tabId = this.getAttribute("tabid");
                    //  第一: 把自己的样式设置类设置active 其他的li取消active
                    for(var j = 0;j < liMenu.length; j++){
                        liMenu[j].className = "tab-h-item";
                    }
                    this.className = "tab-h-item active";
                    //  第二:所有的tab-b中的div中tabid等于tabId的样式加上active,其他的去掉active
                    var tabBody = document.getElementById("tabBody");
                    for( var k = 0;k < tabBody.childNodes.length;k++ ){
                        var item = tabBody.childNodes[k];
                        if(item.nodeType == 1){//拿到标签节点
                            if( item.getAttribute("tabid") == tabId ){
                                item.className = "tab-b-item active";
                            }else{
                                item.className = "tab-b-item";

                            }
                        } 
                        
                    }
                };
            };
        };
    })();
    
    </script>
</body>
</html>

document总结 

 文档写入示例代码

<!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>文档写入</title>
</head>
<body>
    <h1>我是h1标签</h1>
    <script>
    //  文档加载过程中,写入文档,会随着页面一块输出
    document.write("<h2>我是h2</h2>");
    </script>
    <h3>我是h3标签</h3>

    <script>
    (function(){
        window.onload = function(){
            //  文档加载完成之后再写入,会把之前的覆盖掉
            document.open();
            document.write("<h1>你好</h1>");
            document.close();
        }
    })();
    
    </script>
</body>
</html>

 1.12 BOM详解

 

 window对象描述

 

 BOM + DOM完整结构图

 

 window的open方法

 screen对象

 

 

 

 

 

 1.13 DOM特效封装

 

 模态对话框

<!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>E64-模态对话框.html</title>
    <style>
    html,body,div,input {
        margin: 0;
        padding: 0;
    }
    .dialog-wrap {
        display:none;
    }
    .dialog{
        border:1px solid #ccc;
         300px;
        /* display: none; */
        position: absolute;
        background-color:#eee;
        top:50%;
        left:50%;
        margin-left:-151px;
        margin-top:-151px;
        z-index: 1000;
    }
    
    .dialog-h {
        border-bottom: 1px solid #ccc;
        height: 30px;
        position: relative;
    }
    .dialog-h .btn-close {
        position: absolute;
        right:15px;
        top:0px;
        cursor: pointer;
    }
    .dialog-b {
        height: 267px;

    }
    .dialog-cover{
        /* 如果是一个div,父容器是body,而且是绝对定位,那么left bottom right top都设置为0 则会铺满整个屏幕 */
        position: absolute;
        top:0;
        bottom:0;
        right:0;
        left:0;
        background-color: #ddd;
        z-index:100;
        /* 设置透明 */
        filter:alpha(opacity=50);
        opacity:0.5;
    }
    
    </style>
</head>
<body>
    <input type="button" value="弹出对话框" id="btn">
    <div class="dialog-wrap" id="dialogBox">
        <div class="dialog-cover"></div>
        <div class="dialog" id="dialog">
            <div class="dialog-h">
                <h3>对话框的头部</h3>
                <i class="btn-close" id="btnClose">X</i>
            </div>
            <div class="dialog-b">
                对话框的内容
            </div>
        </div>
    </div>
    

    <script>
    (function(){
        window.onload = function(){
            var btn = document.getElementById("btn");
            btn.onclick = function(){
                var divDialog = document.getElementById("dialogBox");
                divDialog.style.display = "block";
            };

            var btnClose = document.getElementById("btnClose");
            btnClose.onclick = function(){
                this.parentNode.parentNode.parentNode.style.display = "none";
            };
        };
    })();
    
    </script>
</body>
</html>

 模态对话框封装

<!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>E64-模态对话框.html</title>
    <style>
    html,body,div,input {
        margin: 0;
        padding: 0;
    }
    .dialog-wrap {
        display:none;
    }
    .dialog{
        border:1px solid #ccc;
         300px;
        /* display: none; */
        position: absolute;
        background-color:#eee;
        top:50%;
        left:50%;
        margin-left:-151px;
        margin-top:-151px;
        z-index: 1000;
    }
    
    .dialog-h {
        border-bottom: 1px solid #ccc;
        height: 30px;
        position: relative;
    }
    .dialog-h .btn-close {
        position: absolute;
        right:15px;
        top:0px;
        cursor: pointer;
    }
    .dialog-b {
        height: 267px;

    }
    .dialog-cover{
        /* 如果是一个div,父容器是body,而且是绝对定位,那么left bottom right top都设置为0 则会铺满整个屏幕 */
        position: absolute;
        top:0;
        bottom:0;
        right:0;
        left:0;
        background-color: #ddd;
        z-index:100;
        /* 设置透明 */
        filter:alpha(opacity=50);
        opacity:0.5;
    }
    
    </style>
    <script src="../js/L.js"></script>
</head>
<body>
    <input type="button" value="弹出对话框" id="btn">
    <div class="dialog-wrap" id="mDialog" title="弹出来的对话框">
        <!-- 规定:用户要使用dialog对话框,必须
        1、div的class   dialog-wrap
        2、须要给div增加title属性,如果没有增加,那么标题是空的
        3、div的innerHTML就是现在在对话框上的信息 -->
        在对话框里面显示的内容
        <p>老马是好样的!</p>
        <input type="button" value="关闭" id="">

       
    </div>
    

    <script>
    (function(){
        window.onload = function(){

            var btn = document.getElementById("btn");
            btn.onclick = function(){
                
                //  在#mDialog上进行创建一个模态对话框
                //  var dialog = new Dialog("#mDialog");
                var dialog = L.Dialog("#mDialog");  //如果用户没有用new 也不会报错
               
                //  可能框架有多个组件   要兼容扩展其他的组件  L框架
                dialog.show();  //  对话框弹出
            };

        
        };
    })();
    
    </script>
</body>
</html>

 slidedown

<!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>slidedown</title>
    <style>
        html,body,div {
        margin: 0;
        padding: 0;
    }
    .wrap {
        margin:0 auto;
         960px;
    }
    .box {
        border:1px solid red;
         300px;
        height: 300px;
        background-color: #eee;
    }
    </style>
</head>

<body>
    <div class="wrap">
        <input type="button" value="折叠" id="btnSlideUp">
        <input type="button" value="展开" id="btnSlideDown">
        <div class="box" id="box">
            我是box
        </div>

    </div>
    <script>
    (function(){
        window.onload = function(){
            var btnSlideUp = document.getElementById("btnSlideUp"),
                btnSlideDown = document.getElementById("btnSlideDown"),
                box = document.getElementById("box");

            //  点击折叠按钮后,让div一点一点进行折叠
            btnSlideUp.onclick = function(e){
                var start = Date.now(); //返回当前时间的utc 1970毫秒数
            //  随着时间推移,让div的高度一致减小,最后为0  display:none
                var originH = box.clientHeight; //拿到显示的高度  div height
                //  1秒钟后  div消失  1000ms
              var timer = setInterval(function(){
                //   var now = Date.now();
                //   console.log( now - start );   //连个时间相差的毫秒数
                //   start = now;
            //  思路一  当前时间和上一次执行的相隔时间执行div减少高度操作


            //  思路二  当前时间跟最易开始的事件进行计算,把相差总时间换算成应该减少的高度
            //  应该减少的高度,然后设置div的高度

            var now = Date.now();

            var nowH = originH - originH * ( now - start ) / 1000

            box.style.height = nowH + "px";

            if(nowH <= 0){
                //  停止折叠,并且把当前div隐藏,并且把时钟去掉
                box.style.display = "none";

                box.style.height = originH +"px";   //隐藏后,还要把它恢复到原来的状态
                clearInterval(timer);
            }

              },1000/60);
            };


            btnSlideDown.onclick = function(e){
                var start = Date.now(); //  最开始的时间
                //  如果div的display为none 那么 clientHeight 为0
                box.style.display = "block";
                var originH = box.clientHeight;
                box.style.height = "0px";
                var timer = setInterval(function(){
                    var now = new Date();
                    box.style.height = originH * ( now - start )/ 1000 + "px";
                    if( originH * ( now - start )/ 1000 >= originH ){
                        box.style.height = originH + "px";
                        clearInterval(timer);
                    }
                },1000/60);

            };

        };
    })();
    
    </script>
</body>

</html>

 使用组件进行动画

<!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>使用组件进行动画</title>
    <style>
    .box {
        height: 400px;
         300px;
        border: 1px solid #ccc;
        display: none;    
        background-color: #eee;
    }
    </style>
    <script src="../js/L.js"></script>
</head>
<body>
    <input type="button" value="向下滚动" id=btn>
    <div class="box" id="box">

    </div>
    <script>
    (function(){
        window.onload = function(){
            var btn  = document.getElementById("btn");
            var box = document.getElementById("box");
            btn.onclick = function(e){
                L.slideDown( box,400 );
            };
        };
    })();
    
    </script>
</body>
</html>

 轮播图

<!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>轮播图</title>
    <style>
    html,body,div,ul,li {
        padding: 0;
        margin: 0;
    }
    ul,ol {
        list-style: none;
    }
    a {
        text-decoration: none;
        color: #000;
    }
    .slideshow {
         500px;
        height: 300px;
        border:1px  solid #ccc;
        margin: 100px auto;
        overflow: hidden;
        position: relative;
    }
    .slideshow .slide-img-wrap{
         2000px;
        position: absolute;
        z-index: 1;
    }
    .slideshow .slide-img-wrap li {
        float: left;
         500px;
    }
    .slideshow .slide-img-wrap li img{
         500px;
    }
    .slideshow .slide-btn-wrap {
        position: absolute;
        z-index: 100;
        top:50%;
        left: 0;
        height: 30px;
         500px;
    }
    .slideshow .slide-btn-wrap a {
        color:#999;
         30px;
        height: 30px;
        font-size: 30px;
        line-height: 30px;
        text-align: center;
        font-weight: bold;
        background-color: rgba(99,99,99,0.5);
        margin:5px;
    }
    .slideshow .slide-btn-wrap a:hover {
        background-color: rgba(99,99,99,0.8);
    }
    .slideshow .slide-btn-wrap .next {
        float:right;
    }
    .slideshow .slide-btn-wrap .prev {
        float:left;
    }

    .slideshow .slide-sel-btn {
        position: absolute;
        top:80%;
        height: 10px;
         64px;
        z-index: 100;
        left: 50%;
        margin-left: -28px;
    }
    .slideshow .slide-sel-btn a {
        border-radius: 50%;
        background-color: #fff;
         8px;
        height: 8px;
        margin-right: 8px;
        float: left;
    }
    .slideshow .slide-sel-btn a.on {
        background-color: #999;
    }

    </style>
</head>
<body>
    <div class="slideshow">
        <!-- 滚动的图片 -->
        <ul class="slide-img-wrap">
            <li index="0" class="on"><a  href="#" ><img src="../imgs/1.jpg" alt=""></a></li>
            <li index="1"><a  href="#"><img src="../imgs/2.jpg" alt=""></a></li>
            <li index="2"><a  href="#"><img src="../imgs/3.jpg" alt=""></a></li>
            <li index="3"><a href="#"><img src="../imgs/4.jpg" alt=""></a></li>
        </ul>

        <!-- 上一张和下一张的按钮 -->
        <div class="slide-btn-wrap">
            <a  href="#" class="prev">&lt;</a>
            <a  href="#" class="next">&gt;</a>
        </div>

        <div class="slide-sel-btn">
            <a index="0" href="#" class="on"></a>
            <a index="1" href="#"></a>
            <a index="2" href="#"></a>
            <a index="3" href="#"></a>
        </div>
    </div>

    <script>
    (function(){
        window.onload = function(){
            var btnNext = document.querySelector(".slide-btn-wrap .next");
            btnNext.onclick = function(e){
                //  滑动到 下一张 图片
               var curLi = document.querySelector(".slide-img-wrap .on");
               var curIndex = curLi.getAttribute("index");
               curIndex = parseInt( curIndex );
               console.log(curIndex);

                //  让索引进行循环
                var nextIndex = (curIndex + 1) % 4;

                var nextLeft = nextIndex * (-500);
               //   要让下一个图片的左侧  放到盒子的最左侧
               var imgList = document.querySelector(".slide-img-wrap");
                //  imgList.style.left = (imgList.offsetLeft - 500 ) + "px";
                imgList.style.left = nextLeft + "px";

                //  把li标签和a标签中的class 中的on设置一下
                var liArray = document.querySelectorAll(".slide-img-wrap li");
                liArray[curIndex].className = "n"; 
                liArray[nextIndex].className = "on"; 

                var slideSelBtnArray = document.querySelectorAll(".slide-sel-btn a");
                slideSelBtnArray[curIndex].className = "";
                slideSelBtnArray[nextIndex].className = "on";

                autoSlide();
            }; 

            var btnPrev = document.querySelector(".slide-btn-wrap .prev");
            btnPrev.onclick = function(e){
                   //  滑动到 上一张 图片
               var curLi = document.querySelector(".slide-img-wrap .on");
               var curIndex = curLi.getAttribute("index");
               curIndex = parseInt( curIndex );
               console.log(curIndex);

                //  让索引进行循环
                var prevIndex = (curIndex - 1 + 4) % 4;

                var prevLeft = prevIndex * (-500);
               //   要让下一个图片的左侧  放到盒子的最左侧
               var imgList = document.querySelector(".slide-img-wrap");
                //  imgList.style.left = (imgList.offsetLeft - 500 ) + "px";
                imgList.style.left = prevLeft + "px";

                //  把li标签和a标签中的class 中的on设置一下
                var liArray = document.querySelectorAll(".slide-img-wrap li");
                liArray[curIndex].className = "n"; 
                liArray[prevIndex].className = "on"; 

                var slideSelBtnArray = document.querySelectorAll(".slide-sel-btn a");
                slideSelBtnArray[curIndex].className = "";
                slideSelBtnArray[prevIndex].className = "on";

                autoSlide();
            };

            //  具体选中圆圈的跳转页面
            var selBtnDiv = document.querySelector(".slide-sel-btn");
            selBtnDiv.onclick = function(e){
                e = e || window.event;
                var target = e.target || e.srcElement;
                if(target == this){
                    return;
                }
                //  如果是点击了元素a标签
                var nextIndex = target.getAttribute("index");
                nextIndex = parseInt( nextIndex );

                //  设置为on的样式类的a标签
                var curA = document.querySelector( ".slide-sel-btn .on" );
                var curIndex = curA.getAttribute( "index" );
                curIndex = parseInt( curIndex );

                slide( curIndex,nextIndex );
                autoSlide();
            };
            
            //  自动轮播
            autoSlide();

            var timer;
            //  实现自动轮播的方法
            function autoSlide(){
                //先去掉时钟
                if(timer){
                    clearInterval(timer);
                    timer = null;
                }
               timer =  setInterval( function(){
                slideShowNext();
                },2000 );
            }
            
            function slideShowNext(){
                 //  滑动到 下一张 图片
               var curLi = document.querySelector(".slide-img-wrap .on");
               var curIndex = curLi.getAttribute("index");
               curIndex = parseInt( curIndex );
               console.log(curIndex);

                //  让索引进行循环
                var nextIndex = (curIndex + 1) % 4;
                slide( curIndex,nextIndex );
            }

            function slide( curIndex,nextIndex ){
                var imgList = document.querySelector(".slide-img-wrap");
                var nextLeft = nextIndex * (-500);
                var curLeft = imgList.offsetLeft;
                //  动画轮播
                slideAnimate( curLeft,nextLeft,imgList,300 );
               //   要让下一个图片的左侧  放到盒子的最左侧
                //  imgList.style.left = (imgList.offsetLeft - 500 ) + "px";
                // imgList.style.left = nextLeft + "px";

                //  把li标签和a标签中的class 中的on设置一下
                var liArray = document.querySelectorAll(".slide-img-wrap li");
                liArray[curIndex].className = "n"; 
                liArray[nextIndex].className = "on"; 

                var slideSelBtnArray = document.querySelectorAll(".slide-sel-btn a");
                slideSelBtnArray[curIndex].className = "";
                slideSelBtnArray[nextIndex].className = "on";
            }


            //  对元素进行连续的滚动
            function slideAnimate( curLeft,endLeft,element,duration ){
                var w = endLeft - curLeft;
                var wPerMS = w / duration;
                var startTime = Date.now();

                var animateTimer  = setInterval( function(){
                    var curTime = Date.now();
                    //  每一帧直接的事件间隔
                    var delateTime = curTime - startTime;

                    element.style.left = (element.offsetLeft + delateTime * wPerMS) + "px";

                    duration = duration - delateTime;

                    if( duration <= 0 ){
                        element.style.left = endLeft + "px";
                        clearInterval( animateTimer );
                        return;
                    }

                    startTime = curTime;
                    
                },1000/60 );

            }
        };
    })();
    
    
    </script>
</body>
</html>

 手风琴

<!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>手风琴 效果 </title>
    <style>
    html,body,ul,li,div {
        margin: 0;
        padding: 0;
    }
    ul,li {
        list-style: none;
    }
    .ac {
         300px;
        margin: 100px auto;
        border:1px solid red;
    }
    .ac .ac-item .ac-item-hd {
        height: 30px;
        line-height: 30px;
        background-color: #efefef;
        border:1px solid #ddd;
        cursor: pointer;
    }
    .ac .ac-item .ac-item-bd {
        height: 150px;
        display: none;
    }
    .ac .ac-item.on .ac-item-bd{
        display: block;
    }
    </style>
</head>
<body>
    <ul class="ac" id="ac">
        <li class="ac-item on">
            <div class="ac-item-hd">头部1</div>
            <div class="ac-item-bd">内容1</div>
        </li>
        <li class="ac-item">
            <div class="ac-item-hd">头部2</div>
            <div class="ac-item-bd">内容2</div>
        </li>
        <li class="ac-item">
            <div class="ac-item-hd">头部3</div>
            <div class="ac-item-bd">内容3</div>
        </li>
        <li class="ac-item">
            <div class="ac-item-hd">头部4</div>
            <div class="ac-item-bd">内容4</div>
        </li>
    </ul>

    <script>
    (function(){
        window.onload = function(){
            var ac = document.getElementById("ac");
            var liList = ac.getElementsByTagName("li");
            for( var i=0; i < liList.length;i++ ){
                liList[i].onclick = function(e){
                    //  先将所有的li标签设置为ac-item
                    for( var j=0;j < liList.length;j++ ){

                    liList[j].className = "ac-item";
                    }
                    //  再将点击的li标签设置为 ac-item  on
                    this.className = "ac-item on";
                };
            }
        };
    })();
    
    
    </script>
</body>
</html>

 表单校验

<!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>表单校验</title>
</head>

<body>
    <form action="#" id="frm">
        <table>
            <tr>
                <td>示例email</td>
                <td>
                    <input type="email" name="" id="">
                    <input type="number" name="" id="">
                    <input type="date" name="" id="">
                </td>
            </tr>
            <tr>
                <td>姓名:</td>
                <td><input type="text" name="txtName" placeholder="文本不少于6个字符" id="txtName"></td>
            </tr>
            <tr>
                <td>邮箱:</td>
                <td><input type="text" name="txtEmail" id="txtEmail"></td>
            </tr>
            <tr>
                <td>Tel:</td>
                <td><input type="text" name="txtTel" id="txtTel"></td>
            </tr>
            <tr>
                <td colspan="2">
                    <input type="submit" value="提交" id="">
                    <input type="reset" name="重置" id="">
                </td>

            </tr>
        </table>
    </form>
    <table>


    </table>
    <script>
    (function(){
        window.onload = function(){
            //  拿到表单
            var frm = document.getElementById("frm");

            //  表单提交的时候先执行此事件响应方法
            frm.onsubmit = function(e){


                //  校验用户性文本框的字符不少于6个字符
                var txtName = document.getElementById("txtName");
                //  用户名长度错误是提示的消息
                var txtNameMsg = document.createElement("span");
                txtNameMsg.innerHTML = "姓名的字符串长度必须在6-20之间";
                txtNameMsg.style.color = "red";

                var txtNameRepExp = /w{6,20}/gi;

                if( txtNameRepExp.test(txtName.value) ){
                    //  移除错误的文本框消息
                    txtName.parentNode.removeChild(txtNameMsg);
                }else{
                    //  校验失败,添加错误信息  取消默认操作
                    txtName.parentNode.appendChild(txtNameMsg);
                    return false;
                }


                e = e ||window.event;
                if(e.preventDefault){
                    e.preventDefault();
                }else{
                    e.returnValue = false;
                }
                return false;
            };
        };
    })();
    
    </script>
</body>

</html>

未完待续

原文地址:https://www.cnblogs.com/NightTiger/p/9892664.html