【发布时间】:2019-10-01 00:00:02
【问题描述】:
我正在尝试使用 D3 在现有的单击事件侦听器中添加第二个单击事件侦听器,但未成功。
基本上,我有一张事件地图(圆圈)。我希望用户能够单击一个圆圈并出现一个弹出窗口。我希望该弹出窗口仅在用户第二次单击任意位置时才消失。因此,单击一个圆圈将实例化弹出窗口并将其绑定,然后再次单击 ANYWHERE 将使弹出窗口消失并将圆圈恢复为仅响应悬停,除非再次单击。
我通过在圆形事件监听器中添加另一个“body”点击事件监听器来解决这个问题:
// event listener: if events (circles) are clicked, instantiate pop-up
d3.selectAll(".events").on("click", function(d) {
console.log("event clicked!")
//disable hover event listeners
d3.selectAll(".events").on("mouseout", null);
d3.selectAll(".events").on("mouseover", null);
popup.transition()
.duration(200)
.style("opacity", .9);
popup.html(d.ArtistBio)
// if user clicks a SECOND time, anywhere, make popup disappear
d3.select("body").on("click", function(d) {
console.log("body clicked")
//hide popup
popup.transition()
.duration(200)
.style("opacity", 0);
//revert back to hover, unless user clicks again!
d3.selectAll(".events").on("mouseout", true);
d3.selectAll(".events").on("mouseover", true);
d3.selectAll(".events").on("mouseout", function(d) {
console.log("mousing out!")
popup.transition()
.duration(200)
.style("opacity", 0);
})
// mouseover event listers added back in
d3.selectAll(".events").on("mouseover", function(d) {
popup.transition()
.duration(200)
.style("opacity", .9);
popup.html(d.ArtistBio)
})
})
我的问题是这两个事件是同时触发的,而不是按顺序触发的:一旦我点击了一个圆形事件,body click 事件监听器也被实例化了,所以弹出窗口一被渲染就被删除.有没有办法以类似于我上面描述的方式做我想做的事情?提前致谢。
【问题讨论】:
-
我们可以得到一些 HTML 以便我可以运行代码吗?
标签: javascript html d3.js event-handling click