9.18-9.19学习内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Day4</title>
    <style>
        #dv1{
             300px;
            height: 300px;
            background-color: pink;
        }
        #dv2{
             200px;
            height: 200px;
            background-color: skyblue;
        }
        #dv3{
             100px;
            height: 100px;
            background-color: yellow;
        }
    </style>
</head>
<body>    
    <button id="btn1">按钮</button>
    <button id="btn2">按钮</button>

    <script>
        /*
        绑定事件函数的三种方式:     1.对象.on事件名 = function(){};相同事件后面的会覆盖前面的
                                2.对象.addEventListener("事件名,没on",function(){},false):可以为同一事件附加多个处理函数    IE8不支持
                                3.对象.attachEvent("on事件名",事件处理函数):可以为同一事件附加多个处理函数    只有IE8支持

         */
        // 兼容代码:为任意元素的任意事件添加处理函数
        function addEventFunction(element,type,fn){    //参数分别为元素,事件和处理函数
            if (element.addElementListener) {
                element.addElementListener(type, fn, false);
            } else if (element.attachEvent) {
                element.attachEvent("on" + type, fn);
            } else {
                element["on"+type] = fn ;        //这里要用对象名.on事件名 = function(){};不能写element."on"+type
                //因为element.onclick--如果用下面的方式是element."onclick";可以把onclick看成属性,则用[""]的方式访问该属性即可
                // elementelement."on"+type = fn ;
            }
        }
        //试验
        var btn1 = document.querySelector("#btn1");
        function ff(){console.log("咔咔")};
        addEventFunction(btn1, "click", ff);
        
    </script>

    <script>
        /*解绑事件处理函数的方法    注意:用什么方式绑定事件就应该用什么方式解绑事件
                        1.对象.on事件 = null;    对应第一种绑定方式
                        2.对象.removeEventListener(事件, 需要解绑的处理函数, false)        对应第二种绑定方式IE8不支持    注意,这种方式解绑需要在绑定的时候使用命名函数,使用匿名函数无法实现解绑,因为使用匿名函数绑定和解绑里的匿名函数不是同一个DOM对象。
                        3.对象.detachEvent(on事件,需要解绑的处理函数)    对应第三种绑定方式只有IE8支持    同样也需要使用命名函数才行        
         */        
        // 解绑的兼容代码
        function removeEventFunction(element,type,fn){
            if (element.removeElementListener) {
                element.removeEventListener(type, fn, false);
            } else if(element.attachEvent){
                element.detachEvent("on"+type, fn);
            } else {
                element["on"+type] = null;
            }
        }

        //试验
        var btn2 = document.getElementById("btn2");
        btn2.onclick = function(){
            removeEventFunction(btn1, "click", ff);
        };
        
    </script>




    <div id="dv1">
        <div id="dv2">
            <div id="dv3"></div>
        </div>
    </div>


    <script>
        var dvObj = [document.getElementById("dv1"),document.getElementById("dv2"),document.getElementById("dv3")];
            function fn2(){                    //一个事件处理函数,在控制台写入触发对象的id    
                    console.log(this.id);
                }
            for (var i = 0; i < dvObj.length; i++) {    //循环注册点击事件

                dvObj[i].addEventListener("click", fn2, false);        
            }
        //点击内部盒子时外部的盒子点击事件也会被触发---这就是事件冒泡--
            /*
        事件冒泡机制:元素(标签)嵌套,如果这些标签都注册了同一个事件,那么在触发内部标签的该事件时,外部标签的该事件也会被触发。事件冒泡这个机制不会触发到内部的元素事件,只会影响到外部的元素事件

        如何阻止事件冒泡:1.在事件处理函数内部添加     window.event.cancelBubble = true;    IE8
                        2.在事件处理函数的形参列表中加入一个参数(事件处理函数默认的参数对象)然后函数内加入            参数名.stopPropagation();    谷歌、火狐
         */
        
        // 下面的代码为阻止事件冒泡后的代码
            function fn2(e){                    //一个事件处理函数,在控制台写入触发对象的id    
                    console.log(this.id);
                    e.stopPropagation();    //e这个形参是事件处理函数的一个默认参数,e.stopPropagation()这个方法是谷歌和火狐浏览器的阻止冒泡机制的方法
                    // window.event.canceBubble = true;//这是IE8特有的阻止冒泡的方法
                }
            for (var i = 0; i < dvObj.length; i++) {    //循环注册点击事件

                dvObj[i].addEventListener("click", fn2, false);            
            }    
        
        
    </script>
    
    
    <script>
        /*
        事件触发的三个方式:     1.事件捕获方式
                            2.事件目标方式
                            3.事件冒泡方式
        事件可以由这三种方式触发:
        1.由事件捕获方式触发:由外向内的传递方式触发事件
        2.事件目标方式触发:不是由于冒泡机制引发的事件,即事件触发的基点对象,他的事件触发方式为事件目标方式
        3.由冒泡方式触发:由内向外的传递方式触发事件

        这里就可以说明addEventListener方法里的布尔值的作用:控制事件处理函数的传递方式:false-事件冒泡;true-事件捕获

        注意:事件触发方式里的冒泡方式和冒泡机制做出区分:事件冒泡机制是一直存在的,不管是设置addEventListener方法里的布尔值为true还是false,都存在冒泡机制,内部元素的事件触发都会引起外部元素的事件触发。冒泡机制的阻止是靠上面所述的方法。
        事件触发方式的冒泡和捕获只是决定事件触发的先后顺序,可以用设置事件方法里的布尔值来设置。
         */
        //试验:设置冒泡方式和捕获方式,对比结果
            var dvObj = [document.getElementById("dv1"),document.getElementById("dv2"),document.getElementById("dv3")];
            function fn2(){                    //一个事件处理函数,在控制台写入触发对象的id    
                        console.log(this.id);            
                    }
                for (var i = 0; i < dvObj.length; i++) {    //循环注册点击事件

                    dvObj[i].addEventListener("click", fn2, false);            
                }    
        //点击内部盒子,输出结果为dv3,dv2,dv1;可以看出里面的盒子的事件先触发,由冒泡方式内向外依次触发冒泡机制引发的事件
        
        //修改上面的布尔值:
            var dvObj = [document.getElementById("dv1"),document.getElementById("dv2"),document.getElementById("dv3")];
            function fn2(){                    //一个事件处理函数,在控制台写入触发对象的id    
                        console.log(this.id);            
                    }
                for (var i = 0; i < dvObj.length; i++) {    //循环注册点击事件

                    dvObj[i].addEventListener("click", fn2, true);            
                }    
        //点击内部盒子,输出结果为dv1,dv2,dv3;可以看出外面的盒子的事件先触发,由捕获方式由外向里依次触发冒泡机制引发的事件
        //
        
        //可以利用:事件处理参数.eventPhase查看事件触发的方式:1为事件捕获,2为事件目标,3为事件冒泡
        var dvObj = [document.getElementById("dv1"),document.getElementById("dv2"),document.getElementById("dv3")];
        function fn2(e){                        
                    console.log(this.id + "触发方式为" + e.eventPhase);            
                }
            for (var i = 0; i < dvObj.length; i++) {    

                dvObj[i].addEventListener("click", fn2, true);            
            }    
    </script>    


    <!-- 案例:同一个元素的不同事件-不同的处理函数封装到一个函数中 -->
    <button id="btn3">按钮3</button>
    <script>
        var btn3 = document.getElementById("btn3");
        btn3.onclick = f1;
        btn3.onmouseover = f1;
        btn3.onmouseout = f1;
        function f1(e){        //形参e为默认的事件处理函数的参数,是浏览器保存事件处理函数数据的一个对象。里面的type属性为事件
            switch (e.type) {        //利用这个type属性,实现多个事件的处理函数封装
                case "click" :        //这里的属性名没有on
                    alert("咔咔");
                    break;
                case "mouseover" :
                    this.style.backgroundColor = "purple";
                    break;
                case "mouseout" :
                    this.style.backgroundColor = "pink";
                    break;
            }            

        }
    </script>



    <script>
        //BOM:Browser Object Model
        //根对象:window整个浏览器窗口
        
        var num = 100;
        console.log(num);
        console.log(window.num);    //效果相同

        //window的几个方法
            //window.alert("咔咔");    //弹出框
            //window.prompt("咔咔");    //弹出输入框
            //window.confirm("咔咔");//弹出框,有两个按钮,确定返回true,取消返回false
        
        //window加载事件:
        window.onload     //页面加载完毕时触发的事件
        window.onunload //页面关闭后触发的事件
        window.onbeforeunload //页面关闭之前触发的事件
    </script>

    <script>
        //DOM的location对象
        console.log(window.location);
        console.log(location);
        //属性: hash:地址栏内#后的内容,URL的锚部分
        //        host:返回一个URL的主机名和端口    
        //        hostname    返回URL的主机名
        //        href    返回完整的URL
        //        pathname    返回的URL相对路径
        //        port    返回URL服务器使用的端口号
        //        protocol    返回URL协议
        //        search    返回URL的查询部分    

        //方法:assign()改变地址栏内容,利用herf属性能实现相同的效果
            //location.assign("http://www.baidu.com");
            //location.herf = "http://www.baidu.com";
        //        reload()重新加载,刷新
        //        replace()替换地址栏内容,和herf或者assign的区别:不会记录历史,不能回退到前面的界面        
    </script>

    <script>
        //DOM的history对象
        //方法:back()    加载 history 列表中的前一个 URL
                //forward()    加载 history 列表中的下一个 URL
                //go()    加载 history 列表中的某个具体页面
    </script>
    
    <script>
        //DOM的navigator对象
        //属性:userAgent:获取User Agent简称UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。用这个属性可以判断浏览器类型
        //        platform:获取一个只读的字符串,声明了运行浏览器的操作系统和(或)硬件平台。
    </script>
    
        <p id="date"></p>

    <script>
        //DOM的两个计时器方法
        //1.setInterval(函数,毫秒数):按照指定的周期(毫秒数)执行函数
        var dtp = document.getElementById("date");
        var timeId = setInterval(function(){
            var d = new Date();
        var dt = d.toLocaleTimeString();
            dtp.innerText = dt;
        }, 1000);
        //停止该定时器:clearInterval(定时器的返回值)
                    //clearInterval(timeId)
                    
                    
        //2.setTimeout(函数,毫秒数) 在指定的毫秒数后调用一次函数或计算表达式
        
        setTimeout(function(){
                alert("我在三秒后弹出");
            }, 3000 );
        //可以使用clearTimeout()来阻止事件的发生(在事件发生之前)
        //
    </script>




</body>
</html>
原文地址:https://www.cnblogs.com/yucheng6/p/9677273.html