Как я могу переключить значение текстового элемента svg с помощью D3.js, когда пользователь щелкает текст?

Я только начал изучать D3.js и написал небольшую программу для проверки некоторых идей, которые я планирую реализовать в более крупной программе. Ссылаясь на код здесь, начальное значение текста равно 0. Я пытаюсь, чтобы значение переключалось между 1 и 0, когда пользователь нажимает на текст. Что-то не так с тем, что я закодировал в .on("click"...), потому что текст не меняется на 1. Что я делаю неправильно?

Я нашел примеры обновления .attr, но ничего не могу найти о переключении .text нужным мне образом.

            var txt1 = g.append("text")
                        .attr("id", "txt1")
                        .text("0")
                        .attr("x", 10)
                        .attr("y", 17)
                        .attr("font-family", "Arial")
                        .attr("font-size", "12")
                        .attr("fill", "black")   
                        .on("click", function(){
                            if (d3.select(this).text === "0"){
                                d3.select(this).text("1")
                            }
                            else{
                                d3.select(this).text("0");
                            }
                        } )

Когда я нажимаю на текстовый элемент в первый раз, я ожидаю, что он изменится на «1».

чтобы получить ценность, вы должны вызвать .text(), а не просто .text

Coderino Javarino 28.05.2019 20:14
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
169
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы получить текстовое содержимое элемента SVG напрямую, вы можете использовать textContent или innerHTML в современных браузерах. Например:

var svg = d3.select("svg")
var txt1 = svg.append("text")
  .text("0")
  .attr("x", 10)
  .attr("y", 20)
  .on("click", function() {
    console.info(this.textContent)
  })
<script src = "https://d3js.org/d3.v5.min.js"></script>
<svg></svg>

Однако, поскольку вы используете Выбор D3, а не узел SVG, вы должны использовать text в качестве геттера, то есть text(). Кстати, внутри text() используется textContent:

export default function(value) {
  return arguments.length
      ? this.each(value == null
          ? textRemove : (typeof value === "function"
          ? textFunction
          : textConstant)(value))
      : this.node().textContent;
}

Наконец, вам не нужен этот блок if. Чтобы переключаться между 0 и 1, просто выполните:

this.textContent = 1 - (+this.textContent);

Вы даже можете отказаться от унарного плюса, так как строка все равно будет преобразована в число:

this.textContent = 1 - this.textContent;

Вот фрагмент:

var svg = d3.select("svg")
var txt1 = svg.append("text")
  .text("0")
  .attr("x", 10)
  .attr("y", 20)
  .on("click", function() {
    this.textContent = 1 - (+this.textContent);
  })
<script src = "https://d3js.org/d3.v5.min.js"></script>
<svg></svg>

Другие вопросы по теме