tooltip.js 68.3 KB
Newer Older
K
kener 已提交
1 2 3 4 5 6 7 8
/**
 * echarts组件:提示框
 *
 * @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。
 * @author Kener (@Kener-林峰, linzhifeng@baidu.com)
 *
 */
define(function (require) {
K
kener 已提交
9 10 11
    var Base = require('./base');
    
    // 图形依赖
K
kener 已提交
12
    var CrossShape = require('../util/shape/Cross');
K
kener 已提交
13 14
    var LineShape = require('zrender/shape/Line');
    var RectangleShape = require('zrender/shape/Rectangle');
K
kener 已提交
15
    var rectangleInstance = new RectangleShape({});
K
kener 已提交
16
    
K
kener 已提交
17 18 19 20 21 22 23 24 25
    var ecConfig = require('../config');
    var ecData = require('../util/ecData');
    var zrConfig = require('zrender/config');
    var zrEvent = require('zrender/tool/event');
    var zrArea = require('zrender/tool/area');
    var zrColor = require('zrender/tool/color');
    var zrUtil = require('zrender/tool/util');
    var zrShapeBase = require('zrender/shape/Base');

K
kener 已提交
26 27 28 29 30 31
    /**
     * 构造函数
     * @param {Object} messageCenter echart消息中心
     * @param {ZRender} zr zrender实例
     * @param {Object} option 提示框参数
     * @param {HtmlElement} dom 目标对象
K
kener 已提交
32
     * @param {ECharts} myChart 当前图表实例
K
kener 已提交
33
     */
K
kener 已提交
34 35
    function Tooltip(ecTheme, messageCenter, zr, option, myChart) {
        Base.call(this, ecTheme, messageCenter, zr, option, myChart);
K
kener 已提交
36
        
K
kener 已提交
37
        this.dom = myChart.dom;
K
kener 已提交
38 39 40
        
        var self = this;
        self._onmousemove = function (param) {
K
kener 已提交
41
            return self.__onmousemove(param);
K
kener 已提交
42 43
        };
        self._onglobalout = function (param) {
K
kener 已提交
44
            return self.__onglobalout(param);
K
kener 已提交
45 46 47 48
        };
        
        this.zr.on(zrConfig.EVENT.MOUSEMOVE, self._onmousemove);
        this.zr.on(zrConfig.EVENT.GLOBALOUT, self._onglobalout);
K
kener 已提交
49

K
kener 已提交
50
        self._hide = function (param) {
K
kener 已提交
51
            return self.__hide(param);
K
kener 已提交
52 53
        };
        self._tryShow = function(param) {
K
kener 已提交
54 55
            return self.__tryShow(param);
        };
K
kener 已提交
56
        self._refixed = function(param) {
K
kener 已提交
57 58
            return self.__refixed(param);
        };
K
kener 已提交
59
        
K
kener 已提交
60 61
        self._setContent = function(ticket, res) {
            return self.__setContent(ticket, res);
K
jshint  
kener 已提交
62
        };
K
kener 已提交
63
        
K
kener 已提交
64
        this._tDom = this._tDom || document.createElement('div');
K
kener 已提交
65 66 67 68
        // 避免拖拽时页面选中的尴尬
        this._tDom.onselectstart = function() {
            return false;
        };
K
kener 已提交
69 70 71
        this._tDom.style.position = 'absolute';  // 不是多余的,别删!
        this.hasAppend = false;
        
K
kener 已提交
72
        this._axisLineShape && this.zr.delShape(this._axisLineShape.id);
K
kener 已提交
73 74
        this._axisLineShape = new LineShape({
            zlevel: this._zlevelBase,
75
            invisible: true,
K
kener 已提交
76 77 78 79 80
            hoverable: false
        });
        this.shapeList.push(this._axisLineShape);
        this.zr.addShape(this._axisLineShape);
        
K
kener 已提交
81
        this._axisShadowShape && this.zr.delShape(this._axisShadowShape.id);
K
kener 已提交
82 83
        this._axisShadowShape = new LineShape({
            zlevel: 1,                      // grid上,chart下
84
            invisible: true,
K
kener 已提交
85 86 87 88 89
            hoverable: false
        });
        this.shapeList.push(this._axisShadowShape);
        this.zr.addShape(this._axisShadowShape);
        
K
kener 已提交
90 91 92
        this._axisCrossShape && this.zr.delShape(this._axisCrossShape.id);
        this._axisCrossShape = new CrossShape({
            zlevel: this._zlevelBase,
93
            invisible: true,
K
kener 已提交
94 95 96 97 98
            hoverable: false
        });
        this.shapeList.push(this._axisCrossShape);
        this.zr.addShape(this._axisCrossShape);
        
K
kener 已提交
99
        this.showing = false;
K
kener 已提交
100
        this.refresh(option);
K
kener 已提交
101 102 103
    }
    
    Tooltip.prototype = {
104
        type: ecConfig.COMPONENT_TYPE_TOOLTIP,
K
kener 已提交
105
        // 通用样式
106
        _gCssText: 'position:absolute;display:block;border-style:solid;white-space:nowrap;',
K
kener 已提交
107 108 109
        /**
         * 根据配置设置dom样式
         */
110
        _style: function (opt) {
K
kener 已提交
111 112 113
            if (!opt) {
                return '';
            }
K
kener 已提交
114
            var cssText = [];
K
kener 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
            if (opt.transitionDuration) {
                var transitionText = 'left ' + opt.transitionDuration + 's,'
                                    + 'top ' + opt.transitionDuration + 's';
                cssText.push(
                    'transition:' + transitionText
                );
                cssText.push(
                    '-moz-transition:' + transitionText
                );
                cssText.push(
                    '-webkit-transition:' + transitionText
                );
                cssText.push(
                    '-o-transition:' + transitionText
                );
            }
K
kener 已提交
131 132 133 134 135 136 137 138 139 140 141 142

            if (opt.backgroundColor) {
                // for sb ie~
                cssText.push(
                    'background-Color:' + zrColor.toHex(
                        opt.backgroundColor
                    )
                );
                cssText.push('filter:alpha(opacity=70)');
                cssText.push('background-Color:' + opt.backgroundColor);
            }

143
            if (opt.borderWidth != null) {
K
kener 已提交
144 145 146
                cssText.push('border-width:' + opt.borderWidth + 'px');
            }

147
            if (opt.borderColor != null) {
K
kener 已提交
148
                cssText.push('border-color:' + opt.borderColor);
K
kener 已提交
149 150
            }

151
            if (opt.borderRadius != null) {
K
kener 已提交
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193
                cssText.push(
                    'border-radius:' + opt.borderRadius + 'px'
                );
                cssText.push(
                    '-moz-border-radius:' + opt.borderRadius + 'px'
                );
                cssText.push(
                    '-webkit-border-radius:' + opt.borderRadius + 'px'
                );
                cssText.push(
                    '-o-border-radius:' + opt.borderRadius + 'px'
                );
            }

            var textStyle = opt.textStyle;
            if (textStyle) {
                textStyle.color && cssText.push('color:' + textStyle.color);
                textStyle.decoration && cssText.push(
                    'text-decoration:' + textStyle.decoration
                );
                textStyle.align && cssText.push(
                    'text-align:' + textStyle.align
                );
                textStyle.fontFamily && cssText.push(
                    'font-family:' + textStyle.fontFamily
                );
                textStyle.fontSize && cssText.push(
                    'font-size:' + textStyle.fontSize + 'px'
                );
                textStyle.fontSize && cssText.push(
                    'line-height:' + Math.round(textStyle.fontSize*3/2) + 'px'
                );
                textStyle.fontStyle && cssText.push(
                    'font-style:' + textStyle.fontStyle
                );
                textStyle.fontWeight && cssText.push(
                    'font-weight:' + textStyle.fontWeight
                );
            }


            var padding = opt.padding;
194
            if (padding != null) {
K
kener 已提交
195
                padding = this.reformCssArray(padding);
K
kener 已提交
196 197 198 199 200 201 202 203 204 205 206
                cssText.push(
                    'padding:' + padding[0] + 'px '
                               + padding[1] + 'px '
                               + padding[2] + 'px '
                               + padding[3] + 'px'
                );
            }

            cssText = cssText.join(';') + ';';

            return cssText;
K
kener 已提交
207 208
        },
        
209
        __hide: function () {
K
kener 已提交
210 211
            if (this._tDom) {
                this._tDom.style.display = 'none';
K
kener 已提交
212
            }
213
            var needRefresh = false;
K
kener 已提交
214 215
            if (!this._axisLineShape.invisible) {
                this._axisLineShape.invisible = true;
K
kener 已提交
216
                this.zr.modShape(this._axisLineShape.id);
217 218
                needRefresh = true;
            }
K
kener 已提交
219 220
            if (!this._axisShadowShape.invisible) {
                this._axisShadowShape.invisible = true;
K
kener 已提交
221
                this.zr.modShape(this._axisShadowShape.id);
222
                needRefresh = true;
K
kener 已提交
223
            }
K
kener 已提交
224 225 226 227 228
            if (!this._axisCrossShape.invisible) {
                this._axisCrossShape.invisible = true;
                this.zr.modShape(this._axisCrossShape.id);
                needRefresh = true;
            }
K
kener 已提交
229 230 231
            if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                this.zr.delShape(this._lastTipShape.tipShape);
                this._lastTipShape = false;
K
kener 已提交
232
                this.shapeList.length = 2;
K
kener 已提交
233
            }
K
kener 已提交
234 235
            needRefresh && this.zr.refresh();
            this.showing = false;
K
kener 已提交
236 237
        },
        
238
        _show: function (position, x, y, specialCssText) {
K
kener 已提交
239 240
            var domHeight = this._tDom.offsetHeight;
            var domWidth = this._tDom.offsetWidth;
K
kener 已提交
241
            if (position) {
242
                if (typeof position === 'function') {
K
kener 已提交
243 244 245 246 247 248 249
                    position = position([x, y]);
                }
                if (position instanceof Array) {
                    x = position[0];
                    y = position[1];
                }
            }
K
kener 已提交
250
            if (x + domWidth > this._zrWidth) {
K
kener 已提交
251
                // 太靠右
K
kener 已提交
252
                //x = this._zrWidth - domWidth;
K
kener 已提交
253
                x -= (domWidth + 40);
K
kener 已提交
254
            }
K
kener 已提交
255
            if (y + domHeight > this._zrHeight) {
K
kener 已提交
256
                // 太靠下
K
kener 已提交
257
                //y = this._zrHeight - domHeight;
K
kener 已提交
258
                y -= (domHeight - 20);
K
kener 已提交
259
            }
K
kener 已提交
260 261 262
            if (y < 20) {
                y = 0;
            }
K
kener 已提交
263 264
            this._tDom.style.cssText = this._gCssText
                                  + this._defaultCssText
K
kener 已提交
265 266
                                  + (specialCssText ? specialCssText : '')
                                  + 'left:' + x + 'px;top:' + y + 'px;';
K
kener 已提交
267 268
            
            if (domHeight < 10 || domWidth < 10) {
K
kener 已提交
269 270
                // this._zrWidth - x < 100 || this._zrHeight - y < 100
                setTimeout(this._refixed, 20);
K
kener 已提交
271
            }
K
kener 已提交
272
            this.showing = true;
K
kener 已提交
273
        },
K
kener 已提交
274
        
275
        __refixed: function () {
K
kener 已提交
276
            if (this._tDom) {
K
kener 已提交
277
                var cssText = '';
K
kener 已提交
278 279 280 281
                var domHeight = this._tDom.offsetHeight;
                var domWidth = this._tDom.offsetWidth;
                if (this._tDom.offsetLeft + domWidth > this._zrWidth) {
                    cssText += 'left:' + (this._zrWidth - domWidth - 20) + 'px;';
K
kener 已提交
282
                }
K
kener 已提交
283 284
                if (this._tDom.offsetTop + domHeight > this._zrHeight) {
                    cssText += 'top:' + (this._zrHeight - domHeight - 10) + 'px;';
K
kener 已提交
285 286
                }
                if (cssText !== '') {
K
kener 已提交
287
                    this._tDom.style.cssText += cssText;
K
kener 已提交
288 289
                }
            }
K
kener 已提交
290
        },
K
kener 已提交
291
        
292
        __tryShow: function () {
K
kener 已提交
293 294
            var needShow;
            var trigger;
K
kener 已提交
295
            if (!this._curTarget) {
K
kener 已提交
296
                // 坐标轴事件
K
kener 已提交
297
                this._findPolarTrigger() || this._findAxisTrigger();
K
kener 已提交
298 299 300
            }
            else {
                // 数据项事件
301
                if (this._curTarget._type === 'island' && this.option.tooltip.show) {
K
kener 已提交
302
                    this._showItemTrigger();
K
kener 已提交
303 304
                    return;
                }
K
kener 已提交
305 306 307
                var serie = ecData.get(this._curTarget, 'series');
                var data = ecData.get(this._curTarget, 'data');
                needShow = this.deepQuery(
K
kener 已提交
308
                    [data, serie, this.option],
K
kener 已提交
309 310
                    'tooltip.show'
                );
311
                if (serie == null || data == null || !needShow) {
K
kener 已提交
312
                    // 不响应tooltip的数据对象延时隐藏
K
kener 已提交
313 314 315
                    clearTimeout(this._hidingTicket);
                    clearTimeout(this._showingTicket);
                    this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
316 317
                }
                else {
K
kener 已提交
318
                    trigger = this.deepQuery(
K
kener 已提交
319
                        [data, serie, this.option],
K
kener 已提交
320 321
                        'tooltip.trigger'
                    );
K
kener 已提交
322
                    
323
                    trigger === 'axis'
K
kener 已提交
324 325 326 327 328
                                ? this._showAxisTrigger(
                                      serie.xAxisIndex, serie.yAxisIndex,
                                      ecData.get(this._curTarget, 'dataIndex')
                                  )
                                : this._showItemTrigger();
K
kener 已提交
329 330
                }
            }
K
kener 已提交
331
        },
K
kener 已提交
332

K
kener 已提交
333 334 335
        /**
         * 直角系 
         */
336
        _findAxisTrigger: function () {
K
kener 已提交
337
            if (!this.component.xAxis || !this.component.yAxis) {
K
kener 已提交
338
                this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
339 340
                return;
            }
K
kener 已提交
341
            var series = this.option.series;
K
kener 已提交
342 343
            var xAxisIndex;
            var yAxisIndex;
K
kener 已提交
344 345
            for (var i = 0, l = series.length; i < l; i++) {
                // 找到第一个axis触发tooltip的系列
346
                if (this.deepQuery([series[i], this.option], 'tooltip.trigger') === 'axis') {
K
kener 已提交
347 348
                    xAxisIndex = series[i].xAxisIndex || 0;
                    yAxisIndex = series[i].yAxisIndex || 0;
K
kener 已提交
349 350
                    if (this.component.xAxis.getAxis(xAxisIndex)
                        && this.component.xAxis.getAxis(xAxisIndex).type
351
                           === ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
K
kener 已提交
352 353
                    ) {
                        // 横轴为类目轴
K
kener 已提交
354
                        this._showAxisTrigger(xAxisIndex, yAxisIndex,
K
kener 已提交
355 356 357
                            this._getNearestDataIndex(
                                'x', this.component.xAxis.getAxis(xAxisIndex)
                            )
K
kener 已提交
358 359
                        );
                        return;
K
kener 已提交
360
                    } 
K
kener 已提交
361 362
                    else if (this.component.yAxis.getAxis(yAxisIndex)
                             && this.component.yAxis.getAxis(yAxisIndex).type
363
                                === ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
K
kener 已提交
364 365
                    ) {
                        // 纵轴为类目轴
K
kener 已提交
366
                        this._showAxisTrigger(xAxisIndex, yAxisIndex,
K
kener 已提交
367 368 369
                            this._getNearestDataIndex(
                                'y', this.component.yAxis.getAxis(yAxisIndex)
                            )
K
kener 已提交
370 371 372
                        );
                        return;
                    }
K
kener 已提交
373 374 375
                    else {
                        // 双数值轴
                        this._showAxisTrigger(xAxisIndex, yAxisIndex, -1);
K
kener 已提交
376
                        return;
K
kener 已提交
377
                    }
K
kener 已提交
378 379
                }
            }
380
            if (this.option.tooltip.axisPointer.type === 'cross') {
K
kener 已提交
381 382
                this._showAxisTrigger(-1, -1, -1);
            }
K
kener 已提交
383
        },
K
kener 已提交
384 385 386 387
        
        /**
         * 极坐标 
         */
388
        _findPolarTrigger: function () {
K
kener 已提交
389
            if (!this.component.polar) {
K
kener 已提交
390 391
                return false;
            }
K
kener 已提交
392 393
            var x = zrEvent.getX(this._event);
            var y = zrEvent.getY(this._event);
K
kener 已提交
394
            var polarIndex = this.component.polar.getNearestIndex([x, y]);
K
kener 已提交
395 396 397 398 399 400 401 402 403 404
            var valueIndex;
            if (polarIndex) {
                valueIndex = polarIndex.valueIndex;
                polarIndex = polarIndex.polarIndex;
            }
            else {
                polarIndex = -1;
            }
            
            if (polarIndex != -1) {
K
kener 已提交
405
                return this._showPolarTrigger(polarIndex, valueIndex);
K
kener 已提交
406 407 408
            }
            
            return false;
K
kener 已提交
409
        },
K
kener 已提交
410
        
K
kener 已提交
411 412 413
        /**
         * 根据坐标轴事件带的属性获取最近的axisDataIndex
         */
414
        _getNearestDataIndex: function (direction, categoryAxis) {
K
kener 已提交
415
            var dataIndex = -1;
K
kener 已提交
416 417
            var x = zrEvent.getX(this._event);
            var y = zrEvent.getY(this._event);
418
            if (direction === 'x') {
K
kener 已提交
419 420 421
                // 横轴为类目轴
                var left;
                var right;
K
kener 已提交
422
                var xEnd = this.component.grid.getXend();
K
kener 已提交
423 424
                var curCoord = categoryAxis.getCoordByIndex(dataIndex);
                while (curCoord < xEnd) {
K
kener 已提交
425
                    right = curCoord;
K
kener 已提交
426 427 428
                    if (curCoord <= x) {
                        left = curCoord;
                    }
K
kener 已提交
429
                    else {
K
kener 已提交
430 431 432 433
                        break;
                    }
                    curCoord = categoryAxis.getCoordByIndex(++dataIndex);
                }
K
kener 已提交
434 435 436 437 438
                if (dataIndex <= 0) {
                    dataIndex = 0;
                }
                else if (x - left <= right - x) {
                    dataIndex -= 1;
K
kener 已提交
439 440 441
                }
                else {
                    // 离右边近,看是否为最后一个
442
                    if (categoryAxis.getNameByIndex(dataIndex) == null) {
K
kener 已提交
443
                        dataIndex -= 1;
K
kener 已提交
444 445 446 447 448 449 450 451
                    }
                }
                return dataIndex;
            }
            else {
                // 纵轴为类目轴
                var top;
                var bottom;
K
kener 已提交
452
                var yStart = this.component.grid.getY();
K
kener 已提交
453 454
                var curCoord = categoryAxis.getCoordByIndex(dataIndex);
                while (curCoord > yStart) {
K
kener 已提交
455
                    top = curCoord;
K
kener 已提交
456 457 458
                    if (curCoord >= y) {
                        bottom = curCoord;
                    }
K
kener 已提交
459
                    else {
K
kener 已提交
460 461 462 463 464
                        break;
                    }
                    curCoord = categoryAxis.getCoordByIndex(++dataIndex);
                }

K
kener 已提交
465 466 467
                if (dataIndex <= 0) {
                    dataIndex = 0;
                }
K
kener 已提交
468
                else if (y - top >= bottom - y) {
K
kener 已提交
469
                    dataIndex -= 1;
K
kener 已提交
470 471 472
                }
                else {
                    // 离上方边近,看是否为最后一个
473
                    if (categoryAxis.getNameByIndex(dataIndex) == null) {
K
kener 已提交
474
                        dataIndex -= 1;
K
kener 已提交
475 476 477 478 479
                    }
                }
                return dataIndex;
            }
            return -1;
K
kener 已提交
480
        },
K
kener 已提交
481

K
kener 已提交
482 483 484
        /**
         * 直角系 
         */
485
        _showAxisTrigger: function (xAxisIndex, yAxisIndex, dataIndex) {
K
kener 已提交
486
            !this._event.connectTrigger && this.messageCenter.dispatch(
K
kener 已提交
487
                ecConfig.EVENT.TOOLTIP_IN_GRID,
K
kener 已提交
488 489 490
                this._event,
                null,
                this.myChart
K
kener 已提交
491
            );
492 493 494 495
            if (this.component.xAxis == null
                || this.component.yAxis == null
                || xAxisIndex == null
                || yAxisIndex == null
K
kener 已提交
496
                // || dataIndex < 0
K
kener 已提交
497 498
            ) {
                // 不响应tooltip的数据对象延时隐藏
K
kener 已提交
499 500 501
                clearTimeout(this._hidingTicket);
                clearTimeout(this._showingTicket);
                this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
502 503
                return;
            }
K
kener 已提交
504
            var series = this.option.series;
K
kener 已提交
505
            var seriesArray = [];
K
kener 已提交
506
            var seriesIndex = [];
K
kener 已提交
507 508 509
            var categoryAxis;

            var formatter;
K
kener 已提交
510
            var position;
K
kener 已提交
511
            var showContent;
K
kener 已提交
512
            var specialCssText = '';
513 514
            if (this.option.tooltip.trigger === 'axis') {
                if (!this.option.tooltip.show) {
K
kener 已提交
515 516
                    return;
                }
K
kener 已提交
517
                formatter = this.option.tooltip.formatter;
K
kener 已提交
518
                position = this.option.tooltip.position;
K
kener 已提交
519 520
            }

K
kener 已提交
521 522 523 524 525 526 527 528 529 530 531 532
            var axisLayout = xAxisIndex != -1
                             && this.component.xAxis.getAxis(xAxisIndex).type
                                === ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
                             ? 'xAxis'      // 横轴为类目轴,找到所有用这条横轴并且axis触发的系列数据
                             : yAxisIndex != -1
                               && this.component.yAxis.getAxis(yAxisIndex).type
                                  === ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
                               ? 'yAxis'    // 纵轴为类目轴,找到所有用这条纵轴并且axis触发的系列数据
                               : false;
            if (axisLayout) {
                var axisIndex = axisLayout == 'xAxis' ? xAxisIndex : yAxisIndex;
                categoryAxis = this.component[axisLayout].getAxis(axisIndex);
K
kener 已提交
533
                for (var i = 0, l = series.length; i < l; i++) {
K
kener 已提交
534
                    if (!this._isSelected(series[i].name)) {
K
kener 已提交
535 536
                        continue;
                    }
K
kener 已提交
537
                    if (series[i][axisLayout + 'Index'] === axisIndex
538
                        && this.deepQuery([series[i], this.option], 'tooltip.trigger') === 'axis'
K
kener 已提交
539
                    ) {
K
kener 已提交
540 541 542 543 544 545 546
                        showContent = this.query(series[i], 'tooltip.showContent') 
                                      || showContent;
                        formatter = this.query(series[i], 'tooltip.formatter') 
                                    || formatter;
                        position = this.query(series[i], 'tooltip.position') 
                                   || position;
                        
K
kener 已提交
547
                        specialCssText += this._style(this.query(series[i], 'tooltip'));
K
kener 已提交
548
                        if (series[i].stack != null && axisLayout == 'xAxis') {
K
kener 已提交
549 550 551 552 553 554 555
                            seriesArray.unshift(series[i]);
                            seriesIndex.unshift(i);
                        }
                        else {
                            seriesArray.push(series[i]);
                            seriesIndex.push(i);
                        }
K
kener 已提交
556 557
                    }
                }
K
kener 已提交
558
                
K
kener 已提交
559
                // 寻找高亮元素
K
kener 已提交
560
                this.messageCenter.dispatch(
K
kener 已提交
561
                    ecConfig.EVENT.TOOLTIP_HOVER,
K
kener 已提交
562
                    this._event,
K
kener 已提交
563
                    {
564 565
                        seriesIndex: seriesIndex,
                        dataIndex: dataIndex
K
kener 已提交
566 567
                    },
                    this.myChart
K
kener 已提交
568
                );
K
kener 已提交
569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593
                
                var x;
                var y;
                var rect;
                if (axisLayout == 'xAxis') {
                    x = this.subPixelOptimize(
                        categoryAxis.getCoordByIndex(dataIndex),
                        this._axisLineWidth
                    );
                    y = zrEvent.getY(this._event);
                    rect = [
                        x, this.component.grid.getY(), 
                        x, this.component.grid.getYend()
                    ];
                }
                else {
                    x = zrEvent.getX(this._event);
                    y = this.subPixelOptimize(
                        categoryAxis.getCoordByIndex(dataIndex),
                        this._axisLineWidth
                    );
                    rect = [
                        this.component.grid.getX(), y, 
                        this.component.grid.getXend(), y
                    ];
K
kener 已提交
594
                }
K
kener 已提交
595
                this._styleAxisPointer(
596
                    seriesArray,
K
kener 已提交
597
                    rect[0], rect[1], rect[2], rect[3],
K
kener 已提交
598
                    categoryAxis.getGap(), x, y
599
                );
K
kener 已提交
600 601 602 603 604 605 606 607 608 609 610 611
            }
            else {
                // 双数值轴
                x = zrEvent.getX(this._event);
                y = zrEvent.getY(this._event);
                this._styleAxisPointer(
                    series,
                    this.component.grid.getX(), y, 
                    this.component.grid.getXend(), y,
                    0, x, y
                );
                if (dataIndex >= 0) {
K
kener 已提交
612
                    this._showItemTrigger(true);
K
kener 已提交
613 614 615 616 617
                }
                else {
                    clearTimeout(this._hidingTicket);
                    clearTimeout(this._showingTicket);
                    this._tDom.style.display = 'none';
K
jshint  
kener 已提交
618
                }
K
kener 已提交
619 620 621 622
            }

            if (seriesArray.length > 0) {
                var data;
K
kener 已提交
623
                var value;
624
                if (typeof formatter === 'function') {
K
kener 已提交
625 626
                    var params = [];
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
627
                        data = seriesArray[i].data[dataIndex];
K
kener 已提交
628 629 630 631
                        value = data != null
                                ? (data.value != null ? data.value : data)
                                : '-';
                        
K
kener 已提交
632
                        params.push([
K
kener 已提交
633
                            seriesArray[i].name || '',
K
kener 已提交
634
                            categoryAxis.getNameByIndex(dataIndex),
K
kener 已提交
635
                            value,
K
kener 已提交
636 637 638
                            data
                        ]);
                    }
K
kener 已提交
639
                    this._curTicket = 'axis:' + dataIndex;
640 641
                    this._tDom.innerHTML = formatter.call(
                        this.myChart, params, this._curTicket, this._setContent
K
kener 已提交
642 643
                    );
                }
644
                else if (typeof formatter === 'string') {
K
kener 已提交
645
                    this._curTicket = NaN;
K
kener 已提交
646 647 648 649 650 651
                    formatter = formatter.replace('{a}','{a0}')
                                         .replace('{b}','{b0}')
                                         .replace('{c}','{c0}');
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
                        formatter = formatter.replace(
                            '{a' + i + '}',
K
kener 已提交
652
                            this._encodeHTML(seriesArray[i].name || '')
K
kener 已提交
653 654 655
                        );
                        formatter = formatter.replace(
                            '{b' + i + '}',
K
kener 已提交
656
                            this._encodeHTML(categoryAxis.getNameByIndex(dataIndex))
K
kener 已提交
657
                        );
K
kener 已提交
658
                        data = seriesArray[i].data[dataIndex];
659 660
                        data = data != null
                               ? (data.value != null
K
kener 已提交
661 662 663
                                   ? data.value
                                   : data)
                               : '-';
K
kener 已提交
664 665
                        formatter = formatter.replace(
                            '{c' + i + '}',
666
                            data instanceof Array 
K
kener 已提交
667
                            ? data : this.numAddCommas(data)
K
kener 已提交
668 669
                        );
                    }
K
kener 已提交
670
                    this._tDom.innerHTML = formatter;
K
kener 已提交
671 672
                }
                else {
K
kener 已提交
673 674
                    this._curTicket = NaN;
                    formatter = this._encodeHTML(
K
kener 已提交
675 676 677
                        categoryAxis.getNameByIndex(dataIndex)
                    );

K
kener 已提交
678
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
679
                        formatter += '<br/>' 
K
kener 已提交
680
                                     + this._encodeHTML(seriesArray[i].name || '')
K
kener 已提交
681
                                     + ' : ';
K
kener 已提交
682
                        data = seriesArray[i].data[dataIndex];
683 684
                        data = data != null
                               ? (data.value != null
K
kener 已提交
685 686 687
                                   ? data.value
                                   : data)
                               : '-';
688
                        formatter += data instanceof Array 
K
kener 已提交
689
                                     ? data : this.numAddCommas(data);
K
kener 已提交
690
                    }
K
kener 已提交
691
                    this._tDom.innerHTML = formatter;
K
kener 已提交
692 693
                }

K
kener 已提交
694 695
                // don't modify, just false, showContent == undefined == true
                if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
696 697 698 699
                    // 只用tooltip的行为,不显示主体
                    return;
                }
                
