Skip to content

Commit 4d1d2e8

Browse files
authored
Fix listener setup (#248)
1 parent 433bf51 commit 4d1d2e8

File tree

1 file changed

+62
-55
lines changed

1 file changed

+62
-55
lines changed

src/plugin.js

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,26 @@ function resolveOptions(chart, options) {
3535
if (typeof chart.options.pan !== 'undefined') {
3636
deprecatedOptions.zoom = chart.options.zoom;
3737
}
38-
chart.$zoom._options = helpers.merge({}, [options, deprecatedOptions]);
38+
var props = chart.$zoom;
39+
options = props._options = helpers.merge({}, [options, deprecatedOptions]);
40+
41+
// Install listeners. Do this dynamically based on options so that we can turn zoom on and off
42+
// We also want to make sure listeners aren't always on. E.g. if you're scrolling down a page
43+
// and the mouse goes over a chart you don't want it intercepted unless the plugin is enabled
44+
var node = props._node;
45+
if (!(options.zoom && options.zoom.drag)) {
46+
node.addEventListener('wheel', props._wheelHandler);
47+
} else {
48+
node.removeEventListener('wheel', props._wheelHandler);
49+
}
50+
if (options.zoom && options.zoom.drag) {
51+
node.addEventListener('mousedown', props._mouseDownHandler);
52+
node.ownerDocument.addEventListener('mouseup', props._mouseUpHandler);
53+
} else {
54+
node.removeEventListener('mousedown', props._mouseDownHandler);
55+
node.removeEventListener('mousemove', props._mouseMoveHandler);
56+
node.ownerDocument.removeEventListener('mouseup', props._mouseUpHandler);
57+
}
3958
}
4059

4160
function storeOriginalOptions(chart) {
@@ -388,30 +407,26 @@ var zoomPlugin = {
388407
chartInstance.$zoom = {
389408
_originalOptions: {}
390409
};
391-
resolveOptions(chartInstance, pluginOptions);
392-
393410
var node = chartInstance.$zoom._node = chartInstance.chart.ctx.canvas;
411+
resolveOptions(chartInstance, pluginOptions);
394412

395413
var options = chartInstance.$zoom._options;
396414
var panThreshold = options.pan && options.pan.threshold;
397415

398416
chartInstance.$zoom._mouseDownHandler = function(event) {
399-
if (chartInstance.$zoom._options.zoom && chartInstance.$zoom._options.zoom.drag) {
400-
node.addEventListener('mousemove', chartInstance.$zoom._mouseMoveHandler);
401-
chartInstance.$zoom._dragZoomStart = event;
402-
}
417+
node.addEventListener('mousemove', chartInstance.$zoom._mouseMoveHandler);
418+
chartInstance.$zoom._dragZoomStart = event;
403419
};
404-
node.addEventListener('mousedown', chartInstance.$zoom._mouseDownHandler);
405420

406421
chartInstance.$zoom._mouseMoveHandler = function(event) {
407-
if (chartInstance.$zoom._options.zoom && chartInstance.$zoom._options.zoom.drag && chartInstance.$zoom._dragZoomStart) {
422+
if (chartInstance.$zoom._dragZoomStart) {
408423
chartInstance.$zoom._dragZoomEnd = event;
409424
chartInstance.update(0);
410425
}
411426
};
412427

413428
chartInstance.$zoom._mouseUpHandler = function(event) {
414-
if (!(chartInstance.$zoom._options.zoom && chartInstance.$zoom._options.zoom.drag) || !chartInstance.$zoom._dragZoomStart) {
429+
if (!chartInstance.$zoom._dragZoomStart) {
415430
return;
416431
}
417432

@@ -453,35 +468,30 @@ var zoomPlugin = {
453468
y: (startY - chartArea.top) / (1 - dragDistanceY / chartDistanceY) + chartArea.top
454469
});
455470
};
456-
node.ownerDocument.addEventListener('mouseup', chartInstance.$zoom._mouseUpHandler);
457471

458472
chartInstance.$zoom._wheelHandler = function(event) {
459-
if (!(chartInstance.$zoom._options.zoom && chartInstance.$zoom._options.zoom.drag)) {
460-
var rect = event.target.getBoundingClientRect();
461-
var offsetX = event.clientX - rect.left;
462-
var offsetY = event.clientY - rect.top;
473+
var rect = event.target.getBoundingClientRect();
474+
var offsetX = event.clientX - rect.left;
475+
var offsetY = event.clientY - rect.top;
463476

464-
var center = {
465-
x: offsetX,
466-
y: offsetY
467-
};
477+
var center = {
478+
x: offsetX,
479+
y: offsetY
480+
};
468481

469-
var speedPercent = chartInstance.$zoom._options.zoom.speed;
482+
var speedPercent = chartInstance.$zoom._options.zoom.speed;
470483

471-
if (event.deltaY >= 0) {
472-
speedPercent = -speedPercent;
473-
}
474-
doZoom(chartInstance, 1 + speedPercent, 1 + speedPercent, center);
484+
if (event.deltaY >= 0) {
485+
speedPercent = -speedPercent;
486+
}
487+
doZoom(chartInstance, 1 + speedPercent, 1 + speedPercent, center);
475488

476-
// Prevent the event from triggering the default behavior (eg. Content scrolling).
477-
if (event.cancelable) {
478-
event.preventDefault();
479-
}
489+
// Prevent the event from triggering the default behavior (eg. Content scrolling).
490+
if (event.cancelable) {
491+
event.preventDefault();
480492
}
481493
};
482494

483-
node.addEventListener('wheel', chartInstance.$zoom._wheelHandler);
484-
485495
if (Hammer) {
486496
var mc = new Hammer.Manager(node);
487497
mc.add(new Hammer.Pinch());
@@ -618,31 +628,28 @@ var zoomPlugin = {
618628
},
619629

620630
destroy: function(chartInstance) {
621-
if (chartInstance.$zoom) {
622-
var node = chartInstance.$zoom._node;
623-
624-
if (chartInstance.$zoom._options.zoom) {
625-
node.removeEventListener('mousedown', chartInstance.$zoom._mouseDownHandler);
626-
node.removeEventListener('mousemove', chartInstance.$zoom._mouseMoveHandler);
627-
node.ownerDocument.removeEventListener('mouseup', chartInstance.$zoom._mouseUpHandler);
628-
node.removeEventListener('wheel', chartInstance.$zoom._wheelHandler);
629-
}
630-
631-
if (Hammer) {
632-
node.removeEventListener('click', chartInstance.$zoom._ghostClickHandler);
633-
}
634-
635-
delete chartInstance.$zoom;
636-
637-
var mc = chartInstance._mc;
638-
if (mc) {
639-
mc.remove('pinchstart');
640-
mc.remove('pinch');
641-
mc.remove('pinchend');
642-
mc.remove('panstart');
643-
mc.remove('pan');
644-
mc.remove('panend');
645-
}
631+
if (!chartInstance.$zoom) {
632+
return;
633+
}
634+
var props = chartInstance.$zoom;
635+
var node = props._node;
636+
637+
node.removeEventListener('mousedown', props._mouseDownHandler);
638+
node.removeEventListener('mousemove', props._mouseMoveHandler);
639+
node.ownerDocument.removeEventListener('mouseup', props._mouseUpHandler);
640+
node.removeEventListener('wheel', props._wheelHandler);
641+
node.removeEventListener('click', props._ghostClickHandler);
642+
643+
delete chartInstance.$zoom;
644+
645+
var mc = chartInstance._mc;
646+
if (mc) {
647+
mc.remove('pinchstart');
648+
mc.remove('pinch');
649+
mc.remove('pinchend');
650+
mc.remove('panstart');
651+
mc.remove('pan');
652+
mc.remove('panend');
646653
}
647654
}
648655
};

0 commit comments

Comments
 (0)