tooltip.js 69.6 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
                               ? this._showAxisTrigger(
K
kener 已提交
325
                                     serie.xAxisIndex, serie.yAxisIndex,
K
kener 已提交
326
                                     ecData.get(this._curTarget, 'dataIndex')
K
kener 已提交
327
                                 )
K
kener 已提交
328
                               : 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 510 511
            var categoryAxis;
            var x;
            var y;

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

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

            if (seriesArray.length > 0) {
                var data;
645
                if (typeof formatter === 'function') {
K
kener 已提交
646 647
                    var params = [];
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
648
                        data = seriesArray[i].data[dataIndex];
649 650
                        data = data != null
                               ? (data.value != null
K
kener 已提交
651 652 653 654
                                   ? data.value
                                   : data)
                               : '-';
                               
K
kener 已提交
655
                        params.push([
K
kener 已提交
656
                            seriesArray[i].name || '',
K
kener 已提交
657 658 659 660
                            categoryAxis.getNameByIndex(dataIndex),
                            data
                        ]);
                    }
K
kener 已提交
661
                    this._curTicket = 'axis:' + dataIndex;
662 663
                    this._tDom.innerHTML = formatter.call(
                        this.myChart, params, this._curTicket, this._setContent
K
kener 已提交
664 665
                    );
                }
666
                else if (typeof formatter === 'string') {
K
kener 已提交
667
                    this._curTicket = NaN;
K
kener 已提交
668 669 670 671 672 673
                    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 已提交
674
                            this._encodeHTML(seriesArray[i].name || '')
K
kener 已提交
675 676 677
                        );
                        formatter = formatter.replace(
                            '{b' + i + '}',
K
kener 已提交
678
                            this._encodeHTML(categoryAxis.getNameByIndex(dataIndex))
K
kener 已提交
679
                        );
K
kener 已提交
680
                        data = seriesArray[i].data[dataIndex];
681 682
                        data = data != null
                               ? (data.value != null
K
kener 已提交
683 684 685
                                   ? data.value
                                   : data)
                               : '-';
K
kener 已提交
686 687
                        formatter = formatter.replace(
                            '{c' + i + '}',
688
                            data instanceof Array 
K
kener 已提交
689
                            ? data : this.numAddCommas(data)
K
kener 已提交
690 691
                        );
                    }
K
kener 已提交
692
                    this._tDom.innerHTML = formatter;
K
kener 已提交
693 694
                }
                else {
K
kener 已提交
695 696
                    this._curTicket = NaN;
                    formatter = this._encodeHTML(
K
kener 已提交
697 698 699
                        categoryAxis.getNameByIndex(dataIndex)
                    );

K
kener 已提交
700
                    for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
701
                        formatter += '<br/>' 
K
kener 已提交
702
                                     + this._encodeHTML(seriesArray[i].name || '')
K
kener 已提交
703
                                     + ' : ';
K
kener 已提交
704
                        data = seriesArray[i].data[dataIndex];
705 706
                        data = data != null
                               ? (data.value != null
K
kener 已提交
707 708 709
                                   ? data.value
                                   : data)
                               : '-';
710
                        formatter += data instanceof Array 
K
kener 已提交
711
                                     ? data : this.numAddCommas(data);
K
kener 已提交
712
                    }
K
kener 已提交
713
                    this._tDom.innerHTML = formatter;
K
kener 已提交
714 715
                }

K
kener 已提交
716 717
                // don't modify, just false, showContent == undefined == true
                if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
718 719 720 721
                    // 只用tooltip的行为,不显示主体
                    return;
                }
                
K
kener 已提交
722 723 724 725 726
                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 已提交
727
                }
K
kener 已提交
728
                this._show(position, x + 10, y + 10, specialCssText);
K
kener 已提交
729
            }
K
kener 已提交
730
        },
731
        
K
kener 已提交
732 733 734
        /**
         * 极坐标 
         */