K
kener 已提交
700 701 702 703 704
                if (!this.hasAppend) {
                    this._tDom.style.left = this._zrWidth / 2 + 'px';
                    this._tDom.style.top = this._zrHeight / 2 + 'px';
                    this.dom.firstChild.appendChild(this._tDom);
                    this.hasAppend = true;
K
kener 已提交
705
                }
K
kener 已提交
706
                this._show(position, x + 10, y + 10, specialCssText);
K
kener 已提交
707
            }
K
kener 已提交
708
        },
709
        
K
kener 已提交
710 711 712
        /**
         * 极坐标 
         */
713 714 715 716
        _showPolarTrigger: function (polarIndex, dataIndex) {
            if (this.component.polar == null
                || polarIndex == null
                || dataIndex == null
K
kener 已提交
717 718 719 720
                || dataIndex < 0
            ) {
                return false;
            }
K
kener 已提交
721
            var series = this.option.series;
K
kener 已提交
722 723 724
            var seriesArray = [];

            var formatter;
K
kener 已提交
725
            var position;
K
kener 已提交
726
            var showContent;
K
kener 已提交
727
            var specialCssText = '';
728 729
            if (this.option.tooltip.trigger === 'axis') {
                if (!this.option.tooltip.show) {
K
kener 已提交
730 731
                    return false;
                }
K
kener 已提交
732
                formatter = this.option.tooltip.formatter;
K
kener 已提交
733
                position = this.option.tooltip.position;
K
kener 已提交
734
            }
K
kener 已提交
735
            var indicatorName = this.option.polar[polarIndex].indicator[dataIndex].text;
K
kener 已提交
736 737 738

            // 找到所有用这个极坐标并且axis触发的系列数据
            for (var i = 0, l = series.length; i < l; i++) {
K
kener 已提交
739
                if (!this._isSelected(series[i].name)) {
K
kener 已提交
740 741
                    continue;
                }
742 743
                if (series[i].polarIndex === polarIndex
                    && this.deepQuery([series[i], this.option], 'tooltip.trigger') === 'axis'
K
kener 已提交
744
                ) {
K
kener 已提交
745 746 747 748 749 750 751
                    showContent = this.query(series[i], 'tooltip.showContent') 
                                  || showContent;
                    formatter = this.query(series[i], 'tooltip.formatter') 
                                || formatter;
                    position = this.query(series[i], 'tooltip.position') 
                               || position;
                    specialCssText += this._style(this.query(series[i], 'tooltip'));
K
kener 已提交
752 753 754 755 756 757 758 759 760 761 762 763
                    seriesArray.push(series[i]);
                }
            }
            if (seriesArray.length > 0) {
                var polarData;
                var data;
                var params = [];

                for (var i = 0, l = seriesArray.length; i < l; i++) {
                    polarData = seriesArray[i].data;
                    for (var j = 0, k = polarData.length; j < k; j++) {
                        data = polarData[j];
K
kener 已提交
764
                        if (!this._isSelected(data.name)) {
K
kener 已提交
765 766
                            continue;
                        }
767
                        data = data != null
K
kener 已提交
768 769 770 771
                               ? data
                               : {name:'', value: {dataIndex:'-'}};
                               
                        params.push([
K
kener 已提交
772
                            seriesArray[i].name || '',
K
kener 已提交
773
                            data.name,
774
                            data.value[dataIndex].value != null
775
                                ? data.value[dataIndex].value : data.value[dataIndex],
K
kener 已提交
776 777 778 779
                            indicatorName
                        ]);
                    }
                }
K
kener 已提交
780 781 782
                if (params.length <= 0) {
                    return;
                }
783
                if (typeof formatter === 'function') {
K
kener 已提交
784
                    this._curTicket = 'axis:' + dataIndex;
785 786
                    this._tDom.innerHTML = formatter.call(
                        this.myChart, params, this._curTicket, this._setContent
K
kener 已提交
787 788
                    );
                }
789
                else if (typeof formatter === 'string') {
K
kener 已提交
790 791 792 793 794 795 796
                    formatter = formatter.replace('{a}','{a0}')
                                         .replace('{b}','{b0}')
                                         .replace('{c}','{c0}')
                                         .replace('{d}','{d0}');
                    for (var i = 0, l = params.length; i < l; i++) {
                        formatter = formatter.replace(
                            '{a' + i + '}',
K
kener 已提交
797
                            this._encodeHTML(params[i][0])
K
kener 已提交
798 799 800
                        );
                        formatter = formatter.replace(
                            '{b' + i + '}',
K
kener 已提交
801
                            this._encodeHTML(params[i][1])
K
kener 已提交
802 803 804
                        );
                        formatter = formatter.replace(
                            '{c' + i + '}',
K
kener 已提交
805
                            this.numAddCommas(params[i][2])
K
kener 已提交
806 807 808
                        );
                        formatter = formatter.replace(
                            '{d' + i + '}',
K
kener 已提交
809
                            this._encodeHTML(params[i][3])
K
kener 已提交
810 811
                        );
                    }
K
kener 已提交
812
                    this._tDom.innerHTML = formatter;
K
kener 已提交
813 814
                }
                else {
K
kener 已提交
815 816 817
                    formatter = this._encodeHTML(params[0][1]) + '<br/>' 
                                + this._encodeHTML(params[0][3]) + ' : ' 
                                + this.numAddCommas(params[0][2]);
K
kener 已提交
818
                    for (var i = 1, l = params.length; i < l; i++) {
K
kener 已提交
819
                        formatter += '<br/>' + this._encodeHTML(params[i][1]) 
K
kener 已提交
820
                                     + '<br/>';
K
kener 已提交
821 822
                        formatter += this._encodeHTML(params[i][3]) + ' : ' 
                                     + this.numAddCommas(params[i][2]);
K
kener 已提交
823
                    }
K
kener 已提交
824
                    this._tDom.innerHTML = formatter;
K
kener 已提交
825 826
                }

K
kener 已提交
827 828
                // don't modify, just false, showContent == undefined == true
                if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
829 830 831 832
                    // 只用tooltip的行为,不显示主体
                    return;
                }
                
K
kener 已提交
833 834 835 836 837
                if (!this.hasAppend) {
                    this._tDom.style.left = this._zrWidth / 2 + 'px';
                    this._tDom.style.top = this._zrHeight / 2 + 'px';
                    this.dom.firstChild.appendChild(this._tDom);
                    this.hasAppend = true;
K
kener 已提交
838
                }
K
kener 已提交
839
                this._show(
K
kener 已提交
840
                    position,
K
kener 已提交
841 842
                    zrEvent.getX(this._event), 
                    zrEvent.getY(this._event), 
K
kener 已提交
843 844 845 846
                    specialCssText
                );
                return true;
            }
