@@ -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
4160function 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