735 736 737 738
        _showPolarTrigger: function (polarIndex, dataIndex) {
            if (this.component.polar == null
                || polarIndex == null
                || dataIndex == null
K
kener 已提交
739 740 741 742
                || dataIndex < 0
            ) {
                return false;
            }
K
kener 已提交
743
            var series = this.option.series;
K
kener 已提交
744 745 746
            var seriesArray = [];

            var formatter;
K
kener 已提交
747
            var position;
K
kener 已提交
748
            var showContent;
K
kener 已提交
749
            var specialCssText = '';
750 751
            if (this.option.tooltip.trigger === 'axis') {
                if (!this.option.tooltip.show) {
K
kener 已提交
752 753
                    return false;
                }
K
kener 已提交
754
                formatter = this.option.tooltip.formatter;
K
kener 已提交
755
                position = this.option.tooltip.position;
K
kener 已提交
756
            }
K
kener 已提交
757
            var indicatorName = this.option.polar[polarIndex].indicator[dataIndex].text;
K
kener 已提交
758 759 760

            // 找到所有用这个极坐标并且axis触发的系列数据
            for (var i = 0, l = series.length; i < l; i++) {
K
kener 已提交
761
                if (!this._isSelected(series[i].name)) {
K
kener 已提交
762 763
                    continue;
                }
764 765
                if (series[i].polarIndex === polarIndex
                    && this.deepQuery([series[i], this.option], 'tooltip.trigger') === 'axis'
K
kener 已提交
766
                ) {
K
kener 已提交
767 768 769 770 771 772 773
                    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 已提交
774 775 776 777 778 779 780 781 782 783 784 785
                    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 已提交
786
                        if (!this._isSelected(data.name)) {
K
kener 已提交
787 788
                            continue;
                        }
789
                        data = data != null
K
kener 已提交
790 791 792 793
                               ? data
                               : {name:'', value: {dataIndex:'-'}};
                               
                        params.push([
K
kener 已提交
794
                            seriesArray[i].name || '',
K
kener 已提交
795
                            data.name,
796
                            data.value[dataIndex].value != null
797
                                ? data.value[dataIndex].value : data.value[dataIndex],
K
kener 已提交
798 799 800 801
                            indicatorName
                        ]);
                    }
                }
K
kener 已提交
802 803 804
                if (params.length <= 0) {
                    return;
                }
805
                if (typeof formatter === 'function') {
K
kener 已提交
806
                    this._curTicket = 'axis:' + dataIndex;
807 808
                    this._tDom.innerHTML = formatter.call(
                        this.myChart, params, this._curTicket, this._setContent
K
kener 已提交
809 810
                    );
                }
811
                else if (typeof formatter === 'string') {
K
kener 已提交
812 813 814 815 816 817 818
                    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 已提交
819
                            this._encodeHTML(params[i][0])
K
kener 已提交
820 821 822
                        );
                        formatter = formatter.replace(
                            '{b' + i + '}',
K
kener 已提交
823
                            this._encodeHTML(params[i][1])
K
kener 已提交
824 825 826
                        );
                        formatter = formatter.replace(
                            '{c' + i + '}',
K
kener 已提交
827
                            this.numAddCommas(params[i][2])
K
kener 已提交
828 829 830
                        );
                        formatter = formatter.replace(
                            '{d' + i + '}',
K
kener 已提交
831
                            this._encodeHTML(params[i][3])
K
kener 已提交
832 833
                        );
                    }
K
kener 已提交
834
                    this._tDom.innerHTML = formatter;