K
kener 已提交
847
        },
K
kener 已提交
848
        
K
kener 已提交
849 850 851 852
        /**
         * @parma {boolean} axisTrigger 
         */
        _showItemTrigger: function (axisTrigger) {
K
kener 已提交
853 854 855
            if (!this._curTarget) {
                return;
            }
K
kener 已提交
856 857 858 859 860 861
            var serie = ecData.get(this._curTarget, 'series');
            var data = ecData.get(this._curTarget, 'data');
            var name = ecData.get(this._curTarget, 'name');
            var value = ecData.get(this._curTarget, 'value');
            var special = ecData.get(this._curTarget, 'special');
            var special2 = ecData.get(this._curTarget, 'special2');
K
kener 已提交
862 863
            // 从低优先级往上找到trigger为item的formatter和样式
            var formatter;
K
kener 已提交
864
            var position;
K
kener 已提交
865
            var showContent;
K
kener 已提交
866
            var specialCssText = '';
K
kener 已提交
867 868
            var indicator;
            var html = '';
K
kener 已提交
869
            if (this._curTarget._type != 'island') {
K
kener 已提交
870
                // 全局
K
kener 已提交
871 872
                var trigger = axisTrigger ? 'axis' : 'item'
                if (this.option.tooltip.trigger === trigger) {
K
kener 已提交
873
                    formatter = this.option.tooltip.formatter;
K
kener 已提交
874
                    position = this.option.tooltip.position;
K
kener 已提交
875 876
                }
                // 系列
K
kener 已提交
877 878 879 880
                if (this.query(serie, 'tooltip.trigger') === trigger) {
                    showContent = this.query(serie, 'tooltip.showContent') || showContent;
                    formatter = this.query(serie, 'tooltip.formatter') || formatter;
                    position = this.query(serie, 'tooltip.position') || position;
K
kener 已提交
881
                    specialCssText += this._style(this.query(serie, 'tooltip'));
K
kener 已提交
882 883
                }
                // 数据项
K
kener 已提交
884 885 886
                showContent = this.query(data, 'tooltip.showContent') || showContent;
                formatter = this.query(data, 'tooltip.formatter') || formatter;
                position = this.query(data, 'tooltip.position') || position;
K
kener 已提交
887
                specialCssText += this._style(this.query(data, 'tooltip'));
K
格式  
kener 已提交
888 889
            }
            else {
K
kener 已提交
890 891 892
                showContent = this.deepQuery([data, serie, this.option], 'tooltip.showContent');
                formatter = this.deepQuery([data, serie, this.option], 'tooltip.islandFormatter');
                position = this.deepQuery([data, serie, this.option], 'tooltip.islandPosition');
K
kener 已提交
893 894
            }

895
            if (typeof formatter === 'function') {
K
kener 已提交
896
                this._curTicket = (serie.name || '')
K
kener 已提交
897 898
                                  + ':'
                                  + ecData.get(this._curTarget, 'dataIndex');
899 900
                this._tDom.innerHTML = formatter.call(
                    this.myChart,
K
kener 已提交
901
                    [
K
kener 已提交
902
                        serie.name || '',
K
kener 已提交
903 904
                        name,
                        value,
L
lang 已提交
905
                        special,
K
kener 已提交
906 907
                        special2,
                        data
K
kener 已提交
908
                    ],
K
kener 已提交
909 910
                    this._curTicket,
                    this._setContent
K
kener 已提交
911 912
                );
            }
913
            else if (typeof formatter === 'string') {
K
kener 已提交
914
                this._curTicket = NaN;
K
kener 已提交
915 916 917
                formatter = formatter.replace('{a}', '{a0}')
                                     .replace('{b}', '{b0}')
                                     .replace('{c}', '{c0}');
K
kener 已提交
918
                formatter = formatter.replace('{a0}', this._encodeHTML(serie.name || ''))
K
kener 已提交
919
                                     .replace('{b0}', this._encodeHTML(name))
920
                                     .replace(
K
kener 已提交
921
                                         '{c0}',
K
kener 已提交
922
                                         value instanceof Array ? value : this.numAddCommas(value)
923
                                     );
K
kener 已提交
924

K
kener 已提交
925
                formatter = formatter.replace('{d}', '{d0}')
K
kener 已提交
926
                                     .replace('{d0}', special || '');
K
kener 已提交
927 928 929 930 931
                formatter = formatter.replace('{e}', '{e0}')
                                     .replace(
                                         '{e0}',
                                         ecData.get(this._curTarget, 'special2') || ''
                                     );
K
kener 已提交
932

K
kener 已提交
933
                this._tDom.innerHTML = formatter;
K
kener 已提交
934 935
            }
            else {
K
kener 已提交
936
                this._curTicket = NaN;
K
kener 已提交
937
                if (serie.type === ecConfig.CHART_TYPE_RADAR && special) {
K
kener 已提交
938
                    indicator = special;
K
kener 已提交
939
                    html += this._encodeHTML(name === '' ? (serie.name || '') : name);
K
kener 已提交
940
                    html += html === '' ? '' : '<br />';
K
kener 已提交
941
                    for (var i = 0 ; i < indicator.length; i ++) {
K
kener 已提交
942 943
                        html += this._encodeHTML(indicator[i].text) + ' : ' 
                                + this.numAddCommas(value[i]) + '<br />';
K
kener 已提交
944
                    }
K
kener 已提交
945
                    this._tDom.innerHTML = html;
K
kener 已提交
946
                }
947 948
                else if (serie.type === ecConfig.CHART_TYPE_CHORD) {
                    if (special2 == null) {
K
kener 已提交
949
                        // 外环上
K
kener 已提交
950 951
                        this._tDom.innerHTML = ''
                            + this._encodeHTML(name) + ' (' + this.numAddCommas(value) + ')';
K
kener 已提交
952 953
                    }
                    else {
K
kener 已提交
954 955
                        var name1 = this._encodeHTML(name);
                        var name2 = this._encodeHTML(special);
K
kener 已提交
956
                        // 内部弦上
957 958 959 960 961 962 963
                        this._tDom.innerHTML = ''
                            + (serie.name != null ? (this._encodeHTML(serie.name) + '<br/>') : '')
                            + name1 + ' -> ' + name2 
                            + ' (' + this.numAddCommas(value) + ')'
                            + '<br />'
                            + name2 + ' -> ' + name1
                            + ' (' + this.numAddCommas(special2) + ')';
K
kener 已提交
964 965
                    }
                }
K
kener 已提交
966
                else {
967 968
                    this._tDom.innerHTML = ''
                        + (serie.name != null ? (this._encodeHTML(serie.name) + '<br/>') : '')
K
kener 已提交
969 970 971
                        + (name === '' ? '' : (this._encodeHTML(name) + ' : '))
                        + (value instanceof Array ? value : this.numAddCommas(value))
                        + (special == null ? '' : (' (' + special + ')'));
K
kener 已提交
972
                }
K
kener 已提交
973 974
            }

K
kener 已提交
975
            if (!this._axisLineShape.invisible || !this._axisShadowShape.invisible) {
K
kener 已提交
976
                this._axisLineShape.invisible = true;
K
kener 已提交
977
                this.zr.modShape(this._axisLineShape.id);
K
kener 已提交
978 979
                this._axisShadowShape.invisible = true;
                this.zr.modShape(this._axisShadowShape.id);
K
kener 已提交
980
                this.zr.refresh();
K
kener 已提交
981 982
            }
            
K
kener 已提交
983 984
            // don't modify, just false, showContent == undefined == true
            if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
985 986 987 988
                // 只用tooltip的行为,不显示主体
                return;
            }
            
