代码之家  ›  专栏  ›  技术社区  ›  PatriciaW

D3工具提示在Firefox中不显示

  •  2
  • PatriciaW  · 技术社区  · 9 年前

    我前段时间开发了一个图表,它工作正常。最近我注意到工具提示在Firefox中不起作用了,尽管它在Safari中正常工作(都在Mac OS上)。有人能提出可能导致问题的原因吗?

    该图表嵌入Drupal网站 http://www.climateactionnow.ca/cumulative-manmade-emissions-1854-2010

    更新:自从发布这篇文章以来,我发现了许多使用Firefox的此类错误报告……但还没有找到解决方案。

    代码为:

    <script>
    
    var w = 450,
    h = 500,
    r = Math.min(w, h) / 2,
    color = d3.scale.category20c();
    
    function prettyAlert(p_message, p_title) {
    p_title = p_title || "";
    $(p_message).dialog({
       title: p_title,
       width:400,
       height:400,
       resizable: false,
       modal : true,
       overlay: { 
         backgroundColor: "#000", opacity: 0.5 
         },
       close: function(ev, ui) {
         $(this).remove(); 
         }
    });
    }
    hoverover=d3.select("body")
    .append("div")
    .attr("class","arcs-hoverover")
    .style("display","none")
    .style("position","absolute");
    
    var svg = d3.select("#chart").append("svg:svg")
    .attr("width", w)
    .attr("height", h)
    .append("svg:g")
    .attr("transform", "translate(" + w / 2 + "," + h / 2 + ")");
    
    var partition = d3.layout.partition()
    .sort(null)
    .size([2 * Math.PI, r * r])
    .children(function(d) { return isNaN(d.value) ? d3.entries(d.value) : null; })
    .value(function(d) { return d.value; });
    
    var arc = d3.svg.arc()
    .startAngle(function(d) { return d.x; })
    .endAngle(function(d) { return d.x + d.dx; })
    .innerRadius(function(d) { return Math.sqrt(d.y); })
    .outerRadius(function(d) { return Math.sqrt(d.y + d.dy); })
    ;
    
    d3.json("../sites/default/d3_files/json/ranking.json", function(json) {
    
    path = svg.data(d3.entries(json)).selectAll("path")
    .data(partition.nodes)
    .enter().append("svg:path")
    .attr("d", arc)
    .attr("fill", function(d) { 
         if (d.key != "Not attributed") {
            return color(d.key);
            }
         else {
            return "transparent";
            } // end else
         }) // end fill
     .style("stroke", function(d) { 
         if (d.key == "Not attributed") {
            return "lightgrey";}
         }) // end stroke
    .on("click", magnify)
    .each(stash)
    .on("mouseout",function(d){ 
      d3.select("body")
      .select(".arcs-hoverover")
      .style("display","none");  
      d3.select(this)
      .style("stroke-width","1px")
    }) // end mouseout
    
    .on("mousemove",function(d){
       var bodyOffsets = document.body.getBoundingClientRect();
       d3.select(this)
         .style("stroke-width","1px");
       d3.select("body")
         .select(".arcs-hoverover")
         .style("display","block") 
         .style("top", (d3.event.clientY - bodyOffsets.top -300)+"px")
         .style("left",(d3.event.clientX - bodyOffsets.left -20)+"px")
         .html(function( ){
              var units=calcUnits(d.key);
               return d.key + "<br />" + d3.round(d.value/1000, 2)+ units;
         }) // end html
      }) // end mousemove
    
     ; // end append g
    }); // end d3.json
    
    function calcUnits (type) {
    // str.indexOf("welcome")
    if ((type.indexOf("Production")!=-1) || (type.indexOf("Flaring")!=-1))   { // found
      return " GtCO2"
     }
    else {
      return " GtCO2e"
     };
    };
    
    function clickAlert (label) {
    };
    
    // Distort the specified node to 80% of its parent.
    function magnify(node) {
    if (parent = node.parent) {
    var parent,
    x = parent.x,
    k = .8;
    parent.children.forEach(function(sibling) {
        x += reposition(sibling, x, sibling === node
        ? parent.dx * k / node.value
        : parent.dx * (1 - k) / (parent.value - node.value));
    });
    } else {
    reposition(node, 0, node.dx / node.value);
    }
    
    path.transition() // was path - undefined
    .duration(750)
    .attrTween("d", arcTween);
    }; // end magnify
    
    // Recursively reposition the node at position x with scale k.
    function reposition(node, x, k) {
    node.x = x;
    if (node.children && (n = node.children.length)) {
        var i = -1, n;
        while (++i < n) x += reposition(node.children[i], x, k);
        }
    return node.dx = node.value * k;
    }; // end reposition
    
    // Stash the old values for transition.
    function stash(d) {
    d.x0 = d.x;
    d.dx0 = d.dx;
    }; // end stash
    
    // Interpolate the arcs in data space.
    function arcTween(a) {
    var i = d3.interpolate({x: a.x0, dx: a.dx0}, a);
    return function(t) {
        var b = i(t);
        a.x0 = b.x;
        a.dx0 = b.dx;
        return arc(b);
        };
    }; // end arcTween
    </script>
    
    3 回复  |  直到 9 年前
        1
  •  1
  •   Cyril Cherian    9 年前

    原因是在FF中 div 显示鼠标事件 mouseout 被触发 display:none .

    因此,工具提示不可见。

    因此,修复方法是使工具提示div不显示鼠标事件。 通过使用 pointer-events:none 阅读 here

    所以在css中添加:

    .arcs-hoverover{
      pointer-events:none
    }
    

    或者在渲染后在代码中添加以下内容:

    d3.selectAll(".arcs-hoverover").style("pointer-events", "none");
    

    希望这有帮助!

        2
  •  0
  •   bennettbuchanan    9 年前

    移动光标时,工具提示的位置会导致鼠标退出事件。您可以更改顶部和左侧的距离(在代码中:-300和-20),以便光标不能悬停在工具提示上。

     .style("top", (d3.event.clientY - bodyOffsets.top -300)+"px")
     .style("left",(d3.event.clientX - bodyOffsets.left -20)+"px")
    
        3
  •  0
  •   cjones6cjones6    4 年前

    我有一个D3 v4散点图。我的工具提示在Chrome、Edge和IE中运行良好;但在Firefox中没有。在Firefox中,对于图表左下方的数据点,工具提示正确显示,但对于右上方的数据点仍保持隐藏,不显示。这令人费解。

    当我遵循Cyril Cherian的建议,在相关的CSS中添加“指针事件:无”时,这个问题在Firefox中得到了解决,而没有在Chrome、Edge或IE中中断。

    .tooltip {
    position: absolute;
    z-index: 10;
    visibility: hidden;
    pointer-events: none;    /* <======= added code ====== */
    background-color: lightblue;
    text-align: center;
    padding: 4px;
    border-radius: 4px;
    font-weight: bold;
    color: black;
    

    }

    我采用了Cherian的解决方案,因为我看到Chris Williams的示例使用了“指针事件:无”,并且它在我尝试的所有浏览器中都有效。 D3 scatterchart with tooltips and pointer-events: none