K
kener 已提交
835 836
                }
                else {
K
kener 已提交
837 838 839
                    formatter = this._encodeHTML(params[0][1]) + '<br/>' 
                                + this._encodeHTML(params[0][3]) + ' : ' 
                                + this.numAddCommas(params[0][2]);
K
kener 已提交
840
                    for (var i = 1, l = params.length; i < l; i++) {
K
kener 已提交
841
                        formatter += '<br/>' + this._encodeHTML(params[i][1]) 
K
kener 已提交
842
                                     + '<br/>';
K
kener 已提交
843 844
                        formatter += this._encodeHTML(params[i][3]) + ' : ' 
                                     + this.numAddCommas(params[i][2]);
K
kener 已提交
845
                    }
K
kener 已提交
846
                    this._tDom.innerHTML = formatter;
K
kener 已提交
847 848
                }

K
kener 已提交
849 850
                // don't modify, just false, showContent == undefined == true
                if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
851 852 853 854
                    // 只用tooltip的行为,不显示主体
                    return;
                }
                
K
kener 已提交
855 856 857 858 859
                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 已提交
860
                }
K
kener 已提交
861
                this._show(
K
kener 已提交
862
                    position,
K
kener 已提交
863 864
                    zrEvent.getX(this._event), 
                    zrEvent.getY(this._event), 
K
kener 已提交
865 866 867 868
                    specialCssText
                );
                return true;
            }
K
kener 已提交
869
        },
K
kener 已提交
870
        
