Skip to content
LYF edited this page Sep 7, 2016 · 4 revisions

把事件代理到父元素上,当点击特定元素或特定元素的子元素时,触发handler

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>测试事件代理</title>
<style>
    div{
        font-size: 30px;
        color:black;
    }
    .d{
        width:600px;
        height: 600px;
        background-color: red;
    }

    .d2{
        width: 500px;
        height: 500px;
        background-color: green;
    }

    .d3{
        width: 400px;
        height: 400px;
        background-color: yellow;
    }

    .d4{
        width: 300px;
        height: 300px;
        background-color: blue;
    }
</style>
</head>
<body>

<div class="d">
    d1
    <div class="d2">
        d2
        <div class="d3">
            d3
            <div class="d4">d4</div>
        </div>
    </div>
</div>


<script>
    var addEvent = function(ele, type, handler, capture){
        ele.addEventListener(type, handler, capture);
    }

    var isDelegate = function(e, selector){
        var 
            ArrayClass = Array,
            elements,
            element,
            i = 0,
            target = e.target,
            currentTarget = e.currentTarget,
            makeArray = function(ele){
                return typeof ArrayClass.from === 'function'? ArrayClass.from(ele):ArrayClass.prototype.slice.call(ele);
            };
        if(
            typeof selector === 'string' // selector
         ){
            elements = makeArray(currentTarget.querySelectorAll(selector));
        }else if(
            selector && selector.nodeType // element
        ){
            elements = [ selector ];
        }
        else // dom数组/NodeList/HTMLCollection
        {
            elements = makeArray(selector);
        }

        while(element = elements[i++]){
            if(element === target || element.contains(target)){
                return true;
            }
        }
        return false;
    }

    addEvent(document, 'click', function(e){
        if(isDelegate(e, document.querySelectorAll('div.d3'))){
            alert('代理到d3的事件触发了。实际点击的是:'+e.target.className);
        }
    });
</script>    
</body>
</html>
Clone this wiki locally