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

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

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

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

Q&A

解決済

2回答

518閲覧

日付の差分を出すときにFROM TOで-にならないようにしたい

tarataia

総合スコア17

JavaScript

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

0グッド

0クリップ

投稿2019/08/23 06:30

編集2019/08/23 07:05

#実現したいこと
じゃらんのカレンダーのようなFROMで指定した日よりも前の日付を選択できないものを製作したいのですがうまくいかなくて困っています。
なるべくjqueryを導入せずに素のjavascriptのみで作成したいのでできればDatepickerなどの外部プラグインではなくinput type=dateの日付からでてくるカレンダーを使いたいと考えています
#発生している問題・エラーメッセージ
特にエラー等は起きておらずコードが機能しない状態です
##概要のソースコード
【index.html】

<tr> <th class="kikanDaimei" style="font-size:18px" height="30;">期&emsp;間</th> <td colspan="3"> <input id="dateA" name="DEADLINE01" type="date" value=''> <b>~</b> <input id="dateB" name="DEADLINE02" type="date" value=''> <b style="font-size:16px" class="NISU">日数</b> <input id="date3" size="10"name="DEADLINE03"type="text"> </td> </tr>

【javascript】

    document.querySelector('input[type="date"]').addEventListener('click', function(){   var inputText = document.getElementById('dateA').value   document.getElementById('dateB').min = inputText;  })      function onblurA(){ document.getElementById("dateA").onblur = function(){ var date01 = document.getElementById("dateA").value; var date02 = document.getElementById("dateB").value; var diff = getDiff(date01, date02);   document.getElementById("date3").value = diff;    }    }    function onblurB(){  document.getElementById("dateB").onblur = function() { var date01 = document.getElementById("dateA").value; var date02 = document.getElementById("dateB").value; var diff = getDiff(date01, date02); document.getElementById("date3").value = diff; } } var getDiff = function(date1Str, date2Str) {  var date1 = new Date(date1Str);  var date2 = new Date(date2Str);  var msDiff = date2.getTime() - date1.getTime(); //getTimeメソッドで経過ミリ秒を取得し、2つの日付の差を求める  var daysDiff = Math.floor(msDiff / (1000 * 60 * 60 * 24)); //求めた差分(ミリ秒)を日付へ変換  return ++daysDiff; // 差分へ1日分加算して返却 } onblurA(); onblurB();

##試したこと

var date = new Date(); document.getElementById('dateA').min = new Date(new Date().getTime() - new Date().getTimezoneOffset() * 60000).toISOString().split("T")[0];

この方法であれば前日以前の日付を入力できなくなることを確認していますが後から記載できなくなるのはよくなかったのでできませんでした。

    document.querySelector('input[type="date"]').addEventListener('click', function(){  var inputText = document.getElementById('dateA').value;  document.getElementById('dateB').min = inputText; })

addEventListenerを使う方法やgetElementIdを使う方法などいろいろ試しては見ましたがどれも上手くいきませんでした。
動作環境はchromeで、他のIEやFirefoxなどでは使わない前提なのでできれば素のjavascriptでどうにかしたいのですが難しいでしょうか?

追記

google apps scriptのwedアプリ作成で作成しています

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

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

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

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

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

m.ts10806

2019/08/23 06:34

>コードが機能しない というのはどうなっているのでしょうか。
tarataia

2019/08/23 06:39

デバックでみた時にエラーなどはでないですが、コード自体もなんの効力もない状態です クリックした時にinput="date" のdateAの値をとってきてdatteBはdateAよりも前の日時がクリックできないような状態にしたいと考えています
m.ts10806

2019/08/23 06:40

tr、tdはなくてもかまわないのでしたら現在のコードから外しておいてもらえたらと。
m.ts10806

2019/08/23 06:42

というかエラー出てますね。 1つ目のdateでUncaught TypeError: Cannot read property 'value' of null 2つ目のdateでUncaught ReferenceError: dateselect is not defined
tarataia

2019/08/23 06:59

すいません dateselectの部分は function dateselect(){ var dateControl = document.querySelector('input[type="date"]'); var dateControl =document.getElementById('dateA').value; document.getElementById('dateB').min = dateControl; }でgetElementByIdで動くかどうか試していた時のやつを消していませんでした
guest

回答2

0

ベストアンサー

こんな感じでどうでしょう?

javascript

1<script> 2window.addEventListener('DOMContentLoaded',()=>{ 3 document.querySelector('#dateA').addEventListener('change',e=>{ 4 var v1=e.target.value; 5 document.querySelector('#dateB').setAttribute("min",v1); 6 calc_diff(); 7 }); 8 document.querySelector('#dateB').addEventListener('change',e=>{ 9 var v2=e.target.value; 10 document.querySelector('#dateA').setAttribute("max",v2); 11 calc_diff(); 12 }); 13}); 14function calc_diff(){ 15 var v0=""; 16 var v1=document.querySelector('#dateA').value; 17 var v2=document.querySelector('#dateB').value; 18 if(v1!=="" && v2!==""){ 19 var d1=new Date(v1); 20 var d2=new Date(v2); 21 var d3=d2.getTime()-d1.getTime(); 22 v0=d3/(60*60*24*1000); 23 } 24 document.querySelector('#dateC').value=v0; 25} 26</script> 27<input id="dateA" name="DEADLINE01" type="date" value=''>28<input id="dateB" name="DEADLINE02" type="date" value=''> 29日数:<input id="dateC" type="text">

投稿2019/08/23 06:57

yambejp

総合スコア114829

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

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

tarataia

2019/08/23 07:29

ありがとうございます。考えていた通りの完璧なコードでした。 その上で少しお聞きしたいことがあって('DOMContentLoaded',()=>{と('change',e=>{の()=>とかe=>の部分ってどのような意味があるのでしょうか? またcalc_diffの部分はonblurA,Bのように差分を求めているという認識で会っているでしょうか?
yambejp

2019/08/23 07:36

> e=>の部分 あまり深い意味はありません(別の書き方でも大丈夫です) eはイベントでchangeした情報をもっています。 そこから自分自身を参照するときにe.targetを利用します > calc_diffの部分はonblurA,Bのように差分を求めている 命題で差分を計算する必要がありそうだったので一応つけておきました
tarataia

2019/08/23 08:16

なるほど・・・ targetを使う発想が思いつかなかったです  ありがとうございました
guest

0

取り急ぎ

document.querySelector('dateA').value;

セレクターなのでidの場合は#dateA、クラスの場合は.dateAのように指定する必要があります。
ただIDなら画面内に1件しか用意してはいけませんのでgetElementByIdで良いように思いますが。

投稿2019/08/23 06:43

m.ts10806

総合スコア80850

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

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

tarataia

2019/08/23 07:02

ありがとうございます ただ質問部分にも記載した通りgetElementbyIdでも試しては見たのですが特に変化はなかったです とりあえずコード部分は修正させていただきます
tarataia

2019/08/26 00:07

返答が遅くなって申し訳ありません 規約をよく読んで次回からの質問時から気を付けたいと思います
m.ts10806

2019/08/26 00:10

規約というより「ガイドライン」ですね。 守らなかったと言って罰せられるわけではないですが、 守ることによって的確で迅速な解決に進むことができる(あと自身の理解も深まる)ので「なるべく守ったほうが円滑に物事が進みますよ」というものです。 もしアドバイスを参考にやってみて解決しなかった場合はそれも「試したこと」として追記して次の試行錯誤につなげていきましょう。
tarataia

2019/08/26 01:30

ご丁寧にありがとうございます。 質問をするにあたって今困っている部分をきちんと整理することは回答していただく方に対しても自分に対しても必要な事だと感じたので意識してみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問