【问题标题】:JavaScript equivalent for jQuery .on() with additional selector [duplicate]带有附加选择器的 jQuery .on() 等效的 JavaScript [重复]
【发布时间】:2015-04-07 10:34:14
【问题描述】:

这里是 JSFiddle 示例:https://jsfiddle.net/1a6j4es1/1/

$('table').on('click', 'td', function() {
    $(this).css('background', 'green');
});

如何用纯 JavaScript 重写这段代码?
即使table 元素内的新td 元素,回调函数也应该有效。

更新:我找到了一个非常简洁的解决方案:https://jsfiddle.net/1a6j4es1/28/

function delegateSelector(selector, event, childSelector, handler) {

    var is = function(el, selector) {
      return (el.matches || el.matchesSelector || el.msMatchesSelector || el.mozMatchesSelector || el.webkitMatchesSelector || el.oMatchesSelector).call(el, selector);
    };

    var elements = document.querySelectorAll(selector);
    [].forEach.call(elements, function(el, i){
        el.addEventListener(event, function(e) {
            if (is(e.target, childSelector)) {
                handler(e);                
            }
        });
    });
}

delegateSelector('table', "click", 'td', function(e) {
    e.target.style.backgroundColor = 'green';
});

【问题讨论】:

    标签: javascript jquery events selector


    【解决方案1】:
    <table id="clickable" onclick="changecolor(this)" border=1>
    <tr><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td></td><td></td><td></td><td></td><td></td></tr>
    <tr><td></td><td></td><td></td><td></td><td></td></tr>
    </table>
    <script>
        function changecolor(table)
        {
         document.getElementById("clickable").addEventListener("click",tableClicked);
          function tableClicked(e) {
           e.target.style.backgroundColor = 'green';
         }
        }
    </script>
    

    这对我有用..

    【讨论】:

    • 当其中一个单元格包含子元素时不起作用。或者当有&lt;tr&gt; 单元格时。
    • 我修复了解决方案:jsfiddle.net/1a6j4es1/27
    【解决方案2】:

    为您希望点击的元素添加一个 ID,然后使用此代码:

    document.getElementById("tableId").addEventListener("click", function(e){
    e.target.style.background = 'green';
    });
    

    【讨论】:

    • 如果 td 中有 span 或 div 怎么办?
    • @charlietfl 你想对他们做什么?
    • 希望父母 &lt;td&gt; 改变而不是孩子。 target 可能不是`
    • @charlietfl 然后代替 e.target,使用 document.getElementById("tableId") 你会得到你想要的特定元素
    • 这将改变整个表而不是单个td。需要的是从目标向上走 dom 并测试td。当前的解决方案过度简化了情况
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签