🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

1回答

1612閲覧

[JS]配列を複数用意しているのですが、プルダウン変更時にセットしている配列も変更したいです。。

toyamal

総合スコア28

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2021/02/12 00:33

編集2021/02/12 04:23

前提・実現したいこと

現在、配列を3つ用意して関数内にセットしております。
プルダウンを変更した場合にセットしている配列も変更したいです。

どのような方法で実現が可能でしょうか?

▼追記
#exampleが0を選択されている場合は
var data = google.visualization.arrayToDataTable(dataset0);
#exampleが1を選択されている場合は
var data = google.visualization.arrayToDataTable(dataset1);
#exampleが2を選択されている場合は
var data = google.visualization.arrayToDataTable(dataset2);

のように
datasetの部分を変化させたいです。。

該当のソースコード

JS

1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4 5 </head> 6 <body> 7 8 <!-- グラフの描画エリア --> 9 <div id="chart_div" style="width: 100%; height: 350px"></div> 10 11 <select id="example" name="example" style="margin-bottom: 20px;"> 12 <option value="0">粒度 - 小</option> 13 <option value="1">粒度 - 中</option> 14 <option value="2">粒度 - 大</option> 15 </select> 16 <input type="hidden" class="single-slider" value="4.9" style="margin-top: 0px;" /> 17 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 18 <script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1/jquery-ui.min.js"></script> 19 <script type="text/javascript" src="https://www.google.com/jsapi"></script> 20 <script src="jRange/jquery.range.js"></script> 21 <link rel="stylesheet" href="jRange/jquery.range.css"> 22 <script type="text/javascript"> 23 // ライブラリのロード 24 // name:visualization(可視化),version:バージョン(1),packages:パッケージ(corechart) 25 google.load('visualization', '1', {'packages':['corechart']}); 26 var data; 27 28 $('.single-slider').jRange({ 29 30 from: 0, 31 to: 4.9, 32 step: 0.1, 33 scale: [0, 1, 2, 3, 4, 4.9], 34 format: '%s', 35 width: 300, 36 showLabels: true, 37 isRange: true, 38 onstatechange: function () { 39 $(".single-slider").trigger('change'); 40 } 41 }); 42 43 document.addEventListener('DOMContentLoaded', function () { 44 var dataset0=[ 45 ['Labels','data'], 46 [0.1,110], 47 [0.2,90], 48 [0.3,120], 49 [0.4,80], 50 [0.5,160], 51 [0.6,120], 52 [0.7,140], 53 [0.8,120], 54 [0.9,100], 55 [1 ,100], 56 [1.1,110], 57 [1.2,130], 58 [1.3,110], 59 [1.4,100], 60 [1.5,180], 61 [1.6,120], 62 [1.7,140], 63 [1.8,120], 64 [1.9,140], 65 [2 ,90], 66 [2.1,70], 67 [2.2,60], 68 [2.3,100], 69 [2.4,80], 70 [2.5,90], 71 [2.6,70], 72 [2.7,60], 73 [2.8,150], 74 [2.9,80], 75 [3 ,90], 76 [3.1,70], 77 [3.2,60], 78 [3.3,100], 79 [3.4,80], 80 [3.5,40], 81 [3.6,40], 82 [3.7,40], 83 [3.8,20], 84 [3.9,60], 85 [4 ,100], 86 [4.1,120], 87 [4.2,140], 88 [4.3,120], 89 [4.4,80], 90 [4.5,100], 91 [4.6,110], 92 [4.7,100], 93 [4.8,90], 94 95 ]; 96 97 var dataset1= [ 98 ['Labels','data'], 99 ["0〜0.5",500], 100 ["0.6〜1",600], 101 ["1.1〜1.5",550], 102 ["1.6〜2",700], 103 ["2.1〜2.5",400], 104 ["2.6〜3",450], 105 ["3.1〜3.5",400], 106 ["3.6〜4",200], 107 ["4.1〜4.5",400], 108 ["4.6〜5",550], 109 110 111 ]; 112 var dataset2= [ 113 ['Labels','data'], 114 ["0〜0.9",1100], 115 ["1〜1.9",1250], 116 ["2〜2.9",850], 117 ["3〜3.9",600], 118 ["4〜4.9",950], 119 120 121 ]; 122 123 124 125 // グラフを描画する為のコールバック関数を指定 126 google.setOnLoadCallback(drawChart); 127 128 129 // グラフの描画 130 function drawChart() { 131 const dataSet = google.visualization.arrayToDataTable(data); 132 // オプションの設定 133 var options = { 134 'title':'マグロ (BML) [LC]', 135 'is3D':true, 136 'chartArea': {'height': '80%', 'width': '90%'}, 137 'hAxis': { title: '測定値(LC)', 'slantedText': false}, 138 'vAxis': { title: '人数' }, 139 'legend':'left', 140 }; 141 142 143 144 // 指定されたIDの要素に棒グラフを作成 145 var chart = new google.visualization.ColumnChart(document.getElementById('chart_div')); 146 147 148 // グラフの描画 149 chart.draw(dataSet, options); 150 } 151 152 153 // select要素を取得 154 const selectElm = document.getElementById('#example'); 155 // 外側でも使うために、処理を別枠で定義 156 const changeFunc = function(){ 157 // 選択しているoptionの値を使いたい場合は、this.value 158 switch (Number(this.value)) { 159 case 0: 160 data = dataset0; 161 c 162 case 1: 163 data = dataset1; 164 165 case 2: 166 data = dataset2; 167 168 default: 169 data = dataset0; 170 } 171 }; 172 // 初期値を適用させるために、実行 173 changeFunc.call(selectElm); 174 // select要素が、変化するたびに実行される 175 selectElm.onchange = changeFunc; 176 177 178 }); 179 180 181</script> 182 183</body> 184</html> 185 186

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

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

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

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

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

