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

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

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

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

1999閲覧

(1)alertを入れないと正しく動作しません。(2)値の比較が一部分だけ正しくないです。

sumire_cl

総合スコア228

SharePoint

SharePointは、マイクロソフトにより開発された、ソフトウェア開発のドキュメント管理やコラボレーションを行うプラットフォームの総称です

JavaScript

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

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

1クリップ

投稿2017/07/12 01:50

編集2017/07/12 04:25

###前提・実現したいこと
各選手の成績を2016年と2017年のぶんを並べて
2017年のほうが良くなっていれば緑色
そうじゃなければ黄色
でセルを塗るようにしたいです。

成績のデータはCSVのデータにして、読み込みます。

###発生している問題・エラーメッセージ

(1)alertを出さないと色が塗られない

CheckMokuhyoのところで成績を比較して色をつけるのですが
これの前にalertを入れないと色が塗られません。
alertを入れるとちゃんと動きます。

(2)堂上選手の安打数が緑になってしまう

堂上選手の2017年の安打数は、2016年より超少ないのに
セルの色が緑色になってしまいます…。

###該当のソースコード
2017年の成績「testdata2017.txt」

"0.269","56","2" "0.320","103","1" "0.280","52","2" "0.190","19","1"

2016年の成績「testdata2016.txt」

"0.216","36","3" "0.292","175","3" "0.226","28","0" "0.254","116","6"

HTML

1<div> 2 <table border="1" cellspacing="2" cellpadding="2"> 3 <thead> 4 <tr> 5 <th>氏名</th> 6 <th></th> 7 <th>打率</th> 8 <th>安打</th> 9 <th>本塁打</th> 10 </tr> 11 </thead> 12 <tbody> 13 <tr align="right"> 14 <td rowspan="2">藤井</td> 15 <td>2017年</td> 16 <td id="K001"></td> 17 <td id="K002"></td> 18 <td id="K003"></td> 19 </tr> 20 <tr align="right"> 21 <td>2016年</td> 22 <td id="K001m"></td> 23 <td id="K002m"></td> 24 <td id="K003m"></td> 25 </tr> 26 <tr align="right"> 27 <td rowspan="2">大島</td> 28 <td>2017年</td> 29 <td id="K101"></td> 30 <td id="K102"></td> 31 <td id="K103"></td> 32 </tr> 33 <tr align="right"> 34 <td>2016年</td> 35 <td id="K101m"></td> 36 <td id="K102m"></td> 37 <td id="K103m"></td> 38 </tr> 39 <tr align="right"> 40 <td rowspan="2">亀澤</td> 41 <td>2017年</td> 42 <td id="K201"></td> 43 <td id="K202"></td> 44 <td id="K203"></td> 45 </tr> 46 <tr align="right"> 47 <td>2016年</td> 48 <td id="K201m"></td> 49 <td id="K202m"></td> 50 <td id="K203m"></td> 51 </tr> 52 <tr align="right"> 53 <td rowspan="2">堂上</td> 54 <td>2017年</td> 55 <td id="K301"></td> 56 <td id="K302"></td> 57 <td id="K303"></td> 58 </tr> 59 <tr align="right"> 60 <td>2016年</td> 61 <td id="K301m"></td> 62 <td id="K302m"></td> 63 <td id="K303m"></td> 64 </tr> 65 </tbody> 66 </table> 67</div>

JavaScript

