事件传播以及相关事件概念

键盘事件:

    只有window,document,表单元素可以触发

       keydown

       keypress

       keyup(触发一次)

键盘事件的事件对象的属性:

               事件对象包含一系列的信息:

               哪些信息:

                 1. 事件源头

                 2. 事件类型

                 3. 按下哪个键(ev.keyCode  : 返回数字,每个键对应不同的数字,回车键对应的13 )

                 4. 是否按下了ctrl(ev.ctrlKey: 返回true代表你按了ctrl 返回false没有按下ctrl)

                                  (ev.altKey: 返回true代表你按了alt 返回false没有按下alt)

$('input').onkeyup=function(e){

        var ev=e || window.event

        console.log(ev.keyCode);
    }

$('input').onkeyup=function(e){

        var ev=e || window.event

        // console.log(ev.keyCode);

        console.log(ev.altKey);     //按下其他键的同时按下alt键返回true,否则false
    }

案列按下ctrl键+enter键添加一个li到ul

<body>
    <input type="text">
    <ul>
        
    </ul>
</body>






<script src="../js/js.js"></script>
<script>
    // var ipt=document.querySelector('input')
    // var ul=document.querySelector('ul')
    
    // ipt.onkeyup=function(e){
    //     var ev=e || window.event;
    //     //2. 判断是否按下了ctrl+enter键
    //     if(ev.keyCode==13 && ev.ctrlKey)

    //     var li=document.createElement('li')

    //     li.innerHTML=this.value
    //    ul.appendChild(li)
    //    this.value=''

       
    // }





      外部引入式获取

     $('input').onkeyup=function(e){
        var ev=e || window.event;
        //2. 判断是否按下了ctrl+enter键
        if(ev.keyCode==13 && ev.ctrlKey)

        var li=document.createElement('li')

        li.innerHTML=this.value
       $('ul').appendChild(li)
       this.value=''

       
    }

 1. 获取元素的大小

        1.1 元素的可视宽(不包含边框) odiv.clientWidth

        1.1 元素的占位宽(包含边框) odiv.offsetWidth

2,获取浏览器窗口的宽度

window.innerWidth( 包含滚动条)

document.body.clientWidth(不包含滚动条)

3. 元素.offsetLeft: 获取距离它最最近的具有定位的父级元素的左偏移量,父级没有定位,会相对于body来获取

        注意:元素(绝对定位的)

        元素.offsetTop: 获取距离它最最近的具有定位的父级元素的上偏移量,父级没有定位,会相对于body来获取

        注意:元素(绝对定位的)

事件流(事件传播)

描述页面接收事件的顺序

  事件发生时,会在元素节点之间传播的顺序

      网景公司:事件捕获:事件发生时,从最不具体元素,依次向下传播到最具体的元素(外-》内)

      微软公司:事件冒泡:事件发生时,从最具体元素,依次向上传播到最不具体的元素(内-》外)

 w3c:规定:事件传播有三个阶段

       1. 捕获阶段

       2. 目标阶段(具体点击的是谁  ev.target)

       3. 冒泡阶段

       dom2级可以支持捕获

         事件源.addEventListener('事件类型',事件处理函数,布尔true事件捕获、false事件冒泡,不写默认是冒泡)

       dom0级不支持捕获写法

       <style>
            div{
                width: 300px;
                height: 300px;
                background-color: #000;
            }
            p{
                width: 200px;
                height: 200px;
                background-color: aqua;
            }
            a{
                 display: block;
                width: 100px;
                height: 100px;
                background-color: aquamarine;
            }
        </style>






 function $(id){
        return document.querySelector(id)
    }
    // $('a').onclick = function(){
    //     alert('a')
    // }
    // $('p').onclick = function(){
    //     alert('p')
    // }
    // $('div').onclick = function(){
    //     alert('div')
    // }
   $('a').addEventListener('click',function(){
       alert('a')
   },true)
   $('p').addEventListener('click',function(){
       alert('p')
   },true)
   $('div').addEventListener('click',function(){
    alert('dic')
   },true)
   $('a').addEventListener('click',function(){
       alert('a')
   },false)
   $('p').addEventListener('click',function(){
       alert('p')
   },false)
   $('div').addEventListener('click',function(){
    alert('dic')
   },false)






 阻止事件冒泡:

 为啥要阻止呢?

         按钮,div

         点击按钮,div显示

         点击body。div隐藏

   var oDiv = document.querySelector('div')

    var oBtn = document.querySelector('button')

    // 点击按钮,实际上也点击body

    // 会先执行obtn上的事件,再走body事件

