D3.select не работает?

Я использую d3, пытаясь изменить свойства в графе c3, единственный способ обнаружить элемент - это его свойство css: "text.c3-chart-arcs-title". На странице есть два элемента со свойством css, и функция вызывается 2 раза, чтобы добраться до обоих элементов. Мой код:

if (d3.select("text.c3-chart-arcs-title")){
       let vari = d3.select("text.c3-chart-arcs-title");
       console.info("got here");
       vari.attr("id", "title" + name); //name is a variable that must be different between both elements
       vari.attr("class", "substitute"); //I replace the css to be able to get to the second graph
                }

Однако только первый элемент затронут моим изменением, второй - нет, хотя я дважды «попал сюда», что означает обнаружение второго элемента.

Примечание. Я буду использовать эти два компонента позже, используя:

$("#title" + name).css('cursor', 'pointer')
                    .click(function () {
                        //function using variables of each component 1 and 2 previously selected 
                        }
                    });

Подскажите, пожалуйста, что я сделал не так и как получить доступ ко второму элементу? Спасибо за помощь,

«Однако только первый элемент затронут моим изменением, второй - нет, хотя я дважды« попал сюда », что означает обнаружение второго элемента». ... Нет, это не так: вы просто выбираете первый дважды. Просто используйте selectAll: jsfiddle.net/vhxrou8o
Gerardo Furtado 20.04.2018 15:54

@GerardoFurtado Спасибо за ваш ответ, однако я не могу использовать SelectAll, так как мне нужны разные имена для идентификатора (который я использую впоследствии), а имя зависит от параметров, вызываемых в функции (которую я вызываю дважды). У меня вопрос: класс "text.c3-chart-arcs-title" заменен классом "substitute", поэтому логически он не будет обнаружен во второй раз.

Jean 20.04.2018 16:47

Для правильной помощи отправьте сообщение минимальный воспроизводимый пример. Если это функция, которую вы вызываете дважды (это не совсем ясно в вашем коде), она изменит класс обоих элементов: jsfiddle.net/c5yqop10

Gerardo Furtado 20.04.2018 17:02

@GerardoFurtado Я добавил другой код (я не ставил его раньше, потому что он не имеет отношения к проблеме). да, я не против изменить оба класса. Мне нужно: 1 / определить первый элемент и дать ему идентификатор, который будет обнаружен позже для функции. 2 / Затем второй раз обнаруживаем второй элемент, назначаем другой идентификатор и выполняем обработку для второго элемента.

Jean 20.04.2018 17:11
Поведение ключевого слова "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
4
306
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Если я правильно понимаю, у вас есть некоторые уже существующие элементы, которые имеют один и тот же класс и надеются назначить им новые идентификаторы на основе их порядка в DOM.

У вас есть только два элемента, но по сути вы выполняете цикл для выбора каждого элемента по отдельности. На самом деле это не «способ d3», циклы не нужны для многих общих задач с d3.

Выберем сразу все диаграммы и назначим новые свойства сразу всем элементам. Это можно сделать двумя способами:

  • назначить новый идентификатор на основе индекса каждого элемента
  • назначить новый идентификатор на основе данных, которые мы привязываем к выбранным элементам

Первый метод довольно прост:

// select all charts and give them an id based on their index:
d3.selectAll(".chart")
  .attr("id", function(d,i) { return "Chart"+i; });
  
// adding buttons for demonstration:
d3.select("body").selectAll(null)
  .data([0,1,2])
  .enter()
  .append("p")
  .style("cursor","pointer")
  .text(function(d) { return "Chart:" + d; })
  .on("click", function(d) {
    d3.selectAll(".chart")
      .style("background-color","white");
    d3.select("#Chart"+d)
      .style("background-color","yellow");
  });
.chart {
  padding: 20px;
  display: inline-block;
  border: 1px dotted #ccc;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>

<div class = "chart">This is Chart 1</div>
<div class = "chart">This is Chart 2</div>
<div class = "chart">This is Chart 3</div>

<p> Select a div: </p>

Но таков и второй метод, который также позволяет вам легко указывать конкретные имена для ваших диаграмм:

// deterimne some id's beforehand
var names = ["Chart1","Chart2","Chart3"];

// select all charts and bind the id array to it
// then set the id of each chart based on the bound data:
d3.selectAll(".chart")
  .data(names)
  .attr("id", function(d) { return d; });
  
// and buttons for demonstration:  
d3.select("body").selectAll(null)
  .data(names)
  .enter()
  .append("p")
  .style("cursor","pointer")
  .text(function(d) { return d; })
  .on("click", function(d) {
    d3.selectAll(".chart")
      .style("background-color","white");
    d3.select("#"+d)
      .style("background-color","yellow");
  });
.chart {
  padding: 20px;
  display: inline-block;
  border: 1px dotted #ccc;
}
<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>

<div class = "chart">This is Chart 1</div>
<div class = "chart">This is Chart 2</div>
<div class = "chart">This is Chart 3</div>

<p> Select a div: </p>

Ваш подход может работать, он поверхностно модифицирован ниже (что делает проблему, заявленную в вопросе, невоспроизводимой, но это немного проблема x, y, поскольку ваша проблема, вероятно, действительно заключается в том, как достичь результата ("как получить доступ ко второму элементу"), а не что неверен с кодом), но выбранный вами подход немного выходит за рамки обычного подхода d3. Вот ваш код, работающий по назначению:

var names = ["chart2","chart1"]

function test() {

  if (d3.select(".chart")){
       let vari = d3.select(".chart");
       console.info("got here");
       vari.attr("id", names.pop()); 
       vari.attr("class", "substitute"); //I replace the css to be able to get to the second graph
                }
}

test();
test();

d3.select("#chart1")
  .style("border","1px solid black");
  
d3.select("#chart2")
  .style("background-color","#ccc");
<script src = "https://cdnjs.cloudflare.com/ajax/libs/d3/4.10.0/d3.min.js"></script>

<div class = "chart">Chart 1</div>
<div class = "chart">Chart 2</div>

По моему скромному мнению, это проблема XY, которая будет разворачиваться вечно .... Но давайте посмотрим, что произойдет.

Gerardo Furtado 21.04.2018 02:32

@GerardoFurtado, да, не знаю, почему я застрахован от этого, это проблема xy. Неканонический подход в вопросе слишком сильно на меня повлиял, и мне пришлось выбросить альтернативный путь к цели.

Andrew Reid 21.04.2018 02:57

спасибо @AndrewReid за ответ, я обнаружил, что с моим кодом все в порядке, в итоге я использовал SelectAll

Jean 23.04.2018 15:12

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