現在Webページを作成しており、Ajax通信でやり取りをしたデータでHtmlの一部分を更新するというものを作成しております。
グラフAのデータを押下するとそれに基づいたデータのグラフBが別領域に表示されるという仕組みを作っている最中なのですが
canvasとscriptのタグを埋め込むためのinnerHTMLが効かずに画面が更新されません。。。
原因がわかる方がいたら回答をお願いしたいです。
現在できている段階としては
①グラフA押下でAjax通信が始まり、サーブレット側と通信をする。
②java側でグラフB表示用のHTMLを作成する
③jsp側にHTMLを返す
ここまでできています。
試してみた事は
jsp側に帰ってきた値をそのままコピーしてjsp内にベタで張り付ける
→グラフが表示される
innerHTMLで書き換える値をAjax通信で取得した値ではなくベタの文字列でやってみた
→設定した文字列に置き換わった(ここまでできていればinnerHTMLが原因ではないと思うのですが...)
innerHTMLにcanvasタグやscriptタグは使用できないなどの場合があるなら
どういうアプローチをして実現できるのかのアドバイスももらえると嬉しいです。
何か追加でほしい情報等あれば追加します。
宜しくお願い致します。
10/22追記
Html
1 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4<!DOCTYPE html> 5<html> 6<head> 7<meta charset="UTF-8"> 8<title>hogeTitle</title> 9 10<script type="text/javascript" charset="UTF-8" src="${pageContext.request.contextPath}/js/Chart.js"></script> 11<script type="text/javascript" charset="UTF-8" src="${pageContext.request.contextPath}/js/jquery-1.9.1.js"></script> 12 13<script type="text/JavaScript"> 14 // 取得してきたデータを画面に反映する 15 function setjsondata(json_key, json_value) { 16 var a = json_value; 17 document.getElementById('GraphBDiv').innerHTML = "<br />"; 18 document.getElementById('GraphBDiv').innerHTML = a; 19 } 20</script> 21 22</head> 23<body style="height: 100%; margin: 0%; background-color: #494949"> 24 25 <div style="width: 50%; height: 100%; float: left;"> 26 <table width="100%" style="margin-top: 30px;"> 27 <tr align="center"> 28 <td style="color: white; width: 70%"><%= request.getAttribute("pageTitle" )%></td> 29 <input type='hidden' id='pageDisp' value= '<%= request.getAttribute("pageTitle" )%>' > 30 <td style="color: white; width: 30%"><button type="button" class="btn" autofocus="true">グラフ切り替え</button></td> 31 </tr> 32 </table> 33 <p style="margin-top: 50px;"> 34 <canvas id="GraphA" width="600" height="500" 35 style="background-color: #494949;"></canvas> 36 </p> 37 </div> 38 39 <div style="width: 50%; height: 100%; float: right;"> 40 <div id="GraphBDiv" style="width: 100%; height: 50%;"> 41 </div> 42 <div style="width: 100%; height: 50%;"> 43 </div> 44 </div> 45 <script> 46 var ctx = document.getElementById("GraphA"); 47 var myChart = new Chart( 48 ctx, 49 { 50 type : 'bar', 51 data: { 52 labels: ["昨日", "今日"], 53 datasets: [ 54 { 55 label: "データ1", 56 borderWidth:1, 57 backgroundColor: "#EFEA5A", 58 borderColor: "#EFEA5A", 59 data: [23, 54] 60 },{ 61 label: "データ2", 62 borderWidth:1, 63 backgroundColor: "#048BA8", 64 borderColor: "#048BA8", 65 data: [25, 22] 66 }] 67 68 }, 69 options : { 70 responsive : true, 71 72 title : { 73 display : true, 74 text : 'グラフA', 75 padding : 3, 76 fontColor : "#fff", 77 fontSize: 15 78 }, 79 scales : { 80 xAxes : [ { 81 ticks : { 82 fontColor : "#fff", 83 fontSize: 15 84 }, 85 stacked : true, 86 categoryPercentage : 0.4, 87 fontSize: 15 88 } ], 89 yAxes : [ { 90 ticks : { 91 fontColor : "#fff", 92 }, 93 stacked : true, 94 fontSize: 15 95 } ] 96 }, 97 legend : { 98 labels : { 99 boxWidth : 20, 100 padding : 20, 101 fontColor : "#fff", 102 fontSize: 14 103 }, 104 display : true 105 }, 106 onClick : function(event, activeElements) { 107 if (activeElements.length) { 108 var hoge1 = "ほげ"; 109 var hoge2 = "ほげ"; 110 111 var postData = { 112 'hoge1':hoge1, 113 'hoge2':hoge2, 114 }; 115 var postUrl = "/HogeProject/Hoge(web.xmlで指定したサーブレット)"; 116 $.ajax({ 117 url: postUrl, 118 type: "POST", 119 dataType: "json", 120 data: postData, 121 success: function(json){ 122 if(json["status"] == "error"){ 123 alert(json["message"]); 124 return false; 125 } 126 for(var j in json){ 127 setjsondata(j, json[j]); 128 } 129 } 130 }); 131 } 132 } 133 } 134}); 135</script> 136 137</body> 138</html>
グラフAのデータをクリックするとグラフBが表示されるというのが期待結果です。
回答3件
あなたの回答
tips
プレビュー