d3 单击创建圆并单击删除

2023-12-04

我试图单击一个圆圈将其删除,但单击画布将创建一个圆圈。

我确实想从数据中实际删除圆圈及其对象,而不是仅仅使其透明。

单击圆圈时调用该函数

  function removeElement(d) {
    d3.select(this)
      .remove();
  }

通过单击圆圈即可调用此函数,

  .on("click", removeElement);

我认为我没有正确区分单击画布以创建不存在的圆圈和单击现有圆圈以将其删除。

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .active {
    stroke: #000;
    stroke-width: 2px;
  }
</style>
<svg width="960" height="500"></svg>
<script src="//d3js.org/d3.v4.min.js"></script>
<script>
  var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height"),
    radius = 32;

  var data = [{
      x: 100,
      y: 200
    },
    {
      x: 200,
      y: 300
    },
    {
      x: 300,
      y: 200
    },
    {
      x: 400,
      y: 300
    }
  ];

  var xScale = d3.scaleLinear()
    .domain([0, d3.max(data, function(d) {
      return d.x_pos
    })]).range([0, width]);

  svg.selectAll("circle")
    .data(data)
    .enter().append("circle")
    .attr("cx", function(d) {
      return d.x;
    })
    .attr("cy", function(d) {
      return d.y;
    })
    .attr("r", radius)
    .style("fill", "lightblue")
    .attr('id', function(d, i) {
      return 'rect_' + i;
    })
    .call(d3.drag()
      .on("start", dragstarted)
      .on("drag", dragged)
      .on("end", dragended))
    .on("click", removeElement);

  svg.on("click", function() {
    var coords = d3.mouse(this);

    var newData = {
      x: d3.event.x,
      y: d3.event.y
    };

    data.push(newData);

    svg.selectAll("circle") // For new circle, go through the update process
      .data(data)
      .enter()
      .append("circle")
      .attr("cx", function(d) {
        return d.x;
      })
      .attr("cy", function(d) {
        return d.y;
      })
      .attr("r", radius)
      .style("fill", "red")
      .attr('id', function(d, i) {
        return 'circle_' + i;
      })
      .call(d3.drag()
        .on("start", dragstarted)
        .on("drag", dragged)
        .on("end", dragended))
      .on("click", removeElement);
  })

  function dragstarted(d) {
    d3.select(this).raise().classed("active", true);
  }

  function dragged(d) {
    d3.select(this)
      .attr("cx", d.x = d3.event.x)
      .attr("cy", d.y = d3.event.y);
  }

  function dragended(d) {
    d3.select(this)
      .classed("active", false);
  }

  function removeElement(d) {
    // need to remove this object from data
    d3.select(this)
      .remove();
  }
</script>

这个问题是问题的延伸D3 删除 dblclick 上的圆圈

Thanks,


您的代码现在的问题是,如果您单击蓝色圆圈,它会删除该圆圈并创建一个新的红色圆圈。发生这种情况是因为事件向上冒泡到 SVG 父元素。

一个简单的解决方案是在removeElement功能:

d3.event.stopPropagation();

As the 文档解释说,stopPropagation...

...防止当前事件在捕获和冒泡阶段进一步传播。

这是进行了更改的代码:

<!DOCTYPE html>
<meta charset="utf-8">
<style>
  .active {
    stroke: #000;
    stroke-width: 2px;
  }
