score:11

Accepted answer

As @PawelFus states, it's not officially supported but you can fudge this in by taking control of the visiblity of the tooltip.

First on chart load, hide it:

       chart: {
            events: {
                load: function(){
                    $('.highcharts-tooltip').hide();
                }
            }
        },

Disable sticky tracking, and on mouseout hide it, on click show it:

        plotOptions: {
            series: {
                stickyTracking: false,
                events: {
                    click: function() {
                        $('.highcharts-tooltip').show();
                    },
                    mouseOut: function() {
                        $('.highcharts-tooltip').hide();
                    }
                }
            }
        },

Here's a fiddle example.

First attempt only worked in chrome, here's another:

Disable the default tooltip:

tooltip: {
    enabled: false
},

In the chart load event, create your own:

 chart: {
     events: {
        load: function(){
            this.myTooltip = new Highcharts.Tooltip(this, this.options.tooltip);                    
         }
     }
 },

In the click and mouseout control it:

plotOptions: {
    series: {
        stickyTracking: false,
        events: {
            click: function(evt) {
                this.chart.myTooltip.refresh(evt.point, evt);
            },
            mouseOut: function() {
                this.chart.myTooltip.hide();
            }                       
        }           
    }
},

I tested this in IE and Chrome, I won't install Firefox anymore.

Update to code 9/7/2017 with new stack snippet:

$(function () {
        $('#container').highcharts({
            xAxis: {
                categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                    'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
            },
            tooltip: {
                valueSuffix: '°C',
                enabled: false
            },
            chart: {
                events: {
                    load: function(){
                        this.myTooltip = new Highcharts.Tooltip(this, this.options.tooltip);
                    }
                }
            },
            plotOptions: {
                series: {
                    stickyTracking: false,
                    events: {
                        click: function(evt) {
                        		this.chart.myTooltip.options.enabled = true;
                            this.chart.myTooltip.refresh(evt.point, evt);
                        },
                        mouseOut: function() {
                            this.chart.myTooltip.hide();
                            this.chart.myTooltip.options.enabled = false;
                        }                       
                    }
                    
                }
            },
            series: [{
                name: 'Tokyo',
                data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
            }]
        });
    });
    
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script src="https://code.highcharts.com/highcharts.src.js"></script>
<script src="https://code.highcharts.com/modules/exporting.js"></script>

<div id="container" style="min-width: 310px; height: 400px; margin: 0 auto"></div>

score:-1

Here is the fix for "Cannot read category of undefined". I just take hovered points of chart and pass them to refresh.

point: {
    events: {
        mouseOver: function(evt) {
            var hoveredPoints = a.hoverPoints;
            a.tooltip.refresh(hoveredPoints);   
        },
        mouseOut: function() {
            a.tooltip.hide();
        }                       
    }
}

Sample fiddle here: http://jsfiddle.net/2swEQ/153/

score:0

Just add for those who has the same problems as myself (see comment from @kevinandrada just after correct answer, i can't comment): if you call tooltip.refresh when your tooltip.shared = true you'll get an exception Uncaught TypeError: Cannot read property 'category' of undefined.

You should provide an array of points as a first argument:

plotOptions: {
    series: {
        stickyTracking: false,
        events: {
            click: function(evt) {
                var points = this.chart.series.map(function(d) { 
                    return d.searchPoint(evt, true)
                });
                this.chart.myTooltip.refresh(points, evt);
            },
            mouseOut: function() {
                this.chart.myTooltip.hide();
            }                       
        }           
    }
 },

score:0

The problem of first mouse-over tooltip showing in Alexandra Espichán excellent fiddle can be solved via css and the mouseover event omit by replacing his invisibility class with:

.highcharts-tooltip:not(.clone){
    visibility: hidden !important;
}

score:2

Adding for those who have problems like me with useHTML: true and wants to display tooltip only on click and not on hover.

tooltip: {
  useHTML: true
}

Here is a fiddle.


Related Query

More Query from same tag