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

为什么mouseover返回回调中的所有数据

  •  1
  • ravelinx  · 技术社区  · 6 年前

    我刚接触到D3,目前正尝试使用MikeBostock提供的示例制作一个简单的折线图,我已经获得了以下代码。

    <!DOCTYPE html>
    <svg width="960" height="500"></svg>
    <script src="https://d3js.org/d3.v4.min.js"></script>
    <script>
    
        var svg = d3.select("svg"),
            margin = {top: 20, right: 20, bottom: 30, left: 50},
            width = +svg.attr("width") - margin.left - margin.right,
            height = +svg.attr("height") - margin.top - margin.bottom,
            g = svg.append("g")
            .attr("transform", "translate(" + margin.left + "," + margin.top + ")");
    
        var parseTime = d3.timeParse("%d-%b-%y");
    
        var x = d3.scaleTime()
            .rangeRound([0, width]);
    
        var y = d3.scaleLinear()
            .rangeRound([height, 0]);
    
        var line = d3.line()
            .x(function(d) { return x(d.date);  })
            .y(function(d) { return y(d.close);  });
    
        d3.tsv("data.tsv", function(d) {
            d.date = parseTime(d.date);
            d.close = +d.close;
            return d;
    
        }, function(error, data) {
            if (error) throw error;
            x.domain(d3.extent(data, function(d) { return d.date;  }));
            y.domain(d3.extent(data, function(d) { return d.close;  }));
    
            g.append("g")
                .attr("transform", "translate(0," + height + ")")
                .call(d3.axisBottom(x))
                .select(".domain");
    
            g.append("g")
                .call(d3.axisLeft(y))
                .append("text")
                .attr("fill", "#000")
                .attr("transform", "rotate(-90)")
                .attr("y", 6)
                .attr("dy", "0.71em")
                .attr("text-anchor", "end")
                .text("Weight (lbs)");
    
            g.append("path")
                .datum(data)
                .attr("fill", "none")
                .attr("stroke", "steelblue")
                .attr("stroke-linejoin", "round")
                .attr("stroke-linecap", "round")
                .attr("stroke-width", 1.5)
                .attr("d", line)
                .on("mouseover", handleMouseOver);
        });
    
        function handleMouseOver(d,i) {
            console.log(d);
            console.log(i);
        }
    
    </script>
    

    从下面的链接中,如果您想用示例数据进行测试,我将附加该链接 https://bl.ocks.org/mbostock/3883245

    问题是,我想添加一个新功能,用户可以将鼠标悬停在行的一部分上,然后查看此时数据的值,我理解的是,我为数据中的每个条目附加了一个新的路径,问题是,当我向mouseover事件添加一个回调(sup)时将要接收的数据设置为参数,悬停方式如下:

       g.append("path")
                .datum(data)
                .attr("fill", "none")
                .attr("stroke", "steelblue")
                .attr("stroke-linejoin", "round")
                .attr("stroke-linecap", "round")
                .attr("stroke-width", 1.5)
                .attr("d", line)
                .on("mouseover", handleMouseOver);
    
        function handleMouseOver(d,i) {
            console.log(d);
            console.log(i);
        }
    

    log(d)显示了数据数组中的所有数据,而不是悬停在数组中的特定条目,还显示了我总是给出0的索引。我想知道我做错了什么,或者我怎样才能做到这一点。事先谢谢。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Sebastian Rothbucher    6 年前

    //!!

        g.append("g").selectAll("path").data(data.slice(0, data.length-1)).enter().append("path") //!!
            //.datum(data) //!!
            .attr("fill", "none")
            .attr("stroke", "steelblue")
            .attr("stroke-linejoin", "round")
            .attr("stroke-linecap", "round")
            .attr("stroke-width", 1.5)
            .attr("d", function(d,i){return line([data[i], data[i+1]])}) //!!
            .on("mouseover", handleMouseOver);