【问题标题】:Why is my .on("mouseover") event firing on page refresh and not when I 'mouseover' the event为什么我的 .on("mouseover") 事件在页面刷新时触发,而不是在我“鼠标悬停”事件时触发
【发布时间】:2019-10-02 00:50:36
【问题描述】:

我是 Javascript 和 d3 的新手,并试图让一个基本的“鼠标悬停”事件起作用。该事件似乎在我实际将鼠标悬停在元素上之前触发,但这让我感到困惑。

这是我的代码:

(function (d3) {

const svg = d3.select('svg');

const width = +svg.attr('width');
const height = +svg.attr('height');

const g = svg.append('g')
    .attr('transform',`translate(${width/2},${height/2})`);

const circle = g.append('circle')
  .attr('r', 30)
    .attr('fill', 'steelblue')
    .attr('stroke','black');

var data=[1,2,3,4,5,6];

d3.select('circle').on("mouseover", function(data) {
    console.log(data);
    svg.selectAll('circle').data(data)
        .enter().append('circle')
            .attr('r', data => data)
            .attr('cx', 20)
            .attr('cy', 20)
}(data));

}(d3));

当我将鼠标悬停在第一个圆圈上时,我期望绘制更多的圆圈,但是一旦我刷新页面,它们就会一起绘制。

正如我所说,我是一个新手,所以任何理解这一点的帮助将不胜感激。您可以提供/指向我的任何上下文背景也将不胜感激。

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    我不是 JavaScript 专家,但我认为您在事件声明中使用了自调用函数。

    尝试删除函数声明中的(data) 部分

    d3.select('circle').on("mouseover", function(data) {
       console.log(data);
       svg.selectAll('circle').data(data)
           .enter().append('circle')
               .attr('r', data => data)
               .attr('cx', 20)
               .attr('cy', 20)
    });
    

    【讨论】:

    • 这似乎不起作用 - 我得到 undefined for console.log(data) 和这个错误:Uncaught TypeError: svg.selectAll(...).data(...).enter is not a function at SVGCircleElement.<anonymous> (d3play.js:31) at SVGCircleElement.<anonymous> (d3.js:1524)
    • 我明白了,您正在尝试使用您声明自己的数据变量,当您编写时,function(data) 它告诉程序它将在调用该事件时接收一个参数,因为您的变量已经可以在您的函数中访问,我会尝试从 function(data) 中删除 data 并仅从 function(data) 中删除,只留下 function(),让我知道它是否有效
    • @Chaz,供参考,这里提供给函数的参数(data):.on("mouseover", function(data),表示选择项的基准。由于该选择没有绑定数据,data 在此上下文中将未定义。由于您只需要声明为data 的变量,因此无需将其指定为函数参数(此后data 将引用绑定数据(undefined)而不是您的数组)。
    • 至于自调用。该函数不需要自调用,因为提供的函数是在事件上调用的 - 您希望将函数本身传递给事件处理程序,而不是函数的返回值。
    • @AndrewReid 谢谢你的解释!现在这很有意义 - 我将我找到的一些代码串在一起并试图让它们一起工作,但现在我明白它在做什么了。
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 2013-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    相关资源
    最近更新 更多