JS基础知识day12

DOM的增删改查:

             增  innerHTML +=    appendChild()   insertBefore()

             删除  innerHTML = ''   remove()    removeChild()

             修改  replaceChild()

             查询:

                 认识节点node ---  换行,文本,注释,标签都是节点   NodeList

                 标签  HTMLCollection


 数组   Array

        数组2  Arguments

        数组3  NodeList

        数组4  HTMLCollection

        以上每种数组属于不同的类别,所以拥有不同的属性和方法

        如何把伪数组转为真数组

 

 

        var arr = new Array() ;
        console.log(arr);

        function fn() {  
            console.log(arguments);
        }
        fn()

        var oPs = document.querySelectorAll('p') ;
        console.log(oPs);

        // oPs.push('a')

        var oPs2 = document.getElementsByTagName('p') ;
        console.log(oPs2);

        // oPs2.pop()

        var arr = [] ;
        for(var i = 0 ; i < oPs.length ; i++) {
            arr.push(oPs[i])
        }
        console.log(arr);
        arr.push('a')
        console.log(arr);

事件

         事件:事情发生了并得到处理

           事件 :事件源.事件类型=事件处理函数

        事件处理函数是异步的

        这个匿名函数是在事件发生以后,由系统调用

        一般事件处理函数没有特定的返回值 , 但是也可以使用return

document.onclick = function () {  
            console.log(666);
            return 
            console.log(777);
        }

事件处理函数的第一个参数表示的是事件对象

        事件对象是用户记录事情发生的整个过程

document.onclick = function (a , b) {  
            console.log(a);
            // 事件处理函数只有一个参数
            console.log(b);  // undefined
        }
        document.onclick = function (e) {  
            // 大多数浏览器支持事件处理函数的第一个参数做事件对象
            // console.log(e);

            // 低版本浏览器只能使用event来记录事件对象
            // console.log(event);

            e = e || event ;

            // target目标  --- 具体是由哪个标签触发的
            console.log(e.target);
            // this 指向事件源
            console.log(this);


            console.log(e.clientX);

        }

绑定事件的方式

          1 行内js   οnclick="fn()"

          2 事件绑定  oDiv.onclick = function(){}

          3 事件监听   oDiv.addEventListener(类型,事件处理函数)  --- 不会覆盖        

移除事件

          行内js和普通事件绑定都可以通过重新赋值的方式,以覆盖的方式进行移除   null

          事件监听的方式,需要写成具名函数才能被移除(注意:移除的时候,需要一个一个的移除)   removeEventListener()

        // onclick 重新赋值(任意值都可以)  一般建议写null
        oDiv.onclick = null ;

        function fn2() {  
            console.log(999);
        }


        function fn() {  
            console.log(666);
        }


        // 添加事件监听
        function addEvent(ele , type , cb) {  
            if(window.addEventListener) {
                ele.addEventListener(type , cb)
            } else {
                ele.attachEvent('on' + type , cb)
            }
        }

        // 移除事件监听
        function removeEvent(ele , type , cb) {  
            if(window.removeEventListener) {
                ele.removeEventListener(type , cb)
            } else {
                ele.detachEvent('on' + type , cb)
            }
        }

 事件流:

          事件冒泡:从里向外

          事件捕获:从外向内

          主要使用事件冒泡

  实现事件捕获的方式

             addEventListener(type , fn , true) 第三个参数表示是否支持事件捕获

  什么是事件流:

                事件流描述的是从页面中接受事件的顺序

        有意思的是,微软(IE)和网景(Netscape)开发团队居然提出了两个截然相反的事件流概念,IE的事件流是事件冒泡流(event bubbling),而Netscape的事件流是事件捕获流(event capturing)

        事件捕获:事件捕获流的思想是不太具体的DOM节点应该更早接收到事件,而最具体的节点应该最后接收到事件

        事件冒泡:IE提出的事件流叫做事件冒泡,即事件开始时由最具体的元素接收,然后逐级向上传播到较为不具体的节点


 

        IE提出的是冒泡流,而网景提出的是捕获流,后来在W3C组织的统一之下,JS支持了冒泡流和捕获流,但是目前低版本的IE浏览器还是只能支持冒泡流(IE6,IE7,IE8均只支持冒泡流),所以为了能够兼容更多的浏览器,建议大家使用冒泡流。

        事件流包含的三个阶段:事件捕获阶段、处于目标阶段、事件冒泡阶段

阻止事件冒泡

           利用事件对象

              e.stopPropagation()

              e.cancelBubble = true

        oP.onclick = function (e) {  
            e = e || event ;
            // 阻止事件冒泡
            // 主流浏览器的写法
            // e.stopPropagation()
            // 低版本IE取消事件冒泡的方法
            // e.cancelBubble = true ;
            if(e.stopPropagation) {
                e.stopPropagation()
            } else {
                e.cancelBubble = true ;
            }
            console.log('p');
        }

事件委托

        如果页面上的事件处理函数过多,会对性能造成影响

        如果需要让每个li都有点击事件,,循环绑定事件 --- 页面上实际会有很多的事件处理函数

        循环绑定事件无法给将来的对象绑定事件


 

        解决方案:事件委托

           子元素的事件都会触发父元素的事件

           事件委托的实现:

              找到所有需要绑定事件的父元素,给父元素绑定事件,然后根据target来判断具体是由谁触发的

        什么是事件委托  

            子元素的同类型事件委托给父元素来实现

        为什么使用事件委托

            减少事件处理函数

            可以给将来的对象绑定事件

        事件委托的原理

            事件冒泡 --- 子元素的同类型事件都会触发父元素的同类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值