K
kener 已提交
989 990 991 992 993
            if (!this.hasAppend) {
                this._tDom.style.left = this._zrWidth / 2 + 'px';
                this._tDom.style.top = this._zrHeight / 2 + 'px';
                this.dom.firstChild.appendChild(this._tDom);
                this.hasAppend = true;
K
kener 已提交
994
            }
K
kener 已提交
995
            
K
kener 已提交
996
            this._show(
K
kener 已提交
997
                position,
K
kener 已提交
998 999
                zrEvent.getX(this._event) + 20,
                zrEvent.getY(this._event) - 20,
K
kener 已提交
1000 1001
                specialCssText
            );
K
kener 已提交
1002
        },
K
kener 已提交
1003

1004 1005 1006
        /**
         * 设置坐标轴指示器样式 
         */
1007
        _styleAxisPointer: function (seriesArray, xStart, yStart, xEnd, yEnd, gap, x, y) {
1008 1009 1010
            if (seriesArray.length > 0) {
                var queryTarget;
                var curType;
K
kener 已提交
1011
                var axisPointer = this.option.tooltip.axisPointer;
1012
                var pointType = axisPointer.type;
K
kener 已提交
1013
                var style = {
K
kener 已提交
1014 1015 1016
                    line: {},
                    cross: {},
                    shadow: {}
K
kener 已提交
1017 1018 1019 1020 1021 1022
                };
                for (var pType in style) {
                    style[pType].color = axisPointer[pType + 'Style'].color;
                    style[pType].width = axisPointer[pType + 'Style'].width;
                    style[pType].type = axisPointer[pType + 'Style'].type;
                }
1023
                for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
1024 1025
                    if (this.deepQuery(
                           [seriesArray[i], this.option], 'tooltip.trigger'
1026
                       ) === 'axis'
1027
                    ) {
1028
                        queryTarget = seriesArray[i];
K
kener 已提交
1029
                        curType = this.query(queryTarget, 'tooltip.axisPointer.type');
1030
                        pointType = curType || pointType; 
K
kener 已提交
1031 1032
                        if (curType) {
                            style[curType].color = this.query(
1033
                                queryTarget,
K
kener 已提交
1034 1035 1036
                                'tooltip.axisPointer.' + curType + 'Style.color'
                            ) || style[curType].color;
                            style[curType].width = this.query(
1037
                                queryTarget,
K
kener 已提交
1038 1039 1040
                                'tooltip.axisPointer.' + curType + 'Style.width'
                            ) || style[curType].width;
                            style[curType].type = this.query(
1041
                                queryTarget,
K
kener 已提交
1042 1043
                                'tooltip.axisPointer.' + curType + 'Style.type'
                            ) || style[curType].type;
1044 1045 1046 1047
                        }
                    }
                }
                
1048
                if (pointType === 'line') {
K
kener 已提交
1049
                    this._axisLineShape.style = {
1050 1051 1052 1053 1054 1055 1056
                        xStart: xStart,
                        yStart: yStart,
                        xEnd: xEnd,
                        yEnd: yEnd,
                        strokeColor: style.line.color,
                        lineWidth: style.line.width,
                        lineType: style.line.type
1057
                    };
K
kener 已提交
1058
                    this._axisLineShape.invisible = false;
K
kener 已提交
1059
                    this.zr.modShape(this._axisLineShape.id);
1060
                }
1061
                else if (pointType === 'cross') {
K
kener 已提交
1062 1063
                    this._axisCrossShape.style = {
                        brushType: 'stroke',
1064 1065 1066 1067
                        rect: this.component.grid.getArea(),
                        x: x,
                        y: y,
                        text: ('( ' 
K
kener 已提交
1068 1069 1070 1071
                               + this.component.xAxis.getAxis(0).getValueFromCoord(x)
                               + ' , '
                               + this.component.yAxis.getAxis(0).getValueFromCoord(y) 
                               + ' )'
1072 1073 1074 1075 1076
                              ).replace('  , ', ' ').replace(' ,  ', ' '),
                        textPosition: 'specific',
                        strokeColor: style.cross.color,
                        lineWidth: style.cross.width,
                        lineType: style.cross.type
K
kener 已提交
1077 1078 1079 1080
                    };
                    if (this.component.grid.getXend() - x > 100) {          // 右侧有空间
                        this._axisCrossShape.style.textAlign = 'left';
                        this._axisCrossShape.style.textX = x + 10;
1081 1082
                    }
                    else {
K
kener 已提交
1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096
                        this._axisCrossShape.style.textAlign = 'right';
                        this._axisCrossShape.style.textX = x - 10;
                    }
                    if (y - this.component.grid.getY() > 50) {             // 上方有空间
                        this._axisCrossShape.style.textBaseline = 'bottom';
                        this._axisCrossShape.style.textY = y - 10;
                    }
                    else {
                        this._axisCrossShape.style.textBaseline = 'top';
                        this._axisCrossShape.style.textY = y + 10;
                    }
                    this._axisCrossShape.invisible = false;
                    this.zr.modShape(this._axisCrossShape.id);
                }
1097 1098 1099
                else if (pointType === 'shadow') {
                    if (style.shadow.width == null 
                        || style.shadow.width === 'auto'
K
kener 已提交
1100 1101 1102
                        || isNaN(style.shadow.width)
                    ) {
                        style.shadow.width = gap;
1103
                    }
1104
                    if (xStart === xEnd) {
1105
                        // 纵向
K
kener 已提交
1106
                        if (Math.abs(this.component.grid.getX() - xStart) < 2) {
1107
                            // 最左边
K
kener 已提交
1108 1109
                            style.shadow.width /= 2;
                            xStart = xEnd = xEnd + style.shadow.width / 2;
1110
                        }
K
kener 已提交
1111
                        else if (Math.abs(this.component.grid.getXend() - xStart) < 2) {
1112
                            // 最右边
K
kener 已提交
1113 1114
                            style.shadow.width /= 2;
                            xStart = xEnd = xEnd - style.shadow.width / 2;
1115 1116
                        }
                    }
1117
                    else if (yStart === yEnd) {
1118
                        // 横向
K
kener 已提交
1119
                        if (Math.abs(this.component.grid.getY() - yStart) < 2) {
1120
                            // 最上边
K
kener 已提交
1121 1122
                            style.shadow.width /= 2;
                            yStart = yEnd = yEnd + style.shadow.width / 2;
1123
                        }
K
kener 已提交
1124
                        else if (Math.abs(this.component.grid.getYend() - yStart) < 2) {
1125
                            // 最右边
K
kener 已提交
1126 1127
                            style.shadow.width /= 2;
                            yStart = yEnd = yEnd - style.shadow.width / 2;
1128 1129
                        }
                    }
K
kener 已提交
1130
                    this._axisShadowShape.style = {
1131 1132 1133 1134 1135 1136
                        xStart: xStart,
                        yStart: yStart,
                        xEnd: xEnd,
                        yEnd: yEnd,
                        strokeColor: style.shadow.color,
                        lineWidth: style.shadow.width
1137
                    };
K
kener 已提交
1138
                    this._axisShadowShape.invisible = false;
K
kener 已提交
1139
                    this.zr.modShape(this._axisShadowShape.id);
1140
                }
K
kener 已提交
1141
                this.zr.refresh();
1142
            }