871
        _showItemTrigger: function () {
K
kener 已提交
872 873 874
            if (!this._curTarget) {
                return;
            }
K
kener 已提交
875 876 877 878 879 880
            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 已提交
881 882
            // 从低优先级往上找到trigger为item的formatter和样式
            var formatter;
K
kener 已提交
883
            var position;
K
kener 已提交
884
            var showContent;
K
kener 已提交
885
            var specialCssText = '';
K
kener 已提交
886 887
            var indicator;
            var html = '';
K
kener 已提交
888
            if (this._curTarget._type != 'island') {
K
kener 已提交
889
                // 全局
890
                if (this.option.tooltip.trigger === 'item') {
K
kener 已提交
891
                    formatter = this.option.tooltip.formatter;
K
kener 已提交
892
                    position = this.option.tooltip.position;
K
kener 已提交
893 894
                }
                // 系列
895
                if (this.query(serie, 'tooltip.trigger') === 'item') {
K
kener 已提交
896 897 898 899 900 901 902
                    showContent = this.query(serie, 'tooltip.showContent') 
                                  || showContent;
                    formatter = this.query(serie, 'tooltip.formatter') 
                                || formatter;
                    position = this.query(serie, 'tooltip.position') 
                               || position;
                    specialCssText += this._style(this.query(serie, 'tooltip'));
K
kener 已提交
903 904
                }
                // 数据项
K
kener 已提交
905 906 907 908 909 910
                showContent = this.query(data, 'tooltip.showContent') 
                              || showContent;
                formatter = this.query(data, 'tooltip.formatter') 
                            || formatter;
                position = this.query(data, 'tooltip.position') 
                           || position;
K
kener 已提交
911
                specialCssText += this._style(this.query(data, 'tooltip'));
K
格式  
kener 已提交
912 913
            }
            else {
K
kener 已提交
914 915 916
                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 已提交
917 918
            }

919
            if (typeof formatter === 'function') {
K
kener 已提交
920
                this._curTicket = (serie.name || '')
K
kener 已提交
921 922
                                  + ':'
                                  + ecData.get(this._curTarget, 'dataIndex');
923 924
                this._tDom.innerHTML = formatter.call(
                    this.myChart,
K
kener 已提交
925
                    [
K
kener 已提交
926
                        serie.name || '',
K
kener 已提交
927 928
                        name,
                        value,
L
lang 已提交
929
                        special,
K
kener 已提交
930 931
                        special2,
                        data
K
kener 已提交
932
                    ],
K
kener 已提交
933 934
                    this._curTicket,
                    this._setContent
K
kener 已提交
935 936
                );
            }
937
            else if (typeof formatter === 'string') {
K
kener 已提交
938
                this._curTicket = NaN;
K
kener 已提交
939 940
                formatter = formatter.replace('{a}','{a0}')
                                     .replace('{b}','{b0}')
K
kener 已提交
941
                                     .replace('{c}','{c0}');
K
kener 已提交
942
                formatter = formatter.replace('{a0}', this._encodeHTML(serie.name || ''))
K
kener 已提交
943
                                     .replace('{b0}', this._encodeHTML(name))
944 945
                                     .replace(
                                         '{c0}', 
K
kener 已提交
946
                                         value instanceof Array ? value : this.numAddCommas(value)
947
                                     );
K
kener 已提交
948

K
kener 已提交
949 950 951
                formatter = formatter.replace('{d}','{d0}')
                                     .replace('{d0}', special || '');
                formatter = formatter.replace('{e}','{e0}')
K
kener 已提交
952
                            .replace('{e0}', ecData.get(this._curTarget, 'special2') || '');
K
kener 已提交
953

K
kener 已提交
954
                this._tDom.innerHTML = formatter;
K
kener 已提交
955 956
            }
            else {
K
kener 已提交
957
                this._curTicket = NaN;
958 959 960 961 962 963
                if (serie.type === ecConfig.CHART_TYPE_SCATTER) {
                    this._tDom.innerHTML = ''
                        + (serie.name != null ? (this._encodeHTML(serie.name) + '<br/>') : '') 
                        + (name === '' ? '' : (this._encodeHTML(name) + ' : ')) 
                        + value 
                        + (special == null ? '' : (' (' + special + ')'));
K
kener 已提交
964
                }
965
                else if (serie.type === ecConfig.CHART_TYPE_RADAR && special) {
K
kener 已提交
966
                    indicator = special;
K
kener 已提交
967
                    html += this._encodeHTML(name === '' ? (serie.name || '') : name);
K
kener 已提交
968
                    html += html === '' ? '' : '<br />';
K
kener 已提交
969
                    for (var i = 0 ; i < indicator.length; i ++) {
K
kener 已提交
970 971
                        html += this._encodeHTML(indicator[i].text) + ' : ' 
                                + this.numAddCommas(value[i]) + '<br />';
K
kener 已提交
972
                    }
K
kener 已提交
973
                    this._tDom.innerHTML = html;
K
kener 已提交
974
                }
975 976
                else if (serie.type === ecConfig.CHART_TYPE_CHORD) {
                    if (special2 == null) {
K
kener 已提交
977
                        // 外环上
K
kener 已提交
978
                        this._tDom.innerHTML = this._encodeHTML(name) + ' (' 
K
kener 已提交
979
                                               + this.numAddCommas(value) + ')';
K
kener 已提交
980 981
                    }
                    else {
K
kener 已提交
982 983
                        var name1 = this._encodeHTML(name);
                        var name2 = this._encodeHTML(special);
K
kener 已提交
984
                        // 内部弦上
985 986 987 988 989 990 991
                        this._tDom.innerHTML = ''
                            + (serie.name != null ? (this._encodeHTML(serie.name) + '<br/>') : '')
                            + name1 + ' -> ' + name2 
                            + ' (' + this.numAddCommas(value) + ')'
                            + '<br />'
                            + name2 + ' -> ' + name1
                            + ' (' + this.numAddCommas(special2) + ')';
K
kener 已提交
992 993
                    }
                }
K
kener 已提交
994
                else {
995 996 997 998 999
                    this._tDom.innerHTML = ''
                        + (serie.name != null ? (this._encodeHTML(serie.name) + '<br/>') : '')
                        + this._encodeHTML(name) + ' : ' 
                        + this.numAddCommas(value) 
                        + (special == null ? '' : (' ('+ this.numAddCommas(special) +')'));
K
kener 已提交
1000
                }
K
kener 已提交
1001 1002
            }

K
kener 已提交
1003 1004 1005
            if (!this._axisLineShape.invisible 
                || !this._axisShadowShape.invisible
            ) {
K
kener 已提交
1006
                this._axisLineShape.invisible = true;
K
kener 已提交
1007
                this.zr.modShape(this._axisLineShape.id);
K
kener 已提交
1008 1009
                this._axisShadowShape.invisible = true;
                this.zr.modShape(this._axisShadowShape.id);
K
kener 已提交
1010
                this.zr.refresh();
K
kener 已提交
1011 1012
            }
            
K
kener 已提交
1013 1014
            // don't modify, just false, showContent == undefined == true
            if (showContent === false || !this.option.tooltip.showContent) {
K
kener 已提交
1015 1016 1017 1018
                // 只用tooltip的行为,不显示主体
                return;
            }
            
K
kener 已提交
1019 1020 1021 1022 1023
            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 已提交
1024
            }
