【问题标题】:addEventListener for new elements新元素的 addEventListener
【发布时间】:2012-06-24 17:56:28
【问题描述】:

将基本的addEventListener 视为

window.onload=function(){
  document.getElementById("alert")
  .addEventListener('click', function(){
     alert("OK");
  }, false);
}

<div id="alert">ALERT</div> 在原始文档中不存在,我们通过 AJAX 从外部源调用它。我们如何强制addEventListener 为文档中新添加的元素工作(在window.onload 初始扫描DOM 元素之后)?

在 jQuery 中,我们通过live()delegate() 执行此操作;但是我们如何在纯 Javascript 中使用 addEventListener 做到这一点?事实上,我正在寻找 delegate() 的等价物,因为 live() 将事件附加到根文档;我希望在parent 级别上做一个新的事件监听。

【问题讨论】:

    标签: javascript dom-events addeventlistener


    【解决方案1】:

    过于简化,与jQuery的事件系统相距甚远,但基本思路是有的。

    http://jsfiddle.net/fJzBL/

    var div = document.createElement("div"),
        prefix = ["moz","webkit","ms","o"].filter(function(prefix){
             return prefix+"MatchesSelector" in div;
        })[0] + "MatchesSelector";
    
    Element.prototype.addDelegateListener = function( type, selector, fn ) {
    
        this.addEventListener( type, function(e){
            var target = e.target;
    
            while( target && target !== this && !target[prefix](selector) ) {
                target = target.parentNode;
            }
    
            if( target && target !== this ) {
                return fn.call( target, e );
            }
    
        }, false );
    };
    

    你错过了什么:

    • 性能优化,每个委托侦听器都将运行一个完整的循环,因此如果您在单个元素上添加多个,您将运行所有这些循环
    • 可写事件对象。所以你无法修复e.currentTarget,这非常重要,因为this 通常用作对某些实例的引用
    • 没有数据存储实现,因此没有删除处理程序的好方法,除非您每次都手动创建函数
    • 仅支持冒泡事件,因此不支持您认为在 jQuery 中理所当然的 "change""submit"
    • 还有很多其他的我暂时忘记了

    【讨论】:

    • 很有意思的点我也学到了,但是我觉得jQuery的delegate()也或多或少有这些缺点。
    • @Ali 没有这些缺点是 jQuery 所没有的
    【解决方案2】:
    document.addEventListener("DOMNodeInserted", evtNewElement, false);
    
    function evtNewElement(e) {
        try {
            switch(e.target.id) {
                case 'alert': /* addEventListener stuff */ ; break;
                default: /**/
            }
        } catch(ex) {}
    }
    

    注意:根据@hemlock 的评论,这一系列事件似乎已被弃用。我们必须前往mutation observers

    【讨论】:

    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 2018-03-25
    • 2014-09-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多