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

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

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

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

jQuery

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

Ajax

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

Q&A

解決済

1回答

2814閲覧

月繰りカレンダーで、「Ajaxリクエストで取得した特定の値が存在する月で、直近のもの」をデフォルト表示月にしたい

mcperry

総合スコア9

JavaScript

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

jQuery

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

Ajax

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

0グッド

0クリップ

投稿2015/07/04 12:21

こんにちは。

Webページ内に月繰りカレンダーを表示させ、その中の日付欄にそれぞれAjaxリクエストによって外部APIから取得した値を表示させようとしています。

リクエストの結果、各々の日付に対して1つ、A, B, C のいずれかが返ってきます。
ここでデフォルトでの表示月を「Aが存在する直近の月」にしたいのですがうまいやり方がわかりません。。
「月ごとのリクエストを送り、Aが存在する月を見つけたらそこをデフォルトの表示月にする」という考え方で可能かと思うものの、具体的な方法が思いつかない次第です。
あるいはもっと良いやり方がありますでしょうか?

下記の要領で、現在の年月をデフォルト月として表示することには成功しています。
コード中”min”の部分を current_ym でなく”Aが存在する直近の年月”にできれば良いかと思っております。

lang

1var current_ym = new Date((new Date).getFullYear(), (new Date).getMonth(), 1); 2var min = dateFormat(current_ym, 'api'); 3var max = dateFormat(new Date(current_ym.getFullYear(), current_ym.getMonth() + 1, 1), 'api'); 4var query = 'date_min=' + min + '&date_max=' + max; 5$.ajax({ 6 url: api_url + '?' + query, 7 dataType: 'json', 8 success: function(result_json) { 9 date_html(result_json); //結果用html 10 }, 11 error: function() { 12 } 13}); 14 15function dateFormat(date, type) { 16 var year = date.getFullYear(); 17 var month = date.getMonth() + 1; 18 var day = date.getDate(); 19 var hour = date.getHours(); 20 var min = date.getMinutes(); 21 month = ('0' + month).slice(-2); 22 day = ('0' + day).slice(-2); 23 hour = ('0' + hour).slice(-2); 24 min = ('0' + min).slice(-2); 25 var result = ''; 26 if (type == 'api') { 27 // api 用のフォーマット 28 result = year + month + day + '0000'; 29 } else { 30 // 表示用のフォーマット 31 result = year + delimiter + month; 32 } 33 return result; 34}

api_url?date_min=min&date_max=maxにおいて、
minからmaxの間の日付でリクエストを送ることが可能となっています。

アドバイスのほどよろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

一番良いのは、「指定した日付の直近でAが存在する月」を返すAPIを作って
それを使うことのようにも思いますが、外部APIなので難しい、
というところでしょうか。

現状のAPIのままで実現するなら、以下のイメージでどうでしょうか。

案1(見つかるまでajax通信)

修正前

lang

1 success: function(result_json) { 2 date_html(result_json); //結果用html 3 },

修正後

lang

1 success: function(result_json) { 2 if(containsA(result_json)) { // TODO: containsAは、指定したjsonにAが含まれているかを判定する関数として実装する。 3 date_html(result_json); //結果用html 4 else { 5 // TODO: 月を一月進めて、再度APIをajaxで呼び出す。 6 } 7 },

この先Aが存在しない場合、というのも考慮が必要そうですが。

案2(まとめて取得し、必要な部分を再取得または絞り込み)

api_url?date_min=min&date_max=max
という形で指定できるのであれば、調べたい範囲(例えば6カ月分)をしていして、
その結果のjsonを解析して、それが何月かを調べることや、
さらにその結果をjavascript側で絞り込むことも、
できるのではないでしょうか?

そうすれば、
(1) Aがあるか調べたい期間を指定してajax呼び出し
(2) (1)の結果からAを含む月を見つけ、ajax呼び出し
の2回か、あるいは、
(1) Aがあるか調べたい期間を指定してajax呼び出し
その結果をjavascirpt側でAを含む直近の月だけに絞り込んで、 date_htmlに渡す。
の1回のajax呼び出しでも、結果を得ることができそうです。

投稿2015/07/04 14:29

編集2015/07/05 04:21
eripong

総合スコア1546

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

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

mcperry

2015/07/05 03:46

早速の回答ありがとうございます。 なるほど、successの中でさらにリクエストするということですね。 となると、月を進めるごとにajax()がどんどんネストされていくイメージでしょうか? 仮に6ヶ月分調べたい場合には、6回ajaxリクエストを送ることになりますか? 見当違いのことを言っていたらすみません。。 よろしくお願いします。
eripong

2015/07/05 04:22 編集

そうですね。 仮に6ヶ月分調べたい場合には、6回ajaxリクエストを送ることになります。 ただ、ajaxは非同期と思うので、スタックが積み重なるという意味でのネストには ならないと思います。 ちょっと見落としていたのですが、 api_url?date_min=min&date_max=max という形で期間指定できるのですね。 それを使った案を、回答に追記しておきました。
mcperry

2015/07/06 01:08

eripongさま 理解いたしました。一定期間分まとめて取得してから処理していくという発想がありませんでした…ありがとうございます。 これで見通しが立ったので進めていけそうです。 丁寧なご回答、感謝いたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問