JavaScript基础知识——事件

QA:

  1、编写一个通用的事件监听函数

   //elem:要绑定元素的父元素; type:事件类型; selector:本来要绑定的元素
   function bindEvent(elem,type,selector,fn) {
   //如果第四个参数没有,那么第三个参数应该是一个函数,fn 就赋值成 selector
      if(fn == null){
        fn = selector
        selector = null
      }
      elem.addEventListener(type,function(e) {
        var target
        if(selector) {
          // 代理
          target = e.target
          if(target.matches(selector)) { //判断目标节点是否和选择器匹配
            fn.call(target,e)
          }
        }else{
          // 不使用代理
          fn(e)
        }
      })
    }

    //使用代理
    var div1 = document.getElementById('div1')
    bindEvent(div1,'click','a',function(e) {
      e.preventDefault()
      console.log(this.href);
    })

    //不使用代理
    var btn1 = document.getElementById('btn1')
    bindEvent(btn1,'click',function(e) {
      console.log(btn1.innerHTML);
    })

 

  2、描述事件冒泡的过程

  3、对于一个无限下拉加载图片的页面,如何给每个图片绑定事件

知识点:

  1、通用事件绑定

//标准方法
 var btn = document.getElementById('btn1');
 btn.addEventListener('click', function(e) {
    console.log('checked')
 })
//封装事件绑定
 function blindEvent(elem, type, fn) {
     elem.addEventListener(type, fn)
 }
 var a = document.getElementById('aLink')
 blindEvent(a, 'click', function(e) {
     e.preventDefault() //阻止默认行为
     alert('checked')
 })

  注意:IE绑定事件用attachEvent

  2、事件冒泡

<div id="div1">
        <p id="p1">激活</p>
        <p id="p2">取消</p>
        <p id="p3">取消</p>
        <p id="p4">取消</p>
    </div>
    <div id="div2">
        <p id="p5">取消</p>
        <p id="p6">取消</p>
    </div>
//根据以上代码,点击每一个p标签,弹出里面的响应的内容
//封装的绑定事件
    function blindEvent(elem, type, fn) {
        elem.addEventListener(type, fn)
    }
    //开始
    var p1 = document.getElementById('p1');
    blindEvent(p1, 'click', function(e) {
        e.stopPropagation(); //阻止冒泡到上层;如果不阻止的话,会先弹出'激活',再弹出'取消',因为在body上也绑定了事件
        alert('激活')
    })

    var body = document.body;
    blindEvent(body, 'click', function(e) {
        alert('取消')
    })

  事件代理(事件冒泡的具体应用)

    使用场景: 多个元素上绑定相同的事件
    原理: 利用冒泡机制
    操作:把事件绑定在要绑定元素的父元素上面

  

<div id="div1">
     <a href="#">a1</a>
     <a href="#">a2</a>
     <a href="#">a3</a>
     <a href="#">a4</a>
<!-- 会随时新增更多的 a 标签 --> 
</div>

//实现
   var div1 = document.getElementById('div1');
    div1.addEventListener('click', function(e) {
        var target = e.target; 
     // e.target能告诉你点击(事件)是从哪儿触发的
     //例如在div1 上绑定了一个点击事件,在 a1 上点击,这个时候 target 是a1,而不是 div1
        if (target.nodeName === 'A') {
            alert(target.innerHTML)
        }
    })

 

posted @ 2018-03-15 14:47  utrustme  阅读(98)  评论(0编辑  收藏  举报