js原生事件绑定

关于事件绑定的面试题和实际运用

如何编写一个通用的原生事件监听函数?

 // 简单封装一个通用事件绑定

    function bindEvent(elem,type,fn){
        elem.addEventListener(type,fn);
    }

    var a = document.getElementById('link1');

    bindEvent(a,'click',function(e){
        e.preventDefault();  // 阻止标签默认行为
        alert('click')
    });

// 关于低版本时间兼容
    // 使用attachEvent绑定事件

关于低版本的浏览器我们只需要了解就好了,如果你在面试中如果要求要对很低版本的浏览器做兼容的话,建议你还是换一个机会去面,处理低版本浏览器的兼容是浪费生命的一件事情。

使用事件冒泡实现代理事件绑定?

在实际工作运用中,比如这么一个场景:我们要对一页的多个图片项做事件绑定,如果我们一个个对图片绑定是一件很麻烦的事情,而且还有对重新加载的图片做重新的绑定这是个很麻烦的时候。所以我们使用事件冒泡实现代理绑定事件就完美解决了这些问题.。

这里我们使用绑定父元素的点击事件,然后使用子元素的冒泡事件触发点击,然后通过e.target(事件目标对象)判断触发事件元素的那个。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>dom事件</title>
</head>
<body>
    <a href="#" id='link1'>事件绑定</a>
    <div id="div1">
        <a href="#" id="a1">1</a>
        <a href="#" id="a2">2</a>
        <a href="#" id="a3">3</a>
        <!-- 一会随时新增更多的a便签 -->
    </div>
 <script>
var div1 = document.getElementById('div1');

    div1.addEventListener('click',function(e){
        e.preventDefault();
        var target = e.target;
        if(target.nodeName === 'A'){
            alert(target.innerHTML);
        }
    })


    </script>
</body>
</html>

所以我们现在重新封装通用事件的件兼容函数


    // elem:元素  type:事件类型  selector:目标元素节点的名称  fn:事件触发方法
    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
                // matches  target是
                if(target.matches(selector)){
                    fn.call(target,e)
                }
            }else{
                fn(e)
            }
        })
    }

    bindEvent(div1,'click','a',function(e){
        alert(e.target.innerHTML)
    })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,099评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,956评论 25 709
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,841评论 1 92
  • 悲愤的贾老师既盼着妹妹快点反馈回来真实的消息又怕听到这个消息。怨,让她悲悲切切,恨,让她银牙咬碎。去捣毁这对狗男女...
    樵砥阅读 330评论 2 3
  • superhero_0615阅读 167评论 0 0