代码之家  ›  专栏  ›  技术社区  ›  Loredra L

如果我遵循正常的D3方式,是否会将eventListener添加到每个SVG元素?

  •  7
  • Loredra L  · 技术社区  · 8 年前

    d3中处理onclick的正常方法是

    selection.append(element)
        .on("click", someFunction)
    

    如果我在1000个svg元素上这样做,是否意味着我只附加了1000个不同的监听器。如果是这种情况,d3是否有专门的事件委派?

    3 回复  |  直到 8 年前
        1
  •  8
  •   Gerardo Furtado    8 年前

    @AlexW answer 是否(部分)正确:D3中没有事件委派,只有事件绑定。

    然而,我说 部分地 因为这样说更好 “没有 出生地的 D3中事件委派的方法“ ,因为实际上它很容易实现: 丑陋的 使用D3进行事件委派的替代方法包括使用 d3.event.target .

    例如,在这个非常简单的演示中,我们绑定这些数据。。。

    var data = ["foo", "bar", "baz"];
    

    ... 到 <g> 要素然后,我们将一个事件侦听器绑定到该组,并在单击时获取每个圆的基准:

    g.on("click", function() {
      console.log(d3.select(d3.event.target).datum())
    })
    

    这是:

    var svg = d3.select("svg");
    var g = svg.append("g");
    var data = ["foo", "bar", "baz"];
    var circles = g.selectAll(null)
      .data(data)
      .enter()
      .append("circle")
      .attr("cy", 40)
      .attr("cx", function(_, i) {
        return 50 + 100 * i
      })
      .attr("r", 20)
      .attr("fill", "teal");
    
    g.on("click", function() {
      console.log(d3.select(d3.event.target).datum())
    })
    <script src="https://d3js.org/d3.v4.min.js"></script>
    <svg></svg>

    这种方法的好处在于,就像jQuery事件委托一样,它可以处理创建的元素 在侦听器之后 已定义。在以下演示中,红色圆圈:

    var svg = d3.select("svg");
    var g = svg.append("g");
    var data = ["foo", "bar", "baz"];
    var circles = g.selectAll(null)
      .data(data)
      .enter()
      .append("circle")
      .attr("cy", 40)
      .attr("cx", function(_, i) {
        return 50 + 75 * i
      })
      .attr("r", 20)
      .attr("fill", "teal");
    
    g.on("click", function() {
      console.log(d3.select(d3.event.target).datum())
    });
    
    g.append("circle")
      .attr("cy", 40)
      .attr("cx", 275)
      .attr("r", 20)
      .attr("fill", "firebrick")
      .datum("foobar")
    <脚本src=”https://d3js.org/d3.v4.min.js“></script>
    <svg></svg>

    因此,尽管D3没有用于事件委派的本地显式方法,但解决方案非常简单明了。

        2
  •  3
  •   Alex W    8 年前

    是,这将添加1000个事件侦听器:

    添加或删除侦听器 到每个选定元素 对于指定的 事件类型名称。

    https://github.com/d3/d3-selection/blob/master/README.md#selection_on

    如果有1000多个元素,您可能不想使用SVG,因为DOM很容易被这么多的元素困住。使用画布等可能更有效。

    D3不做事件委派,它只做事件绑定。因此,您可能希望实现委托 using jQuery or vanilla JS ,如果您仍在考虑使用SVG。

        3
  •  0
  •   Community Mohan Dere    6 年前

    下面是d3 svg事件委派实现: d3-delegation . 您可以通过以下方式下载节点模块: npm i --save d3-delegation .

    Click me 到演示。