K
kener 已提交
1025
            
K
kener 已提交
1026
            this._show(
K
kener 已提交
1027
                position,
K
kener 已提交
1028 1029
                zrEvent.getX(this._event) + 20,
                zrEvent.getY(this._event) - 20,
K
kener 已提交
1030 1031
                specialCssText
            );
K
kener 已提交
1032
        },
K
kener 已提交
1033

1034 1035 1036
        /**
         * 设置坐标轴指示器样式 
         */
1037
        _styleAxisPointer: function (seriesArray, xStart, yStart, xEnd, yEnd, gap, x, y) {
1038 1039 1040
            if (seriesArray.length > 0) {
                var queryTarget;
                var curType;
K
kener 已提交
1041
                var axisPointer = this.option.tooltip.axisPointer;
1042
                var pointType = axisPointer.type;
K
kener 已提交
1043
                var style = {
1044 1045 1046
                    line: { },
                    cross: { },
                    shadow: { }
K
kener 已提交
1047 1048 1049 1050 1051 1052
                };
                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;
                }
1053
                for (var i = 0, l = seriesArray.length; i < l; i++) {
K
kener 已提交
1054 1055
                    if (this.deepQuery(
                           [seriesArray[i], this.option], 'tooltip.trigger'
1056
                       ) === 'axis'
1057
                    ) {
1058
                        queryTarget = seriesArray[i];
K
kener 已提交
1059
                        curType = this.query(queryTarget, 'tooltip.axisPointer.type');
1060
                        pointType = curType || pointType; 
K
kener 已提交
1061 1062
                        if (curType) {
                            style[curType].color = this.query(
1063
                                queryTarget,
K
kener 已提交
1064 1065 1066
                                'tooltip.axisPointer.' + curType + 'Style.color'
                            ) || style[curType].color;
                            style[curType].width = this.query(
1067
                                queryTarget,
K
kener 已提交
1068 1069 1070
                                'tooltip.axisPointer.' + curType + 'Style.width'
                            ) || style[curType].width;
                            style[curType].type = this.query(
1071
                                queryTarget,
K
kener 已提交
1072 1073
                                'tooltip.axisPointer.' + curType + 'Style.type'
                            ) || style[curType].type;
1074 1075 1076 1077
                        }
                    }
                }
                
1078
                if (pointType === 'line') {
K
kener 已提交
1079
                    this._axisLineShape.style = {
1080 1081 1082 1083 1084 1085 1086
                        xStart: xStart,
                        yStart: yStart,
                        xEnd: xEnd,
                        yEnd: yEnd,
                        strokeColor: style.line.color,
                        lineWidth: style.line.width,
                        lineType: style.line.type
1087
                    };
K
kener 已提交
1088
                    this._axisLineShape.invisible = false;
K
kener 已提交
1089
                    this.zr.modShape(this._axisLineShape.id);
1090
                }
1091
                else if (pointType === 'cross') {
K
kener 已提交
1092 1093
                    this._axisCrossShape.style = {
                        brushType: 'stroke',
1094 1095 1096 1097
                        rect: this.component.grid.getArea(),
                        x: x,
                        y: y,
                        text: ('( ' 
K
kener 已提交
1098 1099 1100 1101
                               + this.component.xAxis.getAxis(0).getValueFromCoord(x)
                               + ' , '
                               + this.component.yAxis.getAxis(0).getValueFromCoord(y) 
                               + ' )'
1102 1103 1104 1105 1106
                              ).replace('  , ', ' ').replace(' ,  ', ' '),
                        textPosition: 'specific',
                        strokeColor: style.cross.color,
                        lineWidth: style.cross.width,
                        lineType: style.cross.type
K
kener 已提交
1107 1108 1109 1110
                    };
                    if (this.component.grid.getXend() - x > 100) {          // 右侧有空间
                        this._axisCrossShape.style.textAlign = 'left';
                        this._axisCrossShape.style.textX = x + 10;
1111 1112
                    }
                    else {
K
kener 已提交
1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
                        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);
                }
1127 1128 1129
                else if (pointType === 'shadow') {
                    if (style.shadow.width == null 
                        || style.shadow.width === 'auto'
K
kener 已提交
1130 1131 1132
                        || isNaN(style.shadow.width)
                    ) {
                        style.shadow.width = gap;
1133
                    }
1134
                    if (xStart === xEnd) {
1135
                        // 纵向
K
kener 已提交
1136
                        if (Math.abs(this.component.grid.getX() - xStart) < 2) {
1137
                            // 最左边
K
kener 已提交
1138 1139
                            style.shadow.width /= 2;
                            xStart = xEnd = xEnd + style.shadow.width / 2;
1140
                        }
K
kener 已提交
1141
                        else if (Math.abs(this.component.grid.getXend() - xStart) < 2) {
1142
                            // 最右边
K
kener 已提交
1143 1144
                            style.shadow.width /= 2;
                            xStart = xEnd = xEnd - style.shadow.width / 2;
1145 1146
                        }
                    }
1147
                    else if (yStart === yEnd) {
1148
                        // 横向
K
kener 已提交
1149
                        if (Math.abs(this.component.grid.getY() - yStart) < 2) {
1150
                            // 最上边
K
kener 已提交
1151 1152
                            style.shadow.width /= 2;
                            yStart = yEnd = yEnd + style.shadow.width / 2;
1153
                        }
K
kener 已提交
1154
                        else if (Math.abs(this.component.grid.getYend() - yStart) < 2) {
1155
                            // 最右边
K
kener 已提交
1156 1157
                            style.shadow.width /= 2;
                            yStart = yEnd = yEnd - style.shadow.width / 2;
1158 1159
                        }
                    }
K
kener 已提交
1160
                    this._axisShadowShape.style = {
1161 1162 1163 1164 1165 1166
                        xStart: xStart,
                        yStart: yStart,
                        xEnd: xEnd,
                        yEnd: yEnd,
                        strokeColor: style.shadow.color,
                        lineWidth: style.shadow.width
1167
                    };
K
kener 已提交
1168
                    this._axisShadowShape.invisible = false;
K
kener 已提交
1169
                    this.zr.modShape(this._axisShadowShape.id);
1170
                }
K
kener 已提交
1171
                this.zr.refresh();
1172
            }
