【问题标题】:Remove d3 tooltip onclick删除 d3 工具提示 onclick
【发布时间】:2019-10-10 05:56:13
【问题描述】:

我正在使用 d3 图表来显示散点图。我在点击时显示工具提示。如果单击页面上的任何位置,则必须删除工具提示。我应该如何删除工具提示?

var svg = d3.select("#scatter_plot")
  .append("svg")
  .attr("width", chart_width)
  .attr("height", chart_height)
// create x_scale

var div = d3.select("body").append("div")
  .attr("class", "tooltip1 scatter_tooltip")
  .style("opacity", 0);
// add circles
svg.selectAll("circle")
  .data(data)
  .enter()
  .append("circle")
  .attr("cx", function (d) {
    return x_scale(d.Staff_count)
  })
  .attr("cy", function (d) {
    return y_scale(d.Outlets)
  })
  .attr("r", function (d) {
    return a_scale(d.Total_Sales)
  })
  .attr("fill", function (d) { return scatter_color(d.Total_Sales) })
  .on("click", function (d) {
    var div_html = "<div class='d-flex justify-content-center m-2'><div class='font-weight-bolder pr-2'>"
    var div_end =  "<hr>" + "</div></div>" + div_html + "Total Sales" + ": " + d.Total_Sales + "</div></div>" + "</div></div>"+ div_html + "Outlets" + ": " + d.Outlets + "</div></div>" + "</div></div>"+ div_html + "Staff Count" + ": " + d.Staff_count
    $(".tooltip1").show()
    div.transition()
      .duration(100)
      .style("opacity", .9);
    if (state_ == 'India') {
      div.html(div_html + d.State + div_end + "</div></div>" + "<button class = 'myBtn btn btn-primary' id='" + d.State + "'>District Details >></button>")
        .style("left", (d3.event.pageX) + "px")
        .style("top", (d3.event.pageY - 28) + "px");
    } else {
      div.html(div_html + d.District + div_end)
        .style("left", (d3.event.pageX) + "px")
        .style("top", (d3.event.pageY - 28) + "px");
    }
    tooltip_load()
    toolTipIsVisible()
  })

如果有人对如何解决这个问题提出一些想法,那将会很有帮助。

【问题讨论】:

  • 你可以监听文档上的点击事件并在其处理程序中隐藏工具提示,但不要忘记在 svg circle 的点击事件处理程序中调用 stopPropagation()。
  • 当我将工具提示附加到正文时,这会起作用吗? @Spark.Bao
  • 让我看看。
  • 我贴上示例代码,请试一试。 @SPL

标签: javascript jquery d3.js


【解决方案1】:

你可以监听body或者document上的click事件作为全局的click事件处理器,在这个handler中你可以隐藏tooltip。在圆形点击事件处理程序中,您需要通过调用d3.event.stopPropagation()来停止点击事件传播到正文或文档。

示例代码:

  .attr("fill", function (d) { return scatter_color(d.Total_Sales) })
  .on("click", function (d) {
    var div_html = "<div class='d-flex justify-content-center m-2'><div class='font-weight-bolder pr-2'>"
    var div_end =  "<hr>" + "</div></div>" + div_html + "Total Sales" + ": " + d.Total_Sales + "</div></div>" + "</div></div>"+ div_html + "Outlets" + ": " + d.Outlets + "</div></div>" + "</div></div>"+ div_html + "Staff Count" + ": " + d.Staff_count
    $(".tooltip1").show()
    div.transition()
      .duration(100)
      .style("opacity", .9);
    if (state_ == 'India') {
      div.html(div_html + d.State + div_end + "</div></div>" + "<button class = 'myBtn btn btn-primary' id='" + d.State + "'>District Details >></button>")
        .style("left", (d3.event.pageX) + "px")
        .style("top", (d3.event.pageY - 28) + "px");
    } else {
      div.html(div_html + d.District + div_end)
        .style("left", (d3.event.pageX) + "px")
        .style("top", (d3.event.pageY - 28) + "px");
    }
    tooltip_load()
    toolTipIsVisible()

    // added code
    d3.event.stopPropagation()
  })

  // global listener
  d3.select('body').on('click', resetTooltip)

  function resetTooltip() {
    // reset tooltip state
    div.style('opacity', 0)
    $(".tooltip1").hide()
  }

这里有一个例子:http://bl.ocks.org/jasondavies/3186840

【讨论】:

  • 所以我们没有在这里隐藏工具提示,对吧?当我再次单击工具提示时,我们只是更改了它不起作用的不透明度。 @Spark.Bao
  • 好的,我在div.style('opacity', 0)下面添加了$(".tooltip1").hide(),但是我不知道tooltip_load()toolTipIsVisible()是如何工作的,也许我可以用codepen写一个demo。 @SPL
  • 查看此演示代码:codepen.io/baurine/pen/XWWmJNr?editors=1111@SPL
【解决方案2】:

一旦你从组件中出来并且在创建新的工具提示之前,你可以使用:

Array.prototype.forEach.call(document.querySelectorAll('.d3-tip'), (t) => t.parentNode.removeChild(t));

【讨论】:

  • 您能否包含内联代码跨度,以便代码可读且可验证。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 2016-07-09
  • 2022-11-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多