【发布时间】:2015-01-20 17:37:42
【问题描述】:
这个问题恰好涉及 D3 特定的功能,但不是 D3 特定的问题。我有两个 D3 图表,我创建并附加了缩放功能,目的是保持缩放比例和变换位置相等,这样当一个图表缩放时,另一个图表会自动缩放到相同的比例和位置。为此,我在放大一个图表时触发一个自定义事件,以便我可以自动调整另一个图表:
// Within the chart definition:
var svg = ...; // The chart body definition
var zoom = d3.behavior.zoom()
.on("zoom", function(e){
// do stuff...
$("#chart-div").trigger({
type: "my.zoom",
translate: d3.event.translate,
scale: d3.event.scale
});
});
svg.call(zoom);
然后我创建允许我手动调整每个图表的缩放级别的方法,在此过程中触发 D3 zoom 事件:
var adjustZoom = function(t,s){
svg.transition().duration(500).call(zoom.scale(s).translate(t).event);
};
然后我将事件侦听器附加到我的每个图表,这样当我与其中一个交互并导致其缩放级别发生变化时,另一个会自动更新:
$("#chart-div1").on("my.zoom", function(e){
chart2.adjustZoom(e.translate, e.scale);
});
$("#chart-div2").on("my.zoom", function(e){
chart1.adjustZoom(e.translate, e.scale);
});
明显的问题是调用adjustZoom 方法会触发D3 zoom 事件,因此在两个图表上附加事件侦听器会创建周期性事件,因为每个图表都试图无限调整另一个图表。
1. chart1 [manual zoom] --> trigger d3.zoom --> triggers my.zoom
2. chart2 [my.zoom listener] --> trigger d3.zoom --> triggers my.zoom
3. chart1 [my.zoom listener] --> trigger d3.zoom --> triggers my.zoom
etc...
我想实现的是一种在决定触发另一个my.zoom事件时检查my.zoom事件是否已经被触发的方法,以防止事件的循环触发(防止上面示例中的步骤3) ,但我不知道该怎么做。无论如何,函数或事件是否可以知道触发它的事件然后自行停止?
【问题讨论】:
标签: javascript events d3.js