example/public/ueditor/third-party/highcharts/highcharts.src.js
function (e) {

		var self = this,
			chart = self.chart,
			pinchDown = self.pinchDown,
			followTouchMove = chart.tooltip && chart.tooltip.options.followTouchMove,
			touches = e.touches,
			touchesLength = touches.length,
			lastValidTouch = self.lastValidTouch,
			zoomHor = self.zoomHor || self.pinchHor,
			zoomVert = self.zoomVert || self.pinchVert,
			hasZoom = zoomHor || zoomVert,
			selectionMarker = self.selectionMarker,
			transform = {},
			fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && 
				chart.runTrackerClick) || chart.runChartClick),
			clip = {};

		// On touch devices, only proceed to trigger click if a handler is defined
		if ((hasZoom || followTouchMove) && !fireClickEvent) {
			e.preventDefault();
		}
		
		// Normalize each touch
		map(touches, function (e) {
			return self.normalize(e);
		});
			
		// Register the touch start position
		if (e.type === 'touchstart') {
			each(touches, function (e, i) {
				pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };
			});
			lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];
			lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];

			// Identify the data bounds in pixels
			each(chart.axes, function (axis) {
				if (axis.zoomEnabled) {
					var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],
						minPixelPadding = axis.minPixelPadding,
						min = axis.toPixels(axis.dataMin),
						max = axis.toPixels(axis.dataMax),
						absMin = mathMin(min, max),
						absMax = mathMax(min, max);

					// Store the bounds for use in the touchmove handler
					bounds.min = mathMin(axis.pos, absMin - minPixelPadding);
					bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);
				}
			});
		
		// Event type is touchmove, handle panning and pinching
		} else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first
			

			// Set the marker
			if (!selectionMarker) {
				self.selectionMarker = selectionMarker = extend({
					destroy: noop
				}, chart.plotBox);
			}

			

			if (zoomHor) {
				self.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
			}
			if (zoomVert) {
				self.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
			}

			self.hasPinched = hasZoom;

			// Scale and translate the groups to provide visual feedback during pinching
			self.scaleGroups(transform, clip);
			
			// Optionally move the tooltip on touchmove
			if (!hasZoom && followTouchMove && touchesLength === 1) {
				this.runPointActions(self.normalize(e));
			}
		}
	}
