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

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

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

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

HTML

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

Q&A

解決済

6回答

6517閲覧

JavaScriptで、if文の論理演算子OR(||)がうまいこと機能していない

Beginnerrr

総合スコア17

JavaScript

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

HTML

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

0グッド

2クリップ

投稿2018/08/07 05:35

作ろうとしているもの

生年月日をプルダウンで選択出来るものを作っています。
選択する西暦・月によって、選択出来る日数を変えられる様にしています。
なので、西暦や月の値を変える度に、日数のデータは空になり、選択出来る日数の値が変わります。
具体的には、「うるう年の2月は29日まで選択できるが、それ以外の年の2月は28日までしか選択できない。」です。

問題点

問題があるコードはたぶん、JavaScriptの1個目の「else if」だと思います。
1、3、5、7、8、10、12月は日数が31日まであるので、31日までプルダウンで表示したいです。
しかし、1月は31日まで選択出来るのですが、それ以外の月は何故か30日までしか表示されません。
「検証」を使って、「month_value == (1||3||5||7||8||10||12)」を実行してみたのですが、
month_valueの値とカッコ内の先頭の数字が一致する場合しかTRUEを返しません。
全く訳が分からない状況です。
何方か教えて頂きたいです。

コード

JavaScript

1const monthCheck = function(){ 2 var year_value = document.getElementById("year").value; 3 var month_value = document.getElementById("month").value; 4 year_value = parseInt(year_value); 5 month_value = parseInt(month_value); 6 7 var x = document.form_signin.day; 8 if (x.hasChildNodes()) { 9 while (x.childNodes.length > 0) { 10 x.removeChild(x.firstChild) 11 } 12 } 13 14 15 if(year_value%4 == 0 && month_value == 2 ){ //29 16 for(var i=1; i<30; i++){ 17 document.form_signin.day.options[i] = new Option(i+"日", i); 18 19 } 20 }else if(month_value == (1||3||5||7||8||10||12) ){ //31  21 for(var i=1; i<32; i++){ 22 document.form_signin.day.options[i] = new Option(i+"日", i); 23 } 24 }else if(month_value == 2 ){ //28 25 for(var i=1; i<29; i++){ 26 document.form_signin.day.options[i] = new Option(i+"日", i); 27 } 28 }else{ //30 29 for(var i=1; i<31; i++){ 30 document.form_signin.day.options[i] = new Option(i+"日", i); 31 } 32 } 33}

HTML

1<form name="form_signin"> 2 <select name="year" id="year" class="w100" onchange="monthCheck()" > 3 <option value="1">--西暦--</option> 4 <option value="1980">1980年</option> 5 <option value="1981">1981年</option> 6 <option value="1982">1982年</option> 7 <option value="1983">1983年</option> 8 <option value="1984">1984年</option> 9 <option value="1985">1985年</option> 10 <option value="1986">1986年</option> 11 <option value="1987">1987年</option> 12 <option value="1988">1988年</option> 13 <option value="1989">1989年</option> 14 <option value="1990">1990年</option> 15 <option value="1991">1991年</option> 16 <option value="1992">1992年</option> 17 <option value="1993">1993年</option> 18 <option value="1994">1994年</option> 19 <option value="1995">1995年</option> 20 <option value="1996">1996年</option> 21 <option value="1997">1997年</option> 22 <option value="1998">1998年</option> 23 <option value="1999">1999年</option> 24 <option value="2000">2000年</option> 25 <option value="2001">2001年</option> 26 <option value="2002">2002年</option> 27 <option value="2003">2003年</option> 28 <option value="2004">2004年</option> 29 <option value="2005">2005年</option> 30 <option value="2006">2006年</option> 31 <option value="2007">2007年</option> 32 <option value="2008">2008年</option> 33 <option value="2009">2009年</option> 34 <option value="2010">2010年</option> 35 <option value="2011">2011年</option> 36 <option value="2012">2012年</option> 37 <option value="2013">2013年</option> 38 <option value="2014">2014年</option> 39 <option value="2015">2015年</option> 40 </select> 41 <select name="month" id="month" class="w80" onchange='monthCheck()' > 42 <option value="0">-月-</option> 43 <option value="1">1月</option> 44 <option value="2">2月</option> 45 <option value="3">3月</option> 46 <option value="4">4月</option> 47 <option value="5">5月</option> 48 <option value="6">6月</option> 49 <option value="7">7月</option> 50 <option value="8">8月</option> 51 <option value="9">9月</option> 52 <option value="10">10月</option> 53 <option value="11">11月</option> 54 <option value="12">12月</option> 55 </select> 56 57 <select name="day" id="day" class="w80" > 58 <option value="0">-日-</option> 59 </select> 60</form>

よろしくお願いします!!!

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

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

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

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

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

guest

回答6

0

javascriptのor演算子||は真(非ゼロ)が見つかった時点で評価を打ち切ります。
したがって、1||3||5||7||8||10||12と書くと、最初の1が真なので1と書いたのと同じことになってしまいます。

つまり当該行は
}else if(month_value == 1 ){
になってしまいます。

といって、if文を並べるのもイヤというなら、配列[1,3,5,7,8,10,12]を作って、その中にmonth_valueが含まれるかどうか調べればいいです。

新し目のJSの配列にはArray.prototype.includes()メソッドがあるので簡単です。もし同メソッドが使えなければ、[1,3,5,7,8,10,12].indexOf(month_value) >= 0で調べることができます。

投稿2018/08/07 06:11

satocha

総合スコア336

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

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

0

しつこいようですが、変な条件で閏年や小の月を探すのは無駄が多いのでやめたほうがいいでしょう

投稿2018/08/07 06:31

yambejp

総合スコア114777

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

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

namda

2018/08/07 07:00

自分はすぐ年月日をまとめて入力できるCalendarライブラリーとか導入してValidationはサーバーサイドで片付けちゃいますけど こういう独自実装が必要な場合変な条件にならないよう、どうやるのがスマートなんですかね
yambejp

2018/08/07 07:43

一番スマートなのはカレンダーデータを別途もつこと そうでない場合は、前回の質問で回答したように https://teratail.com/questions/139964 年と月を指定してその月の月末日までを表示するだけなので if(月が大の月なら)的な条件分岐自体が不要
namda

2018/08/07 07:54

前日譚?があったんですね確かに年月から日にちをぶん回すだけで事足りますね。ありがとうございました。
Beginnerrr

2018/08/07 08:37

ご指摘有難うございます! あのコードを理解できる様に頑張ります!
guest

0

year_value%4 == 0 && month_value == 2

そもそもこれ、うるう年の判定として落第です。
もうこういうのは専門家に任せましょう。

というわけでMoment.jsを覚えてみては?
Browser - Moment.js Docを見る限り、
CDNが公開されており、1行のスクリプトタグを貼り付けるだけで利用可能となります。

そしてMoment.jsにはDays in Monthというまさにあなたの為に専門家が作ったような機能が用意されています。

JavaScript

1var year = 2016; 2var month = 2; 3var days = moment([year, month - 1]).daysInMonth(); // month: -1が必要なのに注意すること

ほら、たった1行で済みました。
JSで凝った日付管理がしたければMoment.jsを頼るくらいで良いかと思います。

投稿2018/08/07 07:17

miyabi-sun

総合スコア21158

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

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

Beginnerrr

2018/08/07 07:32

有難うございます!!! こんな便利なものがあるんですね!!!
guest

0

var m31 = [1,3,5,7,8,10,12]; if(m31.includes(month_value)){ // 31

↑のようにする手も。

投稿2018/08/07 06:07

tkturbo

総合スコア5572

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

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

0

ベストアンサー

JavaScript

1}else if(month_value == (1||3||5||7||8||10||12) ){ //31

こういう横着は、どの言語を使ってもできないように思います。
以下のようにすべきです。

JavaScript

1}else if( 2 month_value == 1 || 3 month_value == 3 || 4 month_value == 5 || 5 month_value == 7 || 6 month_value == 8 || 7 month_value == 10|| 8 month_value == 12 9 ){ //31

投稿2018/08/07 05:38

kazto

総合スコア7196

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

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

Beginnerrr

2018/08/07 05:49

知りませんでした、、、 有難うございます!!! 頭のモヤが晴れました。
namda

2018/08/07 06:03 編集

蛇足ですけど(1||3||5||7||8||10||12)だと 1はtrueか?じゃなければ3、左の結果はtrueか?でなければ5、・・・ と言う感じになります。 jsの場合falseとする値は0や空文字化などでありそれ以外はすべてtrueになります。 詳しくはJavaScriptの「&&」「||」の解説(https://qiita.com/Imamotty/items/bc659569239379dded55)を見ればよくわかります。
guest

0

質問の内容から脱線しますが、「配列等に規定値を突っ込んでおいて評価する」ってやると、コードがきれいに書けます。
JavaScript での書き方がちょっとわからなかったので、コードは適当です。

JavaScript

1test_arr =[1,2,3,0,100]; 2month_days ={1:31,2:28,3:30};//めんどいので3月までw 3year = 2000; 4test_arr.forEach(function(month) { 5 if(month === 0||month > 12){ 6 console.log('error');//エラーの対応 7 } 8 if(month===2){ 9 if(year%4===0&&year%100!==0){//うるう年の判定 10 month_days[2]=29; 11 } 12 } 13 console.log(month+'月の最終日:'+month_days[month]);//キモ 14}); 15 16// 171月の最終日:31 182月の最終日:28 193月の最終日:30 20error 210月の最終日:undefined 22error 23100月の最終日:undefined 24

投稿2018/08/07 06:51

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問