JS面试—JS-Web-API(二)

目录

一、题目

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

2、描述事件冒泡流程

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

二、知识点

2.1 通用事件绑定

2.2 事件冒泡

2.3 代理 


一、题目

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

function bindEvent(elem,type,selector,fn){
    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)
        }
    })
}

2、描述事件冒泡流程

  • DOM树形结构
  • 事件冒泡
  • 阻止冒泡
  • 冒泡的应用

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

使用代理

二、知识点

2.1 通用事件绑定

  var btn=document.getElementById("btn1");
    btn.addEventListener('click',function(event){
        console.log('clicked')
    })
 
    // 通用绑定事件函数
    function bindEvent(elem,type,fn){
         elem.addEventListener(type,fn)
    }
    var a=document.getElementById("link1")
    bindEvent(a,'click',function(e){
        e.preventDefault();
        alert('clicked')
    })

改进版 

function bindEvent(elem,type,selector,fn){
    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){
        console.log(this.innerHTML)
    })

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

 

  •  关于IE低版本的兼容性

IE低版本使用attachEvent 绑定事件,和W3C不一样

IE低版本使用量非常少,很多网站已经不支持

2.2 事件冒泡

参考文章  http://blog.sina.com.cn/s/blog_c112a2980102xks8.html

<body>
<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>
<script>
    function bindEvent(elem,type,fn){
         elem.addEventListener(type,fn)
    }
  var p1=document.getElementById('p1');
  var body=document.body
    bindEvent(p1,'click',function(e){
        e.stopPropagation()   //阻止冒泡  避免弹出激活以后  又弹出取消
        alert('激活')
    })
    bindEvent(body,'click',function(e){
        alert('取消')
    })
</script>

2.3 代理 

<body>
 <div id="div1">
     <a href="#">a1</a>
     <a href="#">a2</a>
     <a href="#">a3</a>
     <a href="#">a4</a>
     <!--会随时新增更多的a标签-->
 </div>
<script>
var div1=document.getElementById('div1')
    div1.addEventListener('click',function(e){
        var target= e.target
        if(target.nodeName==='A'){
            alert(target.innerHTML)
        }
    })
</script>
  • 使用代理的好处
  1. 代码简洁
  2. 减少浏览器内存占用
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值