miyabi_takatsuk

2021/02/12 00:39

> プルダウンを変更した場合にセットしている配列も変更したいです。 何をどうセットしたいのか具体的に記載お願いします。
toyamal

2021/02/12 00:48

#exampleが0を選択されている場合は var data = google.visualization.arrayToDataTable(dataset0); #exampleが1を選択されている場合は var data = google.visualization.arrayToDataTable(dataset1); #exampleが2を選択されている場合は var data = google.visualization.arrayToDataTable(dataset2); のように datasetの部分を変化させたいです。。
guest

回答1

0

ベストアンサー

html

1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 4<script type="text/javascript" src="https://www.google.com/jsapi"></script> 5<script type="text/javascript"> 6// 取り出したい値を外側スコープで定義しておく 7let data; 8 9// ライブラリのロード 10google.load('visualization', '1', {'packages':['corechart']}); 11 12$('.single-slider').jRange({ 13 from: 0, 14 to: 4.9, 15 step: 0.1, 16 scale: [0, 1, 2, 3, 4, 4.9], 17 format: '%s', 18 width: 300, 19 showLabels: true, 20 isRange: true, 21 onstatechange: function () { 22 $(".single-slider").trigger('change'); 23 } 24}); 25 26document.addEventListener('DOMContentLoaded', function () { 27 28var dataset0=[ 29 ['Labels','data'], 30 [0.1,110], 31 [0.2,90], 32 [0.3,120], 33 [0.4,80], 34 [0.5,160], 35 [0.6,120], 36 [0.7,140], 37 [0.8,120], 38 [0.9,100], 39 [1 ,100], 40 [1.1,110], 41 [1.2,130], 42 [1.3,110], 43 [1.4,100], 44 [1.5,180], 45 [1.6,120], 46 [1.7,140], 47 [1.8,120], 48 [1.9,140], 49 [2 ,90], 50 [2.1,70], 51 [2.2,60], 52 [2.3,100], 53 [2.4,80], 54 [2.5,90], 55 [2.6,70], 56 [2.7,60], 57 [2.8,150], 58 [2.9,80], 59 [3 ,90], 60 [3.1,70], 61 [3.2,60], 62 [3.3,100], 63 [3.4,80], 64 [3.5,40], 65 [3.6,40], 66 [3.7,40], 67 [3.8,20], 68 [3.9,60], 69 [4 ,100], 70 [4.1,120], 71 [4.2,140], 72 [4.3,120], 73 [4.4,80], 74 [4.5,100], 75 [4.6,110], 76 [4.7,100], 77 [4.8,90] 78 79]; 80 81var dataset1= [ 82 ['Labels','data'], 83 ["0〜0.5",500], 84 ["0.6〜1",600], 85 ["1.1〜1.5",550], 86 ["1.6〜2",700], 87 ["2.1〜2.5",400], 88 ["2.6〜3",450], 89 ["3.1〜3.5",400], 90 ["3.6〜4",200], 91 ["4.1〜4.5",400], 92 ["4.6〜5",550] 93]; 94 95var dataset2= [ 96 ['Labels','data'], 97 ["0〜0.9",1100], 98 ["1〜1.9",1250], 99 ["2〜2.9",850], 100 ["3〜3.9",600], 101 ["4〜4.9",950] 102]; 103 104 105// select要素を取得 106const selectElm = document.getElementById('example'); 107// 外側でも使うために、処理を別枠で定義 108const changeFunc = function(){ 109 // 選択しているoptionの値を使いたい場合は、this.value 110 switch (Number(this.value)) { 111 case 0: 112 data = dataset0; 113 case 1: 114 data = dataset1; 115 case 2: 116 data = dataset2; 117 default: 118 data = dataset0; 119 } 120}; 121 122// 初期値を適用させるために、実行 123changeFunc.call(selectElm); 124 125// select要素が、変化するたびに実行される 126selectElm.onchange = changeFunc; 127 128// グラフを描画する為のコールバック関数を指定 129google.setOnLoadCallback(drawChart); 130 131// グラフの描画 132function drawChart() { 133 134 // 配列からデータの生成⇦ここにセットしております 135 // switchで代入された変数を使って定義するように変更 136 const dataSet = google.visualization.arrayToDataTable(data); 137 138 // オプションの設定 139 var options = { 140 'title':'全体', 141 'is3D':true, 142 'chartArea': {'height': '80%', 'width': '90%'}, 143 'hAxis': { title: '値', 'slantedText': false}, 144 'vAxis': { title: '人数' }, 145 'legend':'left', 146 }; 147 148 // 指定されたIDの要素に棒グラフを作成 149 var chart = new google.visualization.ColumnChart(document.getElementById('chart_div')); 150 151 // グラフの描画 152 chart.draw(dataSet, options); 153} 154 155}); 156 157</script> 158</head> 159<body> 160 161 <!-- グラフの描画エリア --> 162 <div id="chart_div" style="width: 100%; height: 350px"></div> 163 164 <select id="example" name="example" style="margin-bottom: 20px;"> 165 <option value="0">0</option> 166 <option value="1">1</option> 167 <option value="2" selected>2</option> 168</select> 169 170</body> 171</html>

