d3 - 触发鼠标悬停事件

Posted

技术标签:

【中文标题】d3 - 触发鼠标悬停事件【英文标题】:d3 - trigger mouseover event 【发布时间】:2013-09-30 06:19:36 【问题描述】:

我有一张由 D3 渲染的 SVG 图形中的美国州和县地图。每个路径都绑定了 mouseover、mouseout 和 click 事件,以及设置为路径 ID 的 FIPS 县代码。

我有一个 jQuery 自动完成输入,用户可以在其中输入州或县的名称。鉴于该输入使相应的 FIPS ID 可用,我如何以编程方式触发 mouseover 事件?

【问题讨论】:

【参考方案1】:

Steve Greatrex 的解决方案在 ios 9 之前对我有效,但在 iOS 10 上无效。

在调试了我的代码并进行了一些研究之后,问题似乎是 createEvent 和 initEvent 函数已根据此documentation 被弃用。

新的写法是:

var event = new MouseEvent('SVGEvents', );
element.dispatchEvent(event);

有关使用事件构造函数创建和触发事件的新方法的更多说明,请参见here。

【讨论】:

【参考方案2】:

您可以通过直接在所需元素上调度事件来实现此目的:

var event = document.createEvent('SVGEvents');
event.initEvent(eventName,true,true);
element.dispatchEvent(event);

在blog post中查看更多详细信息

【讨论】:

【参考方案3】:

我想出了答案。主要问题是 D3 没有像 jQuery 那样显式的 trigger 函数。但是,您可以模拟它。

假设你有一个通过构建的 D3 路径

d3.json("us-counties.json", function(json)

  thisObj._svg.selectAll("path")
    .data(json.features)
    .enter().append("path")
    .attr("d", thisObj._path)
    .attr("class", "states")
    .attr("id", function(d)
      return d.id; //<-- Sets the ID of this county to the path
    )
    .style("fill", "gray")
    .style("stroke", "black")
    .style("stroke-width", "0.5px")
    .on("dblclick", mapZoom)
    .on("mouseover", mapMouseOver)
    .on("mouseout", mapMouseOut);
);

以及改变填充和描边颜色的鼠标悬停事件处理程序

var mapMouseOver(d)

  d3.selectAll($("#" + d.id))
    .style("fill", "red")
    .style("stroke", "blue");


通常,大多数教程都说要使用

d3.select(this)...

但实际上使用该值也可以。如果您有一个事件处理程序可以获取节点的 ID,并通过

触发它
$("#someDropdownSelect").change(someEventHandler)

function someEventHandler()

  //get node ID value, sample
  var key = $(this)
              .children(":selected")
              .val();

  //trigger mouseover event handler
  mapMouseOver(id : key);


将根据下拉选择执行鼠标悬停事件

【讨论】:

【参考方案4】:

构建您的 javascript,以便 mouseover 事件调用 javascript 函数,然后您可以随时调用相同的函数。

【讨论】:

以上是关于d3 - 触发鼠标悬停事件的主要内容,如果未能解决你的问题,请参考以下文章

如果父元素也有鼠标悬停,如何为子元素触发鼠标悬停事件?

只能通过 unsafeWindow 从 TamperMonkey 脚本触发鼠标悬停事件 - 为啥?

VueJS父鼠标悬停事件屏蔽子鼠标悬停事件

在页面加载按钮上触发鼠标悬停事件,extjs3

拖动元素jquery ui时连续触发鼠标悬停事件?

什么是鼠标悬停事件?