K
kener 已提交
1173
        },
1174

1175
        __onmousemove: function (param) {
K
kener 已提交
1176 1177
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
K
kener 已提交
1178
            var target = param.target;
K
kener 已提交
1179 1180 1181
            var mx = zrEvent.getX(param.event);
            var my = zrEvent.getY(param.event);
            if (!target) {
K
kener 已提交
1182
                // 判断是否落到直角系里,axis触发的tooltip
K
kener 已提交
1183 1184
                this._curTarget = false;
                this._event = param.event;
K
kener 已提交
1185
                // this._event._target = this._event.target || this._event.toElement;
K
kener 已提交
1186 1187 1188
                this._event.zrenderX = mx;
                this._event.zrenderY = my;
                if (this._needAxisTrigger 
K
kener 已提交
1189
                    && this.component.grid 
K
kener 已提交
1190
                    && zrArea.isInside(rectangleInstance, this.component.grid.getArea(), mx, my)
K
kener 已提交
1191
                ) {
K
kener 已提交
1192
                    this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1193
                }
K
kener 已提交
1194
                else if (this._needAxisTrigger 
K
kener 已提交
1195 1196
                        && this.component.polar 
                        && this.component.polar.isInside([mx, my]) != -1
K
kener 已提交
1197
                ) {
K
kener 已提交
1198
                    this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1199 1200
                }
                else {
K
kener 已提交
1201
                    !this._event.connectTrigger && this.messageCenter.dispatch(
K
kener 已提交
1202
                        ecConfig.EVENT.TOOLTIP_OUT_GRID,
K
kener 已提交
1203 1204 1205
                        this._event,
                        null,
                        this.myChart
K
kener 已提交
1206
                    );
K
kener 已提交
1207
                    this._hidingTicket = setTimeout(this._hide, this._hideDelay);
K
kener 已提交
1208 1209 1210
                }
            }
            else {
K
kener 已提交
1211 1212
                this._curTarget = target;
                this._event = param.event;
K
kener 已提交
1213
                // this._event._target = this._event.target || this._event.toElement;
K
kener 已提交
1214 1215
                this._event.zrenderX = mx;
                this._event.zrenderY = my;
K
kener 已提交
1216
                var polarIndex;
K
kener 已提交
1217
                if (this._needAxisTrigger 
K
kener 已提交
1218 1219
                    && this.component.polar 
                    && (polarIndex = this.component.polar.isInside([mx, my])) != -1
K
kener 已提交
1220 1221
                ) {
                    // 看用这个polar的系列数据是否是axis触发,如果是设置_curTarget为nul
K
kener 已提交
1222
                    var series = this.option.series;
K
kener 已提交
1223
                    for (var i = 0, l = series.length; i < l; i++) {
1224
                        if (series[i].polarIndex === polarIndex
K
kener 已提交
1225 1226
                            && this.deepQuery(
                                   [series[i], this.option], 'tooltip.trigger'
1227
                               ) === 'axis'
K
kener 已提交
1228
                        ) {
K
kener 已提交
1229
                            this._curTarget = null;
K
kener 已提交
1230 1231 1232 1233 1234
                            break;
                        }
                    }
                   
                }
K
kener 已提交
1235
                this._showingTicket = setTimeout(this._tryShow, this._showDelay);
K
kener 已提交
1236
            }
K
kener 已提交
1237
        },