K
kener 已提交
1143
        },
1144

1145
        __onmousemove: function (param) {
K
kener 已提交
1146 1147
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
K
kener 已提交
1148
            var target = param.target;
K
kener 已提交
1149 1150 1151
            var mx = zrEvent.getX(param.event);
            var my = zrEvent.getY(param.event);
            if (!target) {
K
kener 已提交
1152
                // 判断是否落到直角系里,axis触发的tooltip
K
kener 已提交
1153 1154
                this._curTarget = false;
                this._event = param.event;
K
kener 已提交
1155
                // this._event._target = this._event.target || this._event.toElement;
K
kener 已提交
1156 1157 1158
                this._event.zrenderX = mx;
                this._event.zrenderY = my;
                if (this._needAxisTrigger 
K
kener 已提交
1159
                    && this.component.grid 
K
kener 已提交
1160
                    && zrArea.isInside(rectangleInstance, this.component.grid.getArea(), mx, my)
K
kener 已提交
1161
                ) {
K
kener 已提交
1162
                    this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1163
                }
K
kener 已提交
1164
                else if (this._needAxisTrigger 
K
kener 已提交
1165 1166
                        && this.component.polar 
                        && this.component.polar.isInside([mx, my]) != -1
K
kener 已提交
1167
                ) {
K
kener 已提交
1168
                    this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1169 1170
                }
                else {
K
kener 已提交
1171
                    !this._event.connectTrigger && this.messageCenter.dispatch(
K
kener 已提交
1172
                        ecConfig.EVENT.TOOLTIP_OUT_GRID,
K
kener 已提交
1173 1174 1175
                        this._event,
                        null,
                        this.myChart
K
kener 已提交
1176
                    );
K
kener 已提交
1177
                    this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
1178 1179 1180
                }
            }
            else {
K
kener 已提交
1181 1182
                this._curTarget = target;
                this._event = param.event;
K
kener 已提交
1183
                // this._event._target = this._event.target || this._event.toElement;
K
kener 已提交
1184 1185
                this._event.zrenderX = mx;
                this._event.zrenderY = my;
K
kener 已提交
1186
                var polarIndex;
K
kener 已提交
1187
                if (this._needAxisTrigger 
K
kener 已提交
1188 1189
                    && this.component.polar 
                    && (polarIndex = this.component.polar.isInside([mx, my])) != -1
K
kener 已提交
1190 1191
                ) {
                    // 看用这个polar的系列数据是否是axis触发,如果是设置_curTarget为nul
K
kener 已提交
1192
                    var series = this.option.series;
K
kener 已提交
1193
                    for (var i = 0, l = series.length; i < l; i++) {
1194
                        if (series[i].polarIndex === polarIndex
K
kener 已提交
1195 1196
                            && this.deepQuery(
                                   [series[i], this.option], 'tooltip.trigger'
1197
                               ) === 'axis'
K
kener 已提交
1198
                        ) {
K
kener 已提交
1199
                            this._curTarget = null;
K
kener 已提交
1200 1201 1202 1203 1204
                            break;
                        }
                    }
                   
                }
K
kener 已提交
1205
                this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1206
            }
K
kener 已提交
1207
        },
