鍍金池/ 問答/HTML/ 使用jquey遇到的一個(gè)疑問

使用jquey遇到的一個(gè)疑問

<!DOCTYPE html>
<html lang="zh-cmn-Hans">
<head>
    <meta charset="UTF-8"/>
    <title>Title</title>
    <meta name="viewport" content="width=device-width, initial-scale=1 user-scalable=no"/>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta name="renderer" content="webkit"/>
</head>
<body>
    <div id="container">
        <button id="go">click me</button>
    </div>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
    <script>
        var go = document.getElementById('go');
        var container = document.getElementById('container');
        container.addEventListener('click', function (e) {
            console.log(e.target, this, e.currentTarget);
        })//依次輸出 button container container
        $('#container').on('click', 'button', function (e) {
            console.log(e.target, this, e.currentTarget);
            console.log(e.originalEvent.target, this, e.originalEvent.currentTarget);
        })//依次輸出 button button button
        //           button button container
        $('#container').on('click', function (e) {
            console.log(e.target, this, e.currentTarget);
            console.log(e.originalEvent.target, this, e.originalEvent.currentTarget);
        })//依次輸出 button container container
//                   button container container

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

jquery使用on在參數(shù)里面添加selector參數(shù)可以實(shí)現(xiàn)事件代理
由e.originEvent.currentTarget獲取的是container可以知道的確通過事件冒泡代理了事件
但是為什么在這種情況下e.currentTarget卻不等于e.originEvent.currentTarge,如果是故意這樣設(shè)計(jì),那設(shè)計(jì)的目的是什么?還是這個(gè)是一個(gè)BUG?

回答
編輯回答
糖豆豆

我覺得是內(nèi)部做了處理。originEvent只是提供了一個(gè)可以獲取實(shí)際綁定元素的接口。
對(duì)外暴露的效果是事件直接綁定到了第二個(gè)參數(shù)所在的元素上,事件回調(diào)的this也是做了處理的。
正常來(lái)講a.on('click', b, handler)this應(yīng)該是a(原生是這樣的),這么處理的考慮是為了方便用戶使用。


大概是這樣的吧

dom.on = function (event, selector, handler) {
    dom.addEventListener(event, funtion (event) {
        var currentTarget = event.currentTarget
        // 示例
        if($(this).find(selector) === target) {
            // 賦值一份event對(duì)象
            var copyEvent = copy(event)
            // 改currentTarget
            copyEvent.target = currentTarget
            // 把原有event加上
            copyEvent.orginTarget = event
            // 改this
            handler.call(target, copyEvent)
        }
    })
}
2018年3月16日 19:07