Skip to content

Commit 3f16842

Browse files
stop infinite event recursion using a reference count
1 parent e3545be commit 3f16842

File tree

1 file changed

+23
-12
lines changed

1 file changed

+23
-12
lines changed

src/coordinate-grid-mixin.js

+23-12
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ dc.coordinateGridMixin = function (_chart) {
6363
var _zoom = d3.zoom().on('zoom', onZoom);
6464
var _nullZoom = d3.zoom().on('zoom', null);
6565
var _hasBeenMouseZoomable = false;
66+
var _stopBrushEvents = 0, _stopZoomEvents = 0;
6667

6768
var _rangeChart;
6869
var _focusChart;
@@ -1057,12 +1058,12 @@ dc.coordinateGridMixin = function (_chart) {
10571058
};
10581059

10591060
_chart._brushing = function () {
1060-
var event = d3.event;
1061-
// Avoids infinite recursion
1062-
// To ensure that when it is called because of brush.move there is no d3.event.sourceEvent
1063-
d3.event = null;
1064-
if (!event.sourceEvent) { return; }
1065-
var selection = event.selection;
1061+
if (_stopBrushEvents) {
1062+
return;
1063+
}
1064+
++_stopBrushEvents;
1065+
1066+
var selection = d3.event.selection;
10661067
if (selection) {
10671068
selection = selection.map(_chart.x().invert);
10681069
}
@@ -1073,17 +1074,22 @@ dc.coordinateGridMixin = function (_chart) {
10731074

10741075
if (_chart.brushIsEmpty(selection)) {
10751076
dc.events.trigger(function () {
1077+
++_stopBrushEvents;
10761078
_chart.filter(null);
10771079
_chart.redrawGroup();
1080+
--_stopBrushEvents;
10781081
}, dc.constants.EVENT_DELAY);
10791082
} else {
10801083
var rangedFilter = dc.filters.RangedFilter(selection[0], selection[1]);
10811084

10821085
dc.events.trigger(function () {
1086+
++_stopBrushEvents;
10831087
_chart.replaceFilter(rangedFilter);
10841088
_chart.redrawGroup();
1089+
--_stopBrushEvents;
10851090
}, dc.constants.EVENT_DELAY);
10861091
}
1092+
--_stopBrushEvents;
10871093
};
10881094

10891095
_chart.redrawBrush = function (selection) {
@@ -1207,11 +1213,13 @@ dc.coordinateGridMixin = function (_chart) {
12071213
_chart.renderYAxis(_chart.g());
12081214
}
12091215

1216+
++_stopBrushEvents;
12101217
if (render) {
12111218
_chart.renderBrush(_chart.g());
12121219
} else {
12131220
_chart.redrawBrush(_chart.filter());
12141221
}
1222+
--_stopBrushEvents;
12151223
_chart.fadeDeselectedArea(_chart.filter());
12161224
_resizing = false;
12171225
}
@@ -1246,8 +1254,10 @@ dc.coordinateGridMixin = function (_chart) {
12461254

12471255
_chart.root().call(_zoom);
12481256

1249-
// Tell D3 zoom our current zoom/pan status
1257+
// Tell D3 zoom our current zoom/pan status, but ignore any resulting events
1258+
++_stopZoomEvents;
12501259
updateD3zoomTransform();
1260+
--_stopZoomEvents;
12511261
};
12521262

12531263
_chart._disableMouseZoom = function () {
@@ -1300,14 +1310,15 @@ dc.coordinateGridMixin = function (_chart) {
13001310
}
13011311

13021312
function onZoom () {
1303-
var event = d3.event;
1304-
// Avoids infinite recursion
1305-
// To ensure that when it is called because of programatic zoom there is no d3.event.sourceEvent
1306-
d3.event = null;
1307-
if (!event.sourceEvent) { return; }
1313+
if (_stopZoomEvents) {
1314+
return;
1315+
}
1316+
++_stopZoomEvents;
13081317

13091318
var newDomain = d3.event.transform.rescaleX(_origX).domain();
13101319
_chart.focus(newDomain, false);
1320+
1321+
--_stopZoomEvents;
13111322
}
13121323

13131324
/**

0 commit comments

Comments
 (0)