K
kener 已提交
1208

1209 1210 1211
        /**
         * zrender事件响应:鼠标离开绘图区域
         */
1212
        __onglobalout: function () {
K
kener 已提交
1213 1214 1215 1216 1217
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
            this._hidingTicket = setTimeout(this._hide, this._hideDelay);
        },
        
K
kener 已提交
1218 1219 1220
        /**
         * 异步回调填充内容
         */
1221
        __setContent: function (ticket, content) {
K
kener 已提交
1222
            if (!this._tDom) {
K
kener 已提交
1223 1224
                return;
            }
1225
            if (ticket === this._curTicket) {
K
kener 已提交
1226
                this._tDom.innerHTML = content;
K
kener 已提交
1227
            }
K
kener 已提交
1228
            
K
kener 已提交
1229 1230
            setTimeout(this._refixed, 20);
        },
K
kener 已提交
1231

1232
        ontooltipHover: function (param, tipShape) {
K
kener 已提交
1233 1234
            if (!this._lastTipShape // 不存在或者存在但dataIndex发生变化才需要重绘
                || (this._lastTipShape && this._lastTipShape.dataIndex != param.dataIndex)
K
kener 已提交
1235
            ) {
K
kener 已提交
1236 1237
                if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                    this.zr.delShape(this._lastTipShape.tipShape);
K
kener 已提交
1238
                    this.shapeList.length = 2;
K
kener 已提交
1239 1240
                }
                for (var i = 0, l = tipShape.length; i < l; i++) {
K
kener 已提交
1241
                    tipShape[i].zlevel = this._zlevelBase;
K
kener 已提交
1242
                    tipShape[i].style = zrShapeBase.prototype.getHighlightStyle(
K
kener 已提交
1243 1244 1245 1246 1247 1248 1249 1250 1251
                        tipShape[i].style,
                        tipShape[i].highlightStyle
                    );
                    tipShape[i].draggable = false;
                    tipShape[i].hoverable = false;
                    tipShape[i].clickable = false;
                    tipShape[i].ondragend = null;
                    tipShape[i].ondragover = null;
                    tipShape[i].ondrop = null;
K
kener 已提交
1252
                    this.shapeList.push(tipShape[i]);
K
kener 已提交
1253
                    this.zr.addShape(tipShape[i]);
K
kener 已提交
1254
                }
K
kener 已提交
1255
                this._lastTipShape = {
1256 1257
                    dataIndex: param.dataIndex,
                    tipShape: tipShape
K
kener 已提交
1258 1259
                };
            }