K
kener 已提交
1238

1239 1240 1241
        /**
         * zrender事件响应:鼠标离开绘图区域
         */
1242
        __onglobalout: function () {
K
kener 已提交
1243 1244 1245 1246 1247
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
            this._hidingTicket = setTimeout(this._hide, this._hideDelay);
        },
        
K
kener 已提交
1248 1249 1250
        /**
         * 异步回调填充内容
         */
1251
        __setContent: function (ticket, content) {
K
kener 已提交
1252
            if (!this._tDom) {
K
kener 已提交
1253 1254
                return;
            }
1255
            if (ticket === this._curTicket) {
K
kener 已提交
1256
                this._tDom.innerHTML = content;
K
kener 已提交
1257
            }
K
kener 已提交
1258
            
K
kener 已提交
1259 1260
            setTimeout(this._refixed, 20);
        },
K
kener 已提交
1261

1262
        ontooltipHover: function (param, tipShape) {
K
kener 已提交
1263 1264
            if (!this._lastTipShape // 不存在或者存在但dataIndex发生变化才需要重绘
                || (this._lastTipShape && this._lastTipShape.dataIndex != param.dataIndex)
K
kener 已提交
1265
            ) {
K
kener 已提交
1266 1267
                if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                    this.zr.delShape(this._lastTipShape.tipShape);
K
kener 已提交
1268
                    this.shapeList.length = 2;
K
kener 已提交
1269 1270
                }
                for (var i = 0, l = tipShape.length; i < l; i++) {
K
kener 已提交
1271
                    tipShape[i].zlevel = this._zlevelBase;
K
kener 已提交
1272
                    tipShape[i].style = zrShapeBase.prototype.getHighlightStyle(
K
kener 已提交
1273 1274 1275 1276 1277 1278 1279 1280 1281
                        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 已提交
1282
                    this.shapeList.push(tipShape[i]);
K
kener 已提交
1283
                    this.zr.addShape(tipShape[i]);
K
kener 已提交
1284
                }
K
kener 已提交
1285
                this._lastTipShape = {
1286 1287
                    dataIndex: param.dataIndex,
                    tipShape: tipShape
K
kener 已提交
1288 1289
                };
            }
K
kener 已提交
1290
        },