投稿2021/02/12 00:48

編集2021/02/12 04:35
miyabi_takatsuk

総合スコア9555

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

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

toyamal

2021/02/12 01:40

丁寧にご回答頂き誠にありがとうございます! 上記のソースで試したところ、以下のエラーが出てしまいます。。 Cannot read property 'arrayToDataTable' of undefined
miyabi_takatsuk

2021/02/12 01:53

arrayToDataTableがどのタイミングで生成されるか確認して、 その後にください。 > // 初期値を適用させるために、実行 > changeFunc.call(selectElm); を、 > google.setOnLoadCallback(drawChart); の後にずらせばいけるかと思いますが。
miyabi_takatsuk

2021/02/12 02:00

> arrayToDataTableがどのタイミングで生成されるか確認して、 を考慮した構文に修正しました。
toyamal

2021/02/12 02:06

ありがとうございます! 修正したところ Cannot set property 'onchange' of null こちらのエラーが表示されるようになりました。。
toyamal

2021/02/12 02:07

また、やはりCannot read property 'arrayToDataTable' of undefined のエラーが消えないです。。
miyabi_takatsuk

2021/02/12 02:08

ん? > const selectElm = document.getElementById('example'); の'example'は、ちゃんと本番用に合わせて文字列変えましたか?
miyabi_takatsuk

2021/02/12 02:10

arrayToDataTableの生成タイミングをしっかりと確認してください。 そもそも元の質問者さんの構文が動いていたかどうかも怪しくなってきてます。 元の構文は動いていたのでしょうか?
toyamal

2021/02/12 02:12

元の構文は動いておりました!
miyabi_takatsuk

2021/02/12 02:14

おそらく、 > google.load('visualization', '1', {'packages':['corechart']}); こちらは非同期です。 これの処理が完了していないと、 arrayToDataTableを使うことはできません。 なので、 google.loadが完了したタイミングで、 > google.setOnLoadCallback(drawChart) を実行しないといけません。 マニュアルに何か記載ありませんか? あと、私の回答は、質問者さんの構文を少々省略しておりますので、 まんまでは使うことはできません。
miyabi_takatsuk

2021/02/12 02:16

> 元の構文は動いておりました! であれば、 > あと、私の回答は、質問者さんの構文を少々省略しておりますので、 まんまでは使うことはできません。 これですね。 私の回答は、質問者さんの構文を省略している部分があります。 なので、私の構文+質問者さんの構文でないと動きません。 > google.load('visualization', '1', {'packages':['corechart']}); と、 各変数を定義している箇所も書かないと動きません。
miyabi_takatsuk

2021/02/12 02:19

質問者さんの構文を省略せず記載したました。
toyamal

2021/02/12 04:22

度々すみません。 現状のソースを更新してみましたどこがおかしいのでしょうか? エラーはないですが、選択時に配列が変更されません。。
miyabi_takatsuk

2021/02/12 04:27

構文の実行順が違います。 私の構文と同じ順番にしてください。
miyabi_takatsuk

2021/02/12 04:30 編集

処理の順番、それによる値の変化にしっかり注意を払って書いてください。 JavaScript他、プログラムは、"基本的"に、 上から下に処理が走ります。 質問者さんの構文では、 配列値を更新する前に、実行をしています。 私の構文のコメントアウトも読んで、処理順を意識して構文を書き直してください。
toyamal

2021/02/12 04:31

同じ順序にしますと下記のエラーが出ます。。 Uncaught TypeError: Cannot set property 'onchange' of null
miyabi_takatsuk

2021/02/12 04:32

document.addEventListener('DOMContentLoaded', function () { の中での順番を、という意味です。 その中では、私の構文と同じ順番の処理になっていません。
miyabi_takatsuk

2021/02/12 04:36

document.addEventListener('DOMContentLoaded', function () { なども含めての記載に直しました。
toyamal

2021/02/12 05:27

ありがとうございます! エラーは消えたのですが、グラフの方に反映されないようです。 google.setOnLoadCallback(drawChart);を再呼び出しするにはどうすれば良いのでしょうか?
miyabi_takatsuk

2021/02/12 08:06

それは質問要件に含まれていないと考えますので、 回答は控えます。 GoogleのそのAPIの使い方を、マニュアルを見るなどして学習してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問