K
kener 已提交
1260
        },
K
kener 已提交
1261
        
1262
        ondragend: function () {
K
kener 已提交
1263 1264
            this._hide();
        },
K
kener 已提交
1265 1266 1267 1268
        
        /**
         * 图例选择
         */
1269
        onlegendSelected: function (param) {
K
kener 已提交
1270 1271
            this._selectedMap = param.selected;
        },
K
kener 已提交
1272
        
1273
        _setSelectedMap: function () {
1274 1275
            if (this.component.legend) {
                this._selectedMap = zrUtil.clone(this.component.legend.getSelectedMap());
K
kener 已提交
1276 1277
            }
            else {
K
kener 已提交
1278
                this._selectedMap = {};
K
kener 已提交
1279
            }
K
kener 已提交
1280
        },
K
kener 已提交
1281
        
1282 1283
        _isSelected: function (itemName) {
            if (this._selectedMap[itemName] != null) {
K
kener 已提交
1284
                return this._selectedMap[itemName];
K
kener 已提交
1285 1286 1287 1288
            }
            else {
                return true; // 没在legend里定义的都为true啊~
            }
K
kener 已提交
1289
        },
K
kener 已提交
1290

K
kener 已提交
1291 1292 1293 1294 1295 1296
        /**
         * 模拟tooltip hover方法
         * {object} params  参数
         *          {seriesIndex: 0, seriesName:'', dataInex:0} line、bar、scatter、k、radar
         *          {seriesIndex: 0, seriesName:'', name:''} map、pie、chord
         */