K
kener 已提交
1291
        
1292
        ondragend: function () {
K
kener 已提交
1293 1294
            this._hide();
        },
K
kener 已提交
1295 1296 1297 1298
        
        /**
         * 图例选择
         */
1299
        onlegendSelected: function (param) {
K
kener 已提交
1300 1301
            this._selectedMap = param.selected;
        },
K
kener 已提交
1302
        
1303
        _setSelectedMap: function () {
1304 1305
            if (this.component.legend) {
                this._selectedMap = zrUtil.clone(this.component.legend.getSelectedMap());
K
kener 已提交
1306 1307
            }
            else {
K
kener 已提交
1308
                this._selectedMap = {};
K
kener 已提交
1309
            }
K
kener 已提交
1310
        },
K
kener 已提交
1311
        
1312 1313
        _isSelected: function (itemName) {
            if (this._selectedMap[itemName] != null) {
K
kener 已提交
1314
                return this._selectedMap[itemName];
K
kener 已提交
1315 1316 1317 1318
            }
            else {
                return true; // 没在legend里定义的都为true啊~
            }
K
kener 已提交
1319
        },
K
kener 已提交
1320

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

        /**
         * 释放后实例不可用,重载基类方法
         */
1619
        dispose: function () {
K
kener 已提交
1620 1621 1622 1623
            if (this._lastTipShape && this._lastTipShape.tipShape.length > 0) {
                this.zr.delShape(this._lastTipShape.tipShape);
            }
            this.clear();
K
kener 已提交
1624
            this.shapeList = null;
K
kener 已提交
1625
            
K
kener 已提交
1626 1627
            clearTimeout(this._hidingTicket);
            clearTimeout(this._showingTicket);
K
kener 已提交
1628 1629
            this.zr.un(zrConfig.EVENT.MOUSEMOVE, this._onmousemove);
            this.zr.un(zrConfig.EVENT.GLOBALOUT, this._onglobalout);
K
kener 已提交
1630
            
K
kener 已提交
1631 1632
            if (this.hasAppend) {
                this.dom.firstChild.removeChild(this._tDom);
K
kener 已提交
1633
            }
K
kener 已提交
1634 1635
            this._tDom = null;
        },
K
kener 已提交
1636 1637 1638 1639
        
        /**
         * html转码的方法
         */
1640
        _encodeHTML: function (source) {
K
kener 已提交
1641
            return String(source)
K
kener 已提交
1642 1643 1644 1645 1646
                        .replace(/&/g, '&amp;')
                        .replace(/</g, '&lt;')
                        .replace(/>/g, '&gt;')
                        .replace(/"/g, '&quot;')
                        .replace(/'/g, '&#39;');
K
kener 已提交
1647
        }
K
kener 已提交
1648 1649 1650 1651
    };
    
    zrUtil.inherits(Tooltip, Base);
    
1652 1653
    require('../component').define('tooltip', Tooltip);

K
kener 已提交
1654 1655
    return Tooltip;
});