【问题标题】:Interaction with updated/entered elements与更新/输入元素的交互
【发布时间】:2017-04-01 22:11:08
【问题描述】:

我想知道如何在 D3.js 中解决这个问题。下面的代码每 5 秒进入、更新或退出,并显示或消失随机数的 name 元素,这些元素是数组 dataset 的一部分。该数组还包含id 元素。现在我想单击屏幕上出现的更新元素,例如"foo",并希望它是id(这意味着1)在我单击"foo"element 后出现。该函数的名称称为testfunction,但我认为该函数有问题。问题是,原来的name文字在点击后全部消失,而新的id文字出现了。但我希望他们在使用clickfunction 后都出现在屏幕上希望你们中的一些人能提供帮助。谢谢

  var svg = d3.select("body").append("svg");

  var dataset = [{
  name: "foo", id: "1" 
}, {
  name: "bar",  id: "2"
}, {
  name: "baz", id: "3"
}, ];

        print(dataset);

        setInterval(() => {
          var data = dataset.slice(Math.random() * 6);
          print(data);
        }, 7000);

        function print(data) {

            var texts = svg.selectAll(".texts")
                .data(data);

            textsExit = texts.exit().remove();

            textsEnter = texts.enter()
                .append("text")
                .attr("class", "texts");

            textsUpdate = texts.merge(textsEnter)
                .attr("x", 10)
                .attr("y", (d, i) => 20 + i * 16)
                .text((d,i) => "TextNumber" + (i+1) + ", name: " + d.name)
                .on("click", testfunction);

    function testfunction(){

                    textsUpdate
                    .attr("x", 200)
                    .attr("y", function(d, i) { return (490 + i * 28)})
                    .text(function(d, i) { return "IDNumber" + (i+1) + ", Name: "+ d.id})



                    };


        }

【问题讨论】:

  • 只是目测,我怀疑该行应该是.on("click", testfunction);,但我不保证
  • 你是def。对了。我只是稍微编辑了一下代码和描述,因为还是有问题。非常感谢,卢卡斯!

标签: javascript jquery d3.js svg enter


【解决方案1】:

如果我正确理解您的问题,这里的问题是您正在更改 textsUpdate 属性,这当然会更改 textsUpdate 的文本位置(它们不会消失 ,不过)。

一个解决方案是创建另一个文本元素:

var svg = d3.select("body").append("svg");

var dataset = [{
  name: "foo",
  id: "1"
}, {
  name: "bar",
  id: "2"
}, {
  name: "baz",
  id: "3"
}, ];

var testText = svg.append("text")
    .attr("x", 100)
    .attr("y", 100);

print(dataset);

setInterval(() => {
  var data = dataset.slice(Math.random() * 6);
  print(data);
}, 7000);

function print(data) {

   testText.text("");

  var texts = svg.selectAll(".texts")
    .data(data);

  textsExit = texts.exit().remove();

  textsEnter = texts.enter()
    .append("text")
    .attr("class", "texts");

  textsUpdate = texts.merge(textsEnter)
    .attr("x", 10)
    .attr("y", (d, i) => 20 + i * 16)
    .attr("cursor", "pointer")
    .text((d, i) => "TextNumber" + (i + 1) + ", name: " + d.name)
    .on("click", function(d, i) {
      testfunction(d, i);
    });

  function testfunction(data, index) {

    testText.text(function() {
        return "IDNumber" + (index + 1) + ", Name: " + data.id
      })

  };

}
<script src="https://d3js.org/d3.v4.js"></script>

【讨论】:

  • 谢谢杰拉尔多。这很好,但我的目标是,新文本也每次都会更新。这意味着当我单击"foo" 时,只会出现"1"。当我点击"bar"。那么只有"2" 应该出现并且"1" 应该消失。这就是我尝试在testfunction 中使用textsUpdate 的原因。
  • 检查新的 sn-p。这是你想要的吗?
  • 您一如既往地帮了大忙!谢谢
  • 你能解释一下你在用testText.text("");做什么吗?为什么要使用该行创建一个空文本元素?
  • 只是为了删除前面的文字。
猜你喜欢
  • 2020-03-25
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多