</style>
<svg width="960" height="500"></svg>
<script src="//d3js.org/d3.v4.min.js"></script>
<script>
  var svg = d3.select("svg"),
    width = +svg.attr("width"),
    height = +svg.attr("height"),
    radius = 32;

  var data = [{
      x: 100,
      y: 200
    },
    {
      x: 200,
      y: 300
    },
    {
      x: 300,
      y: 200
    },
    {
      x: 400,
      y: 300
    }
  ];

  var xScale = d3.scaleLinear()
    .domain([0, d3.max(data, function(d) {
      return d.x_pos
    })]).range([0, width]);

  svg.selectAll("circle")
    .data(data)
    .enter().append("circle")
    .attr("cx", function(d) {
      return d.x;
    })
    .attr("cy", function(d) {
      return d.y;
    })
    .attr("r", radius)
    .style("fill", "lightblue")
    .attr('id', function(d, i) {
      return 'rect_' + i;
    })
    .call(d3.drag()
      .on("start", dragstarted)
      .on("drag", dragged)
      .on("end", dragended))
    .on("click", removeElement);

  svg.on("click", function() {
    var coords = d3.mouse(this);

    var newData = {
      x: d3.event.x,
      y: d3.event.y
    };

    data.push(newData);

    svg.selectAll("circle") // For new circle, go through the update process
      .data(data)
      .enter()
      .append("circle")
      .attr("cx", function(d) {
        return d.x;
      })
      .attr("cy", function(d) {
        return d.y;
      })
      .attr("r", radius)
      .style("fill", "red")
      .attr('id', function(d, i) {
        return 'circle_' + i;
      })
      .call(d3.drag()
        .on("start", dragstarted)
        .on("drag", dragged)
        .on("end", dragended))
      .on("click", removeElement);
  })

  function dragstarted(d) {
    d3.select(this).raise().classed("active", true);
  }

  function dragged(d) {
    d3.select(this)
      .attr("cx", d.x = d3.event.x)
      .attr("cy", d.y = d3.event.y);
  }

  function dragended(d) {
    d3.select(this)
      .classed("active", false);
  }

  function removeElement(d) {
    d3.event.stopPropagation();
    // need to remove this object from data
    d3.select(this)
      .remove();
  }
</script>

PS:正如你现在可能知道的那样,我不太喜欢回答不同的同一问题中的问题(这是我总是建议OP避免的问题)。因此,我不处理数据问题,即删除与单击的元素关联的数据。你可以随时询问another问题...它是免费的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

d3 单击创建圆并单击删除 的相关文章

