Javascript 如何使用d3.js选择器删除处理程序
我不小心用我正在更新的d3选择器在svg元素的顶部覆盖了相同的事件处理程序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() {
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)
,因为旧的事件侦听器将被覆盖。但是我认为我们仍然应该这样做以避免内存泄漏..怎么说