所以阻止事件冒泡:

       1. ev.stopPropagation()  阻止事件冒泡标准写法

       2. ev.cancelBubble = true 阻止事件冒泡 IE支持的写法(了解)   

 <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            display: none;
        }
    </style>
</head>

<body>
    <button>按钮</button>
    <div></div>
</body>






 var oDiv = document.querySelector('div')
    var oBtn = document.querySelector('button')
    // 点击按钮,实际上也点击body
    // 会先执行obtn上的事件,再走body事件

    // 所以阻止事件冒泡:
    /* 
       1. ev.stopPropagation()  阻止事件冒泡标准写法
       2. ev.cancelBubble = true 阻止事件冒泡 IE支持的写法(了解)
    */
    oBtn.onclick = function (e) {
        var ev = e || window.event;
        oDiv.style.display = 'block'
        ev.stopPropagation();
        console.log(ev);
    }
    document.body.onclick = function () {
        oDiv.style.display = 'none'



事件默认行为:

        a的跳转行为

        鼠标右键会有一个弹出默认菜单的行为。。。

        需求:点击a标签,显示一个div,不进行跳转

        所以:

        阻止事件默认行为:1.ev.preventDefault();

                        2.return false;( 只支持dom0级)

                        3.ev.returnValue = false; ie支持(了解)

 <style>
        div {
            width: 200px;
            height: 200px;
            background-color: pink;
            display: none;
        }
    </style>
</head>

<body>
    <a href="http://www.baidu.com">百度</a>
    <div>

    </div>
</body>







var oA = document.querySelector('a')

    var oDiv = document.querySelector('div')

    oA.onclick = function (e) {

        var ev = e || window.event;

        //    ev.preventDefault();//阻止事件默认行为方式

        oDiv.style.display = 'block'

        return false;//阻止事件默认行为方式2

    }




 需求:想获取具体点击的是谁

     ev.target:获取点击的具体的元素

     ev.srcElement:获取点击的具体的元素(ie支持的写法)

 var oDiv = document.querySelector('div')

    oDiv.onclick = function (e) {

        var ev = e || window.event;

        // this指的是绑定事件的那个元素

        // console.log(this);

        // 想获取点击的具体是谁

        console.log(ev.target);

事件的委托

每一个添加点击事件:

      1. 先获取所有的li

      2. 遍历

      3. 给每一个添加点击事件

     

      缺点:每一个li身上都有一个onclick

           占用系统内存,资源消耗大

事件委托可以解决这个事情:

        原理:利用的是冒泡元素,把绑定事件委托父元素来处理

        好处:1. 资源消耗少,降低内存占用,

             2. 新增元素也会获取到 父元素的事件

var oUl = document.querySelector('ul')
    var oBtn = document.querySelector('button')

    // 普通的绑定元素方式:发现新增的元素没有绑定上li的变黄色的事件
    // var oLis = oUl.children;//所有的li
    // for (var i = 0; i < oLis.length; i++) {
    //     oLis[i].onclick = function () {
    //       this.style.backgroundColor ='yellow'
    //     } 
    // }
    // 点击新增功能









事件委托法

    oBtn.onclick = function(){
        var oLi = document.createElement('li');
        oLi.innerHTML = '6'
        oUl.appendChild(oLi)
    }
    // 事件委托的方式来添加点击事件,发现新增元素也自动的获取到了父元素绑定的事件
    oUl.onclick = function(e){
     var ev = e || window.event;
     ev.target.style.background = 'yellow'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值