// modified from: http://geoexamples.com/geoexamples/d3js/d3js_electoral_map/tooltipCode.html d3.helper = {}; d3.helper.tooltip = function(accessor){ return function(selection){ var tooltipDiv; var bodyNode = d3.select('body').node(); selection.on("mouseover", function(d, i){ var targetCX = parseFloat( d3.select(this.parentNode).select(".origin").attr("cx")); var targetCY = parseFloat( d3.select(this.parentNode).select(".origin").attr("cy")); // 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", (targetCX + 20) + "px") .style('top', (targetCY + 50) +'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', d.cx +'px') // 20 .style('top', d.cy +'px'); var tooltipText = accessor(d, i) || ''; tooltipDiv.html(tooltipText); }) .on("mouseout", function(d, i){ // Remove tooltip tooltipDiv.remove(); }); }; };