• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

ChartJs - klikalny label

VPS Starter Arubacloud
+2 głosów
151 wizyt
pytanie zadane 17 lutego 2021 w JavaScript przez Sebastian Szyja Bywalec (2,810 p.)
edycja 18 lutego 2021 przez Sebastian Szyja

Witajcie :)

Napotkałem mały problem :( Mam taki wykres:

I potrzebuję żeby po kliknięciu w "nr boczny 001" pokazał się alert "nr boczny 001" i tak z każdym. Zrobiłem, że gdy klika się w pasek np. czerwony albo niebieski to pokazuje mi jaka jest to etykieta ale niestety zależy mi na tym, aby po kliknieciu w label uzyskać taką informację :((

Pomożecie?

Oto kodzik:

var ajax = new XMLHttpRequest();
        ajax.open("GET", "include/get/getStatistics.php", true);
        ajax.send();
        ajax.onreadystatechange = function () {
            if (this.readyState == 4 && this.status == 200) {
                var data = JSON.parse(this.responseText);
                var barChart = document.getElementById('barChart1').getContext('2d');
                var myBarChart = new Chart(barChart, {
                    type: 'horizontalBar',
                    data: {
                        labels: data.forklift_numerBoczny,
                        datasets : [{
                            label: "Wykorzystane mth",
                            backgroundColor: 'rgb(23, 125, 255)',
                            borderColor: 'rgb(23, 125, 255)',
                            data: data.forklift_wartosc,
                        },{
                            label: "Limit miesięczny",
                            backgroundColor: 'rgb(228, 4, 4)',
                            borderColor: 'rgb(228, 4, 4)',
                            data: data.forklift_annualLimitOfEngineHours,
                        }],
                    },
                    options: {
                        responsive: true, 
                        maintainAspectRatio: false,
                        onClick: function (e) {
                        var activePointLabel = this.getElementsAtEvent(e)[0]._model.label;
                        alert(activePointLabel);
                    },
                        scales: {
                            yAxes: [{
                                ticks: {
                                    beginAtZero:true
                                }
                            }]
                        },
                        legend: {
                            display: false
                         },
                        tooltips: {
                             enabled: true,
                            showAllTooltips: true,
                        }
                    }
                });
                }
            }

 

komentarz 17 lutego 2021 przez ScriptyChris Mędrzec (190,190 p.)

Czy po kliknięciu w label metoda onClick z 27 linii jest wołana? Jeśli tak, to jaka wartość jest w zmiennej activePointLabel?

komentarz 17 lutego 2021 przez Sebastian Szyja Bywalec (2,810 p.)

Wartość w zmiennej activePointLabel jeżeli kliknę na pasek niebieski/czerwony przy nr boczny 1 to nr boczny 1

komentarz 17 lutego 2021 przez ScriptyChris Mędrzec (190,190 p.)
A jaka tam jest wartość, gdy klikniesz w labelkę?
komentarz 17 lutego 2021 przez Sebastian Szyja Bywalec (2,810 p.)

Mam takie coś :)

komentarz 17 lutego 2021 przez ScriptyChris Mędrzec (190,190 p.)

Ale ja pytam co się dzieje w funkcji, a nie w UI. :)

Zamień linijki 28 i 29 ze swojego skryptu na poniższe:

console.log('e:', e, ' /this.getElementsAtEvent(e):', this.getElementsAtEvent(e));

var activePointLabel = this.getElementsAtEvent(e)[0]._model.label;

console.log('activePointLabel:', activePointLabel);
alert(activePointLabel);

i sprawdź co pokazuje konsola przeglądarki, gdy klikniesz w labelkę po lewej stronie słupków na wykresie (np. na napis "nr boczny 001")? Ewentualnie: czy są tam jakieś błędy?

1
komentarz 17 lutego 2021 przez Sebastian Szyja Bywalec (2,810 p.)
edycja 17 lutego 2021 przez Sebastian Szyja

Błąd :((

1 odpowiedź

+1 głos
odpowiedź 17 lutego 2021 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 22 lutego 2021 przez Sebastian Szyja
 
Najlepsza

Błąd z konsoli świadczy o tym, że funkcja do obsługi kliku jest wołana, ale metoda getElementsAtEvent zwraca pustą tablicę (nie ma nic pod zerowym indeksem), więc próba odczytu property _model.label rzuca błędem.

Testując demo z dokumentacji zauważyłem, że w prototype this wewnątrz onClick jest metoda getElementsAtXAxis, która zwraca dane dla klikniętego słupka na osi (może Ci to wystarczy), ale nie widzę analogicznej dla osi Y.

Można próbować ratować się samodzielnie namierzając słupek relatywnie do klikniętego obszaru. Property this.scale zwraca obiekt z osiami wykresu x-axis-0 oraz y-axis-0 (przynajmniej dla wykresu dwu osiowego). Tam można odczytać lokalizację oraz wymiary osi (X lub Y) i porównać je ze współrzędnymi dostępnymi z eventu, który przyszedł jako argument do onClick.

Podobne pytania

0 głosów
1 odpowiedź 77 wizyt
pytanie zadane 15 sierpnia 2023 w JavaScript przez warzywko13 Użytkownik (840 p.)
0 głosów
1 odpowiedź 319 wizyt
pytanie zadane 7 kwietnia 2020 w C i C++ przez Robot 12 Początkujący (340 p.)
0 głosów
0 odpowiedzi 544 wizyt
pytanie zadane 29 listopada 2020 w C i C++ przez jakis111 Nowicjusz (210 p.)

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,309 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...