随机推荐

  • 我可以在 NDK 应用程序中使用本机库(安装在 Android 堆栈中)吗?

    从这篇文章 http marakana com forums android examples 49 html 我已经看到在 NDK 的帮助下构建的应用程序做了以下事情 1 gt 它编译所有c代码 在jni文件夹内 并制作保留在中的库lib
  • Laravel 雄辩查询相关表的总和

    我有一张桌子users and posts有柱子user id and 帖子浏览量 In 帖子浏览量我保留帖子显示次数的信息 现在 在查询中我想得到user总和为帖子浏览量他的所有帖子 我尝试做这样的事情 User where id gt
  • 正则表达式从字符串中提取电子邮件

    我想知道通过使用正则表达式是否可以从以下字符串中提取电子邮件 以下 RE 模式是 与所有字符串匹配 它对某些字符串效果很好 但不是全部 我想匹配与电子邮件模式匹配的所有字符串 包括所有域 例如 some url com 或 some url
  • 使用 findOne 更新 mongoDB 文档中的子字段并保存

    我正在尝试更新 mongoDB 文档中的特定子字段 并决定首先找到有问题的对象 然后保存更新的对象 由于某种原因 保存选项似乎忽略了我的更改 我的集合中有一个对象 它符合以下模式 var tschema mongoose Schema a
  • 将 mysql 查询从 php 网页保存到 excel 文件

    我在 mysql 数据库中有一个表 我想要做的是在 php 页面中 运行 select 语句并将结果输出到 excel 文件中 我看过很多教程并尝试过它们 但是这些教程将网页的内容输出到 Excel 文件中 我只想要 mysql 表数据和标
  • catch (...) 在 throw 上起作用吗?没有对象?

    当堆栈上方没有正在处理的未决异常时 C 标准规定以下代码应该发生什么 try throw catch cerr lt lt Caught exception lt lt endl 没有物体的投掷会被接住吗 来自 2003 C 标准 15 1
  • 谷歌地图显示:没有问题

    我正在尝试设置一个 Google 地图 该地图将在单击链接时显示 然后在单击另一个链接时隐藏 一切工作正常 除了当我从 display none 显示地图时 它无法正常显示 我读到有关使用 google maps event trigger
  • 字符串中的多个引号

    在Python中我将如何编写字符串 BOS 我尝试输入 BOS 但这给出了输出 BOS 在前面添加反斜杠 您可以使用三引号 BOS 你做了什么 BOS 也很好 您在输出中得到反斜杠 但它们不是字符串的一部分 gt gt gt a BOS g
  • JavaScript 日期函数在 Firefox 浏览器中返回“Date {Invalid Date}”

    面临一个问题JavaScript Date功能 returns Date Invalid Date 在 Firefox 浏览器中 但在 Google Chrome 中工作正常 My Input is new Date Sat Jan 01
  • 将velocityInView与UIPanGestureRecognizer结合使用

    我有一个自定义滑块类型的对象 我希望使其更有用 目前我使用UIPanGestureRecognizer and translationInView使其发挥作用 它工作得很好 但我想要某种速度 让它感觉更有用 我已经尝试了一些方法 但不太清楚
  • 测量线程的上下文切换时间

    我想计算上下文切换时间 并且我正在考虑使用互斥体和条件变量在两个线程之间发出信号 以便一次只有一个线程运行 我可以用CLOCK MONOTONIC测量整个执行时间和CLOCK THREAD CPUTIME ID测量每个线程运行的时间 那么上
  • 如何在 IBM MQ JMS 接口上使用 JMS 属性?

    我正在使用带有 MQ 6 0 2 的 MQ JMS 接口 似乎只支持预定义的属性 而不支持任意的属性 例如 我可以正确地getJMSCorrelationID getJMSPriority 等等 但是 当我在发件人上设置任意属性时 mess
  • 如何查看Google Play服务版本?

    在我的应用程序中 我需要检查 Google Play 服务版本 安装在用户设备中 是否可以 如果是的话 我该怎么做 我找到了简单的解决方案 int v getPackageManager getPackageInfo GoogleApiAv
  • CMSIS 库是否应该包含在版本控制中? [复制]

    这个问题在这里已经有答案了 通常 我曾经在版本控制中包含芯片供应商 ST 提供的设备特定标头和源以及 CMSIS Core 标头 数量不多 也没有更新的习惯 我使用STM32微控制器 但我不使用立方体框架 or the 标准外设库 最近 我
  • jQuery 获取 XML 中的匹配节点

    一点背景知识 我使用 XSLT 在页面上呈现一些 XML 但我们决定使其更具交互性 所以现在我正在执行 jQuery ajax 调用来返回 XML 并在 JavaScript 中解析它 我已经能够使用类似的代码从中提取特定节点 var qp
  • 为什么不能使用 Q_OBJECT 宏进行编译(链接)?

    我用 PyQt 制作了一个项目的原型并使其在那里工作 现在我尝试将其转换为 C 但遇到了一些问题 如果我不放入 Q OBJECT 宏 它会编译并运行 但如果我将其注释掉 则会出现以下错误 Undefined symbols vtable f
  • 将一组数据行绑定到 datagridview

    我尝试了以下代码 但 datagridview 中没有显示任何内容 有什么建议么 string strFilterOption dtcolnPurchaseProductExpProductNo 270 dgvProductExp Data
  • 当视图样式设置为详细信息时,如何在 Winforms ListView 中显示图标和文本?

    我只想有两列 例如 Item Value icon Gold 10 icon Silver 2 icon Iron 1 这可能吗 或者我需要为图标添加另一列吗 查看文档以了解SmallImageList of the ListView控制和
  • C语言中删除文件中的一个字符

    如何使用C程序从文件中删除几个字符 我找不到它的任何预定义函数 为了理解目的 我试图通过套接字发送一个文件 如果成功发送 N 个字节 我想从文件中删除这些字节 最后 该文件将为空 还有其他方法可以有效地做到这一点吗 谢谢 普拉迪普 如果它们
  • d3 单击创建圆并单击删除

    我试图单击一个圆圈将其删除 但单击画布将创建一个圆圈 我确实想从数据中实际删除圆圈及其对象 而不是仅仅使其透明 单击圆圈时调用该函数 function removeElement d d3 select this remove 通过单击圆圈