質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

1回答

3506閲覧

Chart.jsを用いて表示した複数のグラフの要素をクリックすると一番最後に表示したグラフの要素に置き換えられてしまう。

MISHE

総合スコア10

Chart.js

Chart.jsは、多様なグラフを組み込めるJavaScriptのライブラリ。折れ線グラフや棒グラフ、円グラフ、レーダーチャートなどのグラフの種類が用意されています。HTML5のCanvasを用いて描画され、マークアップも分かりやすく、簡単に編集することが可能です。

Thymeleaf

Thymeleaf(タイムリーフ)とは、Java用のテンプレートエンジンで、特定のフレームワークに依存せず使用することが可能です。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2020/03/18 09:51

編集2020/03/18 09:52

前提・実現したいこと

現在Spring boot + thymeleaf + chart.jsを用いてグラフを表示するサイトを作ろうとしています。

グラフの表示は問題なくできたのですが、グラフの要素のそれぞれにクリックイベントを付けようとすると、
どこの要素をクリックしても一番最後に表示したグラフの値が参照されてしまいます。

おそらく原因はグラフを表示させる変数名が同じになっていることだと思っているのですが、
Thymeleafの事情により変数名をそれぞれ変更させることができません。

何か改善案があれば教えていただけないでしょうか。

該当のソースコード

html

1 <div th:each="chart: ${charts}"> 2 <canvas th:id="${chart.name}" width="300" height="300"></canvas> 3 4 <script th:inline="javascript"> 5 var canvas = document.getElementById(/*[[ ${chart.name} ]]*/); 6 var ctx = canvas.getContext('2d'); 7 8 var chart = new Chart(ctx, { 9 type: 'pie', 10 data: data = { 11 labels: /*[[ ${chart.label} ]]*/, 12 datasets: [{ 13 data: /*[[ ${chart.data} ]]*/, 14 }] 15 }, 16 17 options: { 18 title: { 19 display: true, 20 text: /*[[ ${chart.name} ]]*/ 21 } 22 } 23 }); 24 25 document.getElementById( /*[[ ${chart.name} ]]*/ ).onclick = function( evt ) { 26 var activePoints = chart.getElementsAtEvent( evt ); 27 if ( activePoints.length > 0 ) { 28 //get the internal index of slice in pie chart 29 var clickedElementindex = activePoints[ 0 ][ '_index' ]; 30 31 //get specific label by index 32 var label = chart.data.labels[ clickedElementindex ]; 33 34 //get value by index 35 var value = chart.data.datasets[ 0 ].data[ clickedElementindex ]; 36 37 console.log( clickedElementindex ); 38 console.log( label ); 39 console.log( value ); 40 41 } 42 } 43 44 </script> 45

html

1 <div> 2 <canvas id="type1" width="300" height="300"></canvas> 3 4 <script> 5 var canvas = document.getElementById("type1"); 6 var ctx = canvas.getContext('2d'); 7 8 var chart = new Chart(ctx, { 9 type: 'pie', 10 data: data = { 11 labels: ["1","2","3","4"], 12 datasets: [{ 13 data: [2,3,7,1], 14 }] 15 }, 16 17 options: { 18 title: { 19 display: true, 20 text: "java" 21 } 22 } 23 }); 24 25 document.getElementById("type1").onclick = function(evt){ 26 var activePoints = chart.getSegmentsAtEvent(evt); 27 28 /* this is where we check if event has keys which means is not empty space */ 29 if(Object.keys(activePoints).length > 0) 30 { 31 var label = activePoints[0]["label"]; 32 var value = activePoints[0]["value"]; 33 var url = "http://example.com/?label=" + label + "&value=" + value 34 /* process your url ... */ 35 alert(url); 36 } 37 }; 38 39 </script> 40 41 42 </div> 43 44 <div> 45 <canvas id="type2" width="300" height="300"></canvas> 46 47 <script> 48 var canvas = document.getElementById("type2"); 49 var ctx = canvas.getContext('2d'); 50 51 var chart = new Chart(ctx, { 52 type: 'pie', 53 data: data = { 54 labels: ["1,2"], 55 datasets: [{ 56 data: [5,3], 57 }] 58 }, 59 60 options: { 61 title: { 62 display: true, 63 text: "php" 64 } 65 } 66 }); 67 68 document.getElementById("type2").onclick = function(evt){ 69 var activePoints = chart.getSegmentsAtEvent(evt); 70 71 /* this is where we check if event has keys which means is not empty space */ 72 if(Object.keys(activePoints).length > 0) 73 { 74 var label = activePoints[0]["label"]; 75 var value = activePoints[0]["value"]; 76 var url = "http://example.com/?label=" + label + "&value=" + value 77 /* process your url ... */ 78 alert(url); 79 } 80 }; 81 82 </script> 83 84 </div> 85 86 87

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

Thymeleafの事情により変数名をそれぞれ変更させることができません。

きちんとControllerから別名を渡せば良いのではないかと思うのですけれど、同じ名前を渡してしまう実装を変更することはできないのでしょうか?

投稿2020/03/18 13:54

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MISHE

2020/03/19 00:52

回答ありがとうございます。 実装は変更可能なのですが、Controllerからどのようにしてjavascriptの変数を渡せばいいのでしょうか。 Thymeleafの参照でjsの変数を指定してやるとうまく動いてくれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問