1 var mlist = ["01", "02", "03"]; 2 3 //ファイルからデータを受け取って整形して返す 4 var trimDataFromText = function(data) { 5 var trimedDatas = []; 6 var zdatas = data.split(/\r\n|\r|\n/); 7 for (var i = 0; i < zdatas.length; i++) { 8 var _tmp = []; 9 var zdatat = zdatas[i].split(','); 10 for (var j = 0; j < zdatat.length; j++) { 11 _tmp.push(zdatat[j].replace(/^\"|\"$/g, '')) 12 } 13 trimedDatas.push(_tmp); 14 } 15 return trimedDatas; 16 } 17 18 var z2017s; 19 var z2016s; 20 21 //2017ここから 22 $.ajax({ 23 url: '/URL/testdata2017.txt', 24 success: function(data) { 25 var zdatas = trimDataFromText(data); 26 z2017s = zdatas; 27 for (var i = 0; i < zdatas.length; i++) { 28 var zdata = zdatas[i]; 29 for (var j = 0; j < mlist.length; j++) { 30 $("#K" + i + mlist[j]).html(zdata[j]); 31 } 32 } 33 } 34 }); 35 36 //2016ここから 37 $.ajax({ 38 url: '/URL/testdata2016.txt', 39 success: function(data) { 40 var zdatas = trimDataFromText(data); 41 z2016s = zdatas; 42 for (var i = 0; i < zdatas.length; i++) { 43 var zdata = zdatas[i]; 44 for (var j = 0; j < mlist.length; j++) { 45 $("#K" + i + mlist[j] + "m").html(zdata[j]); 46 } 47 } 48 } 49 }); 50 51 52 //2017>2016なら緑、じゃなければ黄色 53 function CheckMokuhyo() { 54 55 for (var i = 0; i < 4; i++) { 56 var z2017 = z2017s[i]; 57 var z2016 = z2016s[i]; 58 for (var j = 0; j < mlist.length; j++) { 59 if (z2017[j] > z2016[j]) { 60 $("#K" + i + mlist[j]).css("background-color", "lightgreen"); 61 } else { 62 $("#K" + i + mlist[j]).css("background-color", "yellow"); 63 } 64 } 65 } 66 } 67 68 alert("なんらかのメッセージ"); 69 CheckMokuhyo();

###試したこと

たぶん、ajaxでcsvファイルを読むより前にCheckMokuhyoが実行されちゃうのが悪いのかな
という気がしたので
OKFlg(初期値は0)を作って
ajaxでファイルを読むところのsuccessのところで1ずつ足して

JavaScript