function (e) {

		var self = this,
			chart = self.chart,
			pinchDown = self.pinchDown,
			followTouchMove = chart.tooltip && chart.tooltip.options.followTouchMove,
			touches = e.touches,
			touchesLength = touches.length,
			lastValidTouch = self.lastValidTouch,
			zoomHor = self.zoomHor || self.pinchHor,
			zoomVert = self.zoomVert || self.pinchVert,
			hasZoom = zoomHor || zoomVert,
			selectionMarker = self.selectionMarker,
			transform = {},
			fireClickEvent = touchesLength === 1 && ((self.inClass(e.target, PREFIX + 'tracker') && 
				chart.runTrackerClick) || chart.runChartClick),
			clip = {};

		// On touch devices, only proceed to trigger click if a handler is defined
		if ((hasZoom || followTouchMove) && !fireClickEvent) {
			e.preventDefault();
		}
		
		// Normalize each touch
		map(touches, function (e) {
			return self.normalize(e);
		});
			
		// Register the touch start position
		if (e.type === 'touchstart') {
			each(touches, function (e, i) {
				pinchDown[i] = { chartX: e.chartX, chartY: e.chartY };
			});
			lastValidTouch.x = [pinchDown[0].chartX, pinchDown[1] && pinchDown[1].chartX];
			lastValidTouch.y = [pinchDown[0].chartY, pinchDown[1] && pinchDown[1].chartY];

			// Identify the data bounds in pixels
			each(chart.axes, function (axis) {
				if (axis.zoomEnabled) {
					var bounds = chart.bounds[axis.horiz ? 'h' : 'v'],
						minPixelPadding = axis.minPixelPadding,
						min = axis.toPixels(axis.dataMin),
						max = axis.toPixels(axis.dataMax),
						absMin = mathMin(min, max),
						absMax = mathMax(min, max);

					// Store the bounds for use in the touchmove handler
					bounds.min = mathMin(axis.pos, absMin - minPixelPadding);
					bounds.max = mathMax(axis.pos + axis.len, absMax + minPixelPadding);
				}
			});
		
		// Event type is touchmove, handle panning and pinching
		} else if (pinchDown.length) { // can be 0 when releasing, if touchend fires first
			

			// Set the marker
			if (!selectionMarker) {
				self.selectionMarker = selectionMarker = extend({
					destroy: noop
				}, chart.plotBox);
			}

			

			if (zoomHor) {
				self.pinchTranslateDirection(true, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
			}
			if (zoomVert) {
				self.pinchTranslateDirection(false, pinchDown, touches, transform, selectionMarker, clip, lastValidTouch);
			}

			self.hasPinched = hasZoom;

			// Scale and translate the groups to provide visual feedback during pinching
			self.scaleGroups(transform, clip);
			
			// Optionally move the tooltip on touchmove
			if (!hasZoom && followTouchMove && touchesLength === 1) {
				this.runPointActions(self.normalize(e));
			}
		}
	}
function ( e ) { var self = this , chart = self . chart , pinchDown = self . pinchDown , followTouchMove = chart . tooltip && chart . tooltip . options . followTouchMove , touches = e . touches , touchesLength = touches . length , lastValidTouch = self . lastValidTouch , zoomHor = self . zoomHor || self . pinchHor , zoomVert = self . zoomVert || self . pinchVert , hasZoom = zoomHor || zoomVert , selectionMarker = self . selectionMarker , transform = { } , fireClickEvent = touchesLength === 1 && ( ( self . inClass ( e . target , PREFIX + 'tracker' ) && chart . runTrackerClick ) || chart . runChartClick ) , clip = { } ; // On touch devices, only proceed to trigger click if a handler is defined if ( ( hasZoom || followTouchMove ) && ! fireClickEvent ) { e . preventDefault ( ) ; } // Normalize each touch map ( touches , function ( e ) { return self . normalize ( e ) ; } ) ; // Register the touch start position if ( e . type === 'touchstart' ) { each ( touches , function ( e , i ) { pinchDown [ i ] = { chartX : e . chartX , chartY : e . chartY } ; } ) ; lastValidTouch . x = [ pinchDown [ 0 ] . chartX , pinchDown [ 1 ] && pinchDown [ 1 ] . chartX ] ; lastValidTouch . y = [ pinchDown [ 0 ] . chartY , pinchDown [ 1 ] && pinchDown [ 1 ] . chartY ] ; // Identify the data bounds in pixels each ( chart . axes , function ( axis ) { if ( axis . zoomEnabled ) { var bounds = chart . bounds [ axis . horiz ? 'h' : 'v' ] , minPixelPadding = axis . minPixelPadding , min = axis . toPixels ( axis . dataMin ) , max = axis . toPixels ( axis . dataMax ) , absMin = mathMin ( min , max ) , absMax = mathMax ( min , max ) ; // Store the bounds for use in the touchmove handler bounds . min = mathMin ( axis . pos , absMin - minPixelPadding ) ; bounds . max = mathMax ( axis . pos + axis . len , absMax + minPixelPadding ) ; } } ) ; // Event type is touchmove, handle panning and pinching } else if ( pinchDown . length ) { // can be 0 when releasing, if touchend fires first // Set the marker if ( ! selectionMarker ) { self . selectionMarker = selectionMarker = extend ( { destroy : noop } , chart . plotBox ) ; } if ( zoomHor ) { self . pinchTranslateDirection ( true , pinchDown , touches , transform , selectionMarker , clip , lastValidTouch ) ; } if ( zoomVert ) { self . pinchTranslateDirection ( false , pinchDown , touches , transform , selectionMarker , clip , lastValidTouch ) ; } self . hasPinched = hasZoom ; // Scale and translate the groups to provide visual feedback during pinching self . scaleGroups ( transform , clip ) ; // Optionally move the tooltip on touchmove if ( ! hasZoom && followTouchMove && touchesLength === 1 ) { this . runPointActions ( self . normalize ( e ) ) ; } } }
Handle touch events with two touches
Handle touch events with two touches