Javascript 如何使用d3.js选择器删除处理程序

Javascript 如何使用d3.js选择器删除处理程序,javascript,jquery,svg,d3.js,Javascript,Jquery,Svg,D3.js,我不小心用我正在更新的d3选择器在svg元素的顶部覆盖了相同的事件处理程序 add_listeners = function() { d3.selectAll(".nodes").on("click", function() { //Event handler to highlight clicked d3 element }); jQuery('#some_navigation_button').on('click', function() {

我不小心用我正在更新的d3选择器在svg元素的顶部覆盖了相同的事件处理程序

add_listeners = function() {
    d3.selectAll(".nodes").on("click", function() { 
        //Event handler to highlight clicked d3 element
    });

    jQuery('#some_navigation_button').on('click', function() { 
        //Event handler 
    });
    jQuery('#some_refresh_button').on('click', function() { 
        //Event handler that re-draws some d3 svg elements
    });

    //... 5 other navigation and d3 handlers
}
add_listeners()
正在重新添加相同的处理程序。所以我试过了

add_listeners = function() {
    d3.selectAll(".nodes").off();
    jQuery('#some_navigation_button').off();
    jQuery('#some_refresh_button').off();

    d3.selectAll(".nodes").on("click", function() { 
        //Event handler 
    });
    jQuery('#some_navigation_button').on('click', function() { 
        //Event handler 
    });
    jQuery('#some_refresh_button').on('click', function() { 
        //Event handler that re-draws some d3 svg elements
    });

    //... 5 other navigation and d3 handlers
}
没有运气


注意:使用D3V2.9.1时,

发现,尽管D3V2.9.1不支持
.off()
,但有一种替代方法是
.on('click',null)

充分:

add_listeners = function() {
    // Remove handler before adding, to avoid superfluous handlers on elements.
    d3.selectAll(".nodes").on('click',null);

    d3.selectAll(".nodes").on("click", function() { 
        //Event handler 
    });
}
参考:


您提到这是在更新期间。您是否考虑过仅在.enter选择期间添加事件处理程序?看到了吗?这很普遍吗我在上面的add_listeners()中添加了十个其他处理程序。其中一些不在d3.js对象上,
.off()
在d3.js对象上工作。所以我希望在一个地方统一解决这个问题。事件处理程序在做什么?他们都在同一个选区吗?可能过多,但这一切都取决于上下文。上面添加了一些更清晰的内容。还值得注意的是:如果已在所选元素上为相同类型注册了事件侦听器,则在添加新侦听器之前将删除现有侦听器。。因此实际上没有必要调用
.on('click',null)
,因为旧的事件侦听器将被覆盖。但是我认为我们仍然应该这样做以避免内存泄漏..怎么说