1 while (OKFlg < 2) { 2 //ここにVBScriptとかにあるsleepみたいなのが書きたいです… 3 } 4 CheckMokuhyo();

みたいにしたらいいのかな、と思って
とりあえずwhile (OKFlg < 2)の中にはconsole.logでなんか出すようにしたら
終了しなくなりました…。

###補足情報(言語/FW/ツール等のバージョンなど)
IE11です。(規則でこれしか使えないので)
Windowsは7と10半々くらいです。
SharePoint Foundation 2010の中で作っています。
まえに質問したときに
「SharePointの中でしたときとそうでないときとで動作が違う」
ということがあったので
今回はSharePointの外でもやってみて、やっぱりそうなるということも確認してみました。

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

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

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

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

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

guest

回答3

0

$.whenという、「複数の非同期操作を待って実行する」関数があります(jQuery公式)。

javascript

1var ajax1 = $.ajax(/* 2016年分 */); 2var ajax2 = $.ajax(/* 2017年分 */); 3 4/* 中略 */ 5$.when(ajax1, ajax2).done(CheckMokuhyo);

投稿2017/07/12 01:56

maisumakun

総合スコア145183

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

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

sumire_cl

2017/07/12 02:13

マジで!うおお!まさにそれです!そんな関数あったんだ! ちゃんと色が塗られました。超ありがとうございます!!
guest

0

あなたの予想は正しいです。
ajaxのデータ取得は非同期に行われますので、CheckMokuhyoが先に実行され、その後にデータ取得が行われています。
ですので、データ取得完了を待ってCheckMokuhyoを実行する必要があります。
(alertがあると、そこで待機状態になるため、データ取得完了まで表示させたあとに閉じれば、適切に動いていることになるわけです)
また、2016のデータ取得と2017のデータ取得のどちらが先に完了するのかも、
実行するごとに違うことになるので、そこも考慮しなければなりません。
このあたりのjQueryでの処理順に関してはthen,when,Deferredなどを使いこなすのが美しくは有りますが、
ひとまずわかりやすく動作させるためには、

  • 両方のsuccessのコードの最後でCheckMokuhyoを呼び出す。
  • CheckMokuhyoの1回目呼び出しはもう片方のデータが足りてないのでなにもしない。
  • 2回めの呼び出しでは両方のデータが足りているので処理する。

という方針でコーディングしてはいかがでしょうか?

投稿2017/07/12 02:12

zohnam

総合スコア1441

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

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

sumire_cl

2017/07/12 05:23

ありがとうございます。 そこんとこの動作を確認したくて successのところでフラグを立てる みたいなのをやってみたのですが フラグが立つまで待つ というのをどうしたらいいのかってところが思いつきませんでした。 JavaScriptにはsleepもDoEventsもないのですね…。
guest

0

ベストアンサー

Windows7のIE11では

html

1<!doctype html> 2<html lang="en"> 3<head> 4 <meta charset="utf-8"> 5 <script src="https://code.jquery.com/jquery-2.2.4.js"></script> 6<!-- 7 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.3.2/css/onsenui.css" /> 8 <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.3.2/css/onsen-css-components.css" /> 9 <script src="https://cdnjs.cloudflare.com/ajax/libs/onsen/2.3.2/js/onsenui.js"></script> 10 <script src="https://cdnjs.cloudflare.com/ajax/libs/axios/0.16.2/axios.min.js"></script> 11 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script> 12--> 13<script> 14 var mlist = ["01", "02", "03"]; 15 16 //ファイルからデータを受け取って整形して返す 17 var trimDataFromText = function(data) { 18 var trimedDatas = []; 19 var zdatas = data.split(/\r\n|\r|\n/); 20 for (var i = 0; i < zdatas.length; i++) { 21 var _tmp = []; 22 var zdatat = zdatas[i].split(','); 23 for (var j = 0; j < zdatat.length; j++) { 24 _tmp.push(zdatat[j].replace(/^\"|\"$/g, '')) 25 } 26 trimedDatas.push(_tmp); 27 } 28 return trimedDatas; 29 } 30 31 var z2017s; 32 var z2016s; 33 34 //2017ここから 35 var _promise1 = $.ajax({ 36 url: './testdata2017.txt' 37 }) 38 .then(function(data) { 39 var zdatas = trimDataFromText(data); 40 z2017s = zdatas; 41 for (var i = 0; i < zdatas.length; i++) { 42 var zdata = zdatas[i]; 43 for (var j = 0; j < mlist.length; j++) { 44 $("#K" + i + mlist[j]).html(zdata[j]); 45 } 46 } 47 }); 48 49 //2016ここから 50 var _promise2 = $.ajax({ 51 url: './testdata2016.txt' 52 }) 53 .then(function(data) { 54 var zdatas = trimDataFromText(data); 55 z2016s = zdatas; 56 for (var i = 0; i < zdatas.length; i++) { 57 var zdata = zdatas[i]; 58 for (var j = 0; j < mlist.length; j++) { 59 $("#K" + i + mlist[j] + "m").html(zdata[j]); 60 } 61 } 62 }); 63 64 $.when(_promise1, _promise2) 65 .then(function() { 66 var jikan; 67 var jikanm; 68 69 for (var i = 0; i < 4; i++) { 70 var z2017 = z2017s[i]; 71 var z2016 = z2016s[i]; 72 for (var j = 0; j < mlist.length; j++) { 73 if (Number(z2017[j]) > Number(z2016[j])) { 74 $("#K" + i + mlist[j]).css("background-color", "lightgreen"); 75 } else { 76 $("#K" + i + mlist[j]).css("background-color", "yellow"); 77 } 78 } 79 } 80 }); 81</script> 82 83</head> 84<body> 85<div> 86 <table border="1" cellspacing="2" cellpadding="2"> 87 <thead> 88 <tr> 89 <th>氏名</th> 90 <th></th> 91 <th>打率</th> 92 <th>安打</th> 93 <th>本塁打</th> 94 </tr> 95 </thead> 96 <tbody> 97 <tr align="right"> 98 <td rowspan="2">藤井</td> 99 <td>2017年</td> 100 <td id="K001"></td> 101 <td id="K002"></td> 102 <td id="K003"></td> 103 </tr> 104 <tr align="right"> 105 <td>2016年</td> 106 <td id="K001m"></td> 107 <td id="K002m"></td> 108 <td id="K003m"></td> 109 </tr> 110 <tr align="right"> 111 <td rowspan="2">大島</td> 112 <td>2017年</td> 113 <td id="K101"></td> 114 <td id="K102"></td> 115 <td id="K103"></td> 116 </tr> 117 <tr align="right"> 118 <td>2016年</td> 119 <td id="K101m"></td> 120 <td id="K102m"></td> 121 <td id="K103m"></td> 122 </tr> 123 <tr align="right"> 124 <td rowspan="2">亀澤</td> 125 <td>2017年</td> 126 <td id="K201"></td> 127 <td id="K202"></td> 128 <td id="K203"></td> 129 </tr> 130 <tr align="right"> 131 <td>2016年</td> 132 <td id="K201m"></td> 133 <td id="K202m"></td> 134 <td id="K203m"></td> 135 </tr> 136 <tr align="right"> 137 <td rowspan="2">堂上</td> 138 <td>2017年</td> 139 <td id="K301"></td> 140 <td id="K302"></td> 141 <td id="K303"></td> 142 </tr> 143 <tr align="right"> 144 <td>2016年</td> 145 <td id="K301m"></td> 146 <td id="K302m"></td> 147 <td id="K303m"></td> 148 </tr> 149 </tbody> 150 </table> 151</div> 152</body> 153</html>

で動きました。
Promise使うといい感じに出来ます。
あと2)に関しては文字列比較をしてるからなので数値変換すればOK