1297
        showTip: function (params) {
K
kener 已提交
1298 1299 1300 1301 1302
            if (!params) {
                return;
            }
            
            var seriesIndex;
K
kener 已提交
1303
            var series = this.option.series;
1304
            if (params.seriesIndex != null) {
K
kener 已提交
1305 1306 1307 1308 1309
                seriesIndex = params.seriesIndex;
            }
            else {
                var seriesName = params.seriesName;
                for (var i = 0, l = series.length; i < l; i++) {
1310
                    if (series[i].name === seriesName) {
K
kener 已提交
1311 1312 1313 1314 1315 1316 1317
                        seriesIndex = i;
                        break;
                    }
                }
            }
            
            var serie = series[seriesIndex];
1318
            if (serie == null) {
K
kener 已提交
1319 1320
                return;
            }
K
kener 已提交
1321
            var chart = this.myChart.chart[serie.type];
K
kener 已提交
1322 1323
            var isAxisTrigger = this.deepQuery(
                                    [serie, this.option], 'tooltip.trigger'
1324
                                ) === 'axis';
K
kener 已提交
1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336
            
            if (!chart) {
                return;
            }
            
            if (isAxisTrigger) {
                // axis trigger
                var dataIndex = params.dataIndex;
                switch (chart.type) {
                    case ecConfig.CHART_TYPE_LINE :
                    case ecConfig.CHART_TYPE_BAR :
                    case ecConfig.CHART_TYPE_K :
1337 1338
                        if (this.component.xAxis == null 
                            || this.component.yAxis == null
K
kener 已提交
1339 1340 1341 1342 1343 1344
                            || serie.data.length <= dataIndex
                        ) {
                            return;
                        }
                        var xAxisIndex = serie.xAxisIndex || 0;
                        var yAxisIndex = serie.yAxisIndex || 0;
K
kener 已提交
1345
                        if (this.component.xAxis.getAxis(xAxisIndex).type 
1346
                            === ecConfig.COMPONENT_TYPE_AXIS_CATEGORY
K
kener 已提交
1347 1348
                        ) {
                            // 横轴是类目
K
kener 已提交
1349
                            this._event = {
1350 1351 1352 1353 1354 1355
                                zrenderX: this.component.xAxis.getAxis(xAxisIndex)
                                          .getCoordByIndex(dataIndex),
                                zrenderY: this.component.grid.getY() 
                                          + (this.component.grid.getYend() 
                                             - this.component.grid.getY()
                                            ) / 4
K
kener 已提交
1356 1357 1358 1359
                            };
                        }
                        else {
                            // 纵轴是类目
K
kener 已提交
1360
                            this._event = {
1361 1362
                                zrenderX: this.component.grid.getX() 
                                          + (this.component.grid.getXend() 
K
kener 已提交
1363
                                              - this.component.grid.getX()
1364 1365
                                            ) / 4,
                                zrenderY: this.component.yAxis.getAxis(yAxisIndex)
K
kener 已提交
1366
                                           .getCoordByIndex(dataIndex)
K
kener 已提交
1367 1368
                            };
                        }
K
kener 已提交
1369
                        this._showAxisTrigger(
K
kener 已提交
1370 1371 1372 1373 1374 1375
                            xAxisIndex, 
                            yAxisIndex,
                            dataIndex
                        );
                        break;
                    case ecConfig.CHART_TYPE_RADAR :
1376
                        if (this.component.polar == null 
K
kener 已提交
1377 1378 1379 1380 1381
                            || serie.data[0].value.length <= dataIndex
                        ) {
                            return;
                        }
                        var polarIndex = serie.polarIndex || 0;
K
kener 已提交
1382 1383 1384
                        var vector = this.component.polar.getVector(
                            polarIndex, dataIndex, 'max'
                        );
K
kener 已提交
1385
                        this._event = {
1386 1387
                            zrenderX: vector[0],
                            zrenderY: vector[1]
K
kener 已提交
1388
                        };
K
kener 已提交
1389
                        this._showPolarTrigger(
K
kener 已提交
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407
                            polarIndex, 
                            dataIndex
                        );
                        break;
                }
            }
            else {
                // item trigger
                var shapeList = chart.shapeList;
                var x;
                var y;
                switch (chart.type) {
                    case ecConfig.CHART_TYPE_LINE :
                    case ecConfig.CHART_TYPE_BAR :
                    case ecConfig.CHART_TYPE_K :
                    case ecConfig.CHART_TYPE_SCATTER :
                        var dataIndex = params.dataIndex;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
K
kener 已提交
1408 1409
                            if (ecData.get(shapeList[i], 'seriesIndex') == seriesIndex
                                && ecData.get(shapeList[i], 'dataIndex') == dataIndex
K
kener 已提交
1410
                            ) {
K
kener 已提交
1411
                                this._curTarget = shapeList[i];
K
kener 已提交
1412 1413 1414 1415 1416 1417 1418 1419 1420 1421
                                x = shapeList[i].style.x;
                                y = chart.type != ecConfig.CHART_TYPE_K 
                                    ? shapeList[i].style.y : shapeList[i].style.y[0];
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_RADAR :
                        var dataIndex = params.dataIndex;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
1422
                            if (shapeList[i].type === 'polygon'
K
kener 已提交
1423 1424
                                && ecData.get(shapeList[i], 'seriesIndex') == seriesIndex
                                && ecData.get(shapeList[i], 'dataIndex') == dataIndex
K
kener 已提交
1425
                            ) {
K
kener 已提交
1426
                                this._curTarget = shapeList[i];
K
kener 已提交
1427 1428 1429
                                var vector = this.component.polar.getCenter(
                                    serie.polarIndex || 0
                                );
K
kener 已提交
1430 1431 1432 1433 1434 1435 1436 1437 1438
                                x = vector[0];
                                y = vector[1];
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_PIE :
                        var name = params.name;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
1439
                            if (shapeList[i].type === 'sector'
K
kener 已提交
1440 1441
                                && ecData.get(shapeList[i], 'seriesIndex') == seriesIndex
                                && ecData.get(shapeList[i], 'name') == name
K
kener 已提交
1442
                            ) {
K
kener 已提交
1443 1444
                                this._curTarget = shapeList[i];
                                var style = this._curTarget.style;
K
kener 已提交
1445 1446
                                var midAngle = (style.startAngle + style.endAngle) 
                                                / 2 * Math.PI / 180;
K
kener 已提交
1447 1448
                                x = this._curTarget.style.x + Math.cos(midAngle) * style.r / 1.5;
                                y = this._curTarget.style.y - Math.sin(midAngle) * style.r / 1.5;
K
kener 已提交
1449 1450 1451 1452 1453 1454 1455 1456
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_MAP :
                        var name = params.name;
                        var mapType = serie.mapType;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
1457 1458 1459
                            if (shapeList[i].type === 'text'
                                && shapeList[i]._mapType === mapType
                                && shapeList[i].style._name === name
K
kener 已提交
1460
                            ) {
K
kener 已提交
1461 1462 1463
                                this._curTarget = shapeList[i];
                                x = this._curTarget.style.x + this._curTarget.position[0];
                                y = this._curTarget.style.y + this._curTarget.position[1];
K
kener 已提交
1464 1465 1466 1467 1468 1469 1470
                                break;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_CHORD:
                        var name = params.name;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
1471
                            if (shapeList[i].type === 'sector'
K
kener 已提交
1472
                                && ecData.get(shapeList[i], 'name') == name
K
kener 已提交
1473
                            ) {
K
kener 已提交
1474 1475
                                this._curTarget = shapeList[i];
                                var style = this._curTarget.style;
K
kener 已提交
1476 1477
                                var midAngle = (style.startAngle + style.endAngle) 
                                                / 2 * Math.PI / 180;
K
kener 已提交
1478 1479 1480
                                x = this._curTarget.style.x + Math.cos(midAngle) * (style.r - 2);
                                y = this._curTarget.style.y - Math.sin(midAngle) * (style.r - 2);
                                this.zr.trigger(
K
kener 已提交
1481 1482
                                    zrConfig.EVENT.MOUSEMOVE,
                                    {
1483 1484
                                        zrenderX: x,
                                        zrenderY: y
K
kener 已提交
1485 1486 1487 1488 1489 1490 1491 1492 1493
                                    }
                                );
                                return;
                            }
                        }
                        break;
                    case ecConfig.CHART_TYPE_FORCE:
                        var name = params.name;
                        for (var i = 0, l = shapeList.length; i < l; i++) {
1494
                            if (shapeList[i].type === 'circle'
K
kener 已提交
1495
                                && ecData.get(shapeList[i], 'name') == name
K
kener 已提交
1496
                            ) {
K
kener 已提交
1497 1498 1499
                                this._curTarget = shapeList[i];
                                x = this._curTarget.position[0];
                                y = this._curTarget.position[1];
K
kener 已提交
1500 1501 1502 1503 1504
                                break;
                            }
                        }
                        break;
                }
1505
                if (x != null && y != null) {
K
kener 已提交
1506
                    this._event = {
1507 1508
                        zrenderX: x,
                        zrenderY: y
K
kener 已提交
1509
                    };
K
kener 已提交
1510 1511 1512
                    this.zr.addHoverShape(this._curTarget);
                    this.zr.refreshHover();
                    this._showItemTrigger();
K
kener 已提交
1513 1514
                }
            }
K
kener 已提交
1515
        },
K
kener 已提交
1516 1517 1518 1519
        
        /**
         * 关闭,公开接口 
         */
1520
        hideTip: function () {
K
kener 已提交
1521 1522
            this._hide();
        },
K
kener 已提交
1523
        
K
kener 已提交
1524 1525 1526
        /**
         * 刷新
         */
1527
        refresh: function (newOption) {
K
kener 已提交
1528 1529 1530
            // this._selectedMap;
            // this._defaultCssText;    // css样式缓存
            // this._needAxisTrigger;   // 坐标轴触发
K
kener 已提交
1531 1532
            // this._curTarget;
            // this._event;
K
kener 已提交
1533 1534
            // this._curTicket;         // 异步回调标识,用来区分多个请求
            
K
kener 已提交
1535 1536 1537
            // 缓存一些高宽数据
            this._zrHeight = this.zr.getHeight();
            this._zrWidth = this.zr.getWidth();
K
kener 已提交
1538 1539 1540 1541
            
            if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                this.zr.delShape(this._lastTipShape.tipShape);
            }
K
kener 已提交
1542
            this._lastTipShape = false;
K
kener 已提交
1543
            this.shapeList.length = 2;
K
kener 已提交
1544
            
K
kener 已提交
1545
            if (newOption) {
K
kener 已提交
1546 1547 1548 1549 1550
                this.option = newOption;
                this.option.tooltip = this.reformOption(this.option.tooltip);
                this.option.tooltip.textStyle = zrUtil.merge(
                    this.option.tooltip.textStyle,
                    this.ecTheme.textStyle
K
kener 已提交
1551 1552
                );
                // 补全padding属性
K
kener 已提交
1553 1554
                this.option.tooltip.padding = this.reformCssArray(
                    this.option.tooltip.padding
K
kener 已提交
1555
                );
K
kener 已提交
1556 1557
    
                this._needAxisTrigger = false;
1558
                if (this.option.tooltip.trigger === 'axis') {
K
kener 已提交
1559 1560 1561 1562 1563
                    this._needAxisTrigger = true;
                }
    
                var series = this.option.series;
                for (var i = 0, l = series.length; i < l; i++) {
1564
                    if (this.query(series[i], 'tooltip.trigger') === 'axis') {
K
kener 已提交
1565 1566 1567 1568 1569 1570 1571 1572 1573 1574
                        this._needAxisTrigger = true;
                        break;
                    }
                }
                // this._hidingTicket;
                // this._showingTicket;
                this._showDelay = this.option.tooltip.showDelay; // 显示延迟
                this._hideDelay = this.option.tooltip.hideDelay; // 隐藏延迟
                this._defaultCssText = this._style(this.option.tooltip);
                
K
kener 已提交
1575 1576
                this._setSelectedMap();
                this._axisLineWidth = this.option.tooltip.axisPointer.lineStyle.width;
K
kener 已提交
1577
            }
K
kener 已提交
1578
            if (this.showing) {
K
kener 已提交
1579 1580 1581 1582
                var self = this;
                setTimeout(function(){
                    self.zr.trigger(zrConfig.EVENT.MOUSEMOVE, self.zr.handler._event);
                },50);
K
kener 已提交
1583
            }
K
kener 已提交
1584
        },
K
kener 已提交
1585 1586 1587 1588

        /**
         * 释放后实例不可用,重载基类方法
         */
1589
        dispose: function () {
K
kener 已提交
1590 1591 1592 1593
            if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                this.zr.delShape(this._lastTipShape.tipShape);
            }
            this.clear();
K
kener 已提交
1594
            this.shapeList = null;
K
kener 已提交
1595
            
K
kener 已提交
1596 1597
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
K
kener 已提交
1598 1599
            this.zr.un(zrConfig.EVENT.MOUSEMOVE, this._onmousemove);
            this.zr.un(zrConfig.EVENT.GLOBALOUT, this._onglobalout);
K
kener 已提交
1600
            
K
kener 已提交
1601 1602
            if (this.hasAppend) {
                this.dom.firstChild.removeChild(this._tDom);
K
kener 已提交
1603
            }
K
kener 已提交
1604 1605
            this._tDom = null;
        },
K
kener 已提交
1606 1607 1608 1609
        
        /**
         * html转码的方法
         */
1610
        _encodeHTML: function (source) {
K
kener 已提交
1611
            return String(source)
K
kener 已提交
1612 1613 1614 1615 1616
                        .replace(/&/g, '&amp;')
                        .replace(/</g, '&lt;')
                        .replace(/>/g, '&gt;')
                        .replace(/"/g, '&quot;')
                        .replace(/'/g, '&#39;');
K
kener 已提交
1617
        }
K
kener 已提交
1618 1619 1620 1621
    };
    
    zrUtil.inherits(Tooltip, Base);
    
1622 1623
    require('../component').define('tooltip', Tooltip);

K
kener 已提交
1624 1625
    return Tooltip;
});