d3.helper = {}; d3.helper.tooltip = function (accessor) { return function (selection) { var tooltipDiv; var bodyNode = d3.select('body').node(); selection.on("mouseover", function (d, i) { // Clean up lost tooltips d3.select('body').selectAll('div.tooltip').remove(); // Append tooltip tooltipDiv = d3.select('body').append('div').attr('class', 'tooltip'); var absoluteMousePos = d3.mouse(bodyNode); tooltipDiv.style('left', (absoluteMousePos[0] + 10) + 'px') .style('top', (absoluteMousePos[1] - 15) + 'px') .style('position', 'absolute') .style('z-index', 1001); // Add text using the accessor function var tooltipText = accessor(d, i) || ''; // Crop text arbitrarily //tooltipDiv.style('width', function(d, i){return (tooltipText.length > 80) ? '300px' : null;}) // .html(tooltipText); }) .on('mousemove', function (d, i) { // Move tooltip var absoluteMousePos = d3.mouse(bodyNode); tooltipDiv.style('left', (absoluteMousePos[0] + 10) + 'px') .style('top', (absoluteMousePos[1] - 15) + 'px'); var tooltipText = accessor(d, i) || ''; tooltipDiv.html(tooltipText); }) .on("mouseout", function (d, i) { // Remove tooltip tooltipDiv.remove(); }); }; };