投稿2017/07/12 02:17

編集2017/07/12 02:31
rururu3

総合スコア5545

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

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

sumire_cl

2017/07/12 02:34

ありがとうございます! …さきほど教えていただいたやつは whenの後ろは.doneだったのにこれは違う??thenって何? http://qiita.com/varmil/items/269496d3be071a297d76#then-%E3%81%A8-done-%E3%81%AE%E4%BD%BF%E3%81%84%E5%88%86%E3%81%91 「.then()と.done()は後続処理がチェーンするときの動作の順番が違う」 というのが違いで 今回みたいな後続処理が1個しかない場合はどっちでも変わらなくてオッケー ということであっていますでしょうか? そしてPromiseって何かというのは今から調べます…。
sumire_cl

2017/07/12 02:45

つまり(2)のほうは if (z2017[j] > z2016[j]) のところを if (+z2017[j] > +z2016[j]) ですね。 …もしかしてこの文字列を数値に変換するやりかたは行儀が悪かったりしますか?
rururu3

2017/07/12 02:47

thenとdoneの違い、ちゃんとは知ってませんが、thenでdoneの処理関数を呼び出す感じなので、ほぼ同じなのですが、thenでは引数多いのとPromiseを返すので引き続き処理できるのと状態変更できるだった気がします・・・ http://www.jquerystudy.info/reference/deferred/then.html
rururu3

2017/07/12 02:53

JavaScriptでは数値変換手法がいっぱいあるのでなんとも言えませんが、- 0するのがいいっていうのを見たことがあるので私はそうしてます。(解答ではわかりやすいようにNumber関数使っていますが)
sumire_cl

2017/07/12 03:01

-0… こうですか? if (z2017[j]-0 > z2016[j]-0)
sumire_cl

2017/07/12 05:27

ありがとうございます。 数値変換どれが正解ってことよりも あとから他人が見たときにこれ数値変換だってわかることがだいじなのですね。 そしてPromiseってなんだろうと知らべていたらDefferedも出てきて混乱中です。 たぶん改めて質問すると思います。そのときもよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問