inoha1127
@inoha1127

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

javascriptで未入力項目を非表示にしたい

javascript学習中で、javascriptで西暦を和暦にするコードを作成しています。

最初未入力結果消したかったのでをdisplay:noneで非表示にしたのはいいんですけど、未入力の状態でボタンを押してしまうと初期状態の『明治33年月日』だけ表示されてしまうのでこちらをどうにかしたいんですけど何か方法はありますか?

解決方法をございましたら教えていただきたいです。

自分で試したこと
「未入力 非表示 javascript」などで変換しても解決したい記事などがみあたらなかったので質問させていただきます(>_<)

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>カレンダー</title>
<link rel="stylesheet" href="style.css">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

<body>
<script src="document.js"></script>

  <div class="first-wrapper">
    <div class="first-section">
        <p><input type="number" name="year" id="year" min="1868" max="2055" step="1"  / required></p>
        <p><input type="number" name="month" id="month" min="1" max="12" step="1"  /required></p>
        <p><input type="number" name=day" id="day" min="1" max="31" step="1"  /required></p>
        
    </div> 
  </div>   

  <button>和暦に変換</button>

  <div class="second-wrapper">
    <div id="second-section">
      <p><span id="year1" ></span></p>
      <p ><span id="month1"></span></p>
      <p><span id="day1"></span></p>
    </div>
  </div>

</body>
.section {
    display: inline-grid;
}
input#input1 {
    width: 40px;
}
input#input2 {
    width: 40px;
}
input#input3 {
    width: 40px;
}
.first-section {
    display: flex;
}
.second-section {
    display: flex;
}
div#second-section {
    display: flex;
}
.second-wrapper{
    display: none;
}
function convertYearToJapaneseEra(year)
//年を日本の元号に変換する
{
  let m = new Date(year, 0, 1); 
  // e.g. "2022-01-01"
  let dt = new Intl.DateTimeFormat('ja-JP-u-ca-japanese', {era: 'short'});
  //Intl.DateTimeFormatで言語に応じた日時のフォーマットを作る(日本語で和暦指定)
  //ja-JP-u-ca-japaneseで日本語と和暦に対応させる
  var [{ value: era }, { value: year},{ month: long}] = dt.formatToParts(m); 
  // e.g. {type: 'era', value: '令和'},{type: 'year', value: '4'},{type: 'literal', value: '年'}
  //{type:'month',value:'4'}
  for(let i=0;i<3;i++){
    console.log({ value: era }, { value: year},{ value:month}[i]);
  };
  let str = era + year;
  return str ;
  // e.g. "令和4"
}

$(function(){
  $("#year").on("input change",function(){
    let year = $(this).val();
    let yearJp = convertYearToJapaneseEra(year);
    $("#year1").text(yearJp);
  
  }).change();
  $("#month").on("input change",function(){
    let month = $(this).val();
    $("#month1").text(month);
  }).change();
  $("#day").on("input change",function(){
    let day = $(this).val();
    $("#day1").text(day);
  }).change();
});

$(function () {
$('button').on('click', () => {
    $('.second-wrapper').fadeToggle();  
});
});

0

1Answer

質問者様のやりたいことは、ボタンクリックまで和暦の表示を変えないことか、未入力の時のみ和暦を非表示にしたいことか分からない点がありますが、
いずれにして最初の問題点は下記だと思います。

$(function () {
    $('button').on('click', () => {
        $('.second-wrapper').fadeToggle();  
    });
});

こちらの実装で、「ボタンがクリックされたらsecond-wrapperクラスの表示/非表示を切り替える」処理を行なっています。
質問者様のやりたいことに対して、2点の不都合があります。

  1. 表示/非表示の切り替えなので、2回目のクリックで消えてしまう
  2. 未入力のチェックをしていないため、いつクリックしても動作してしまう
表示/非表示の切り替えなので、2回目のクリックで消えてしまう

表示/非表示切り替えの.fadeToggle()ではなく、表示の.fadeTo()で解消できます。

未入力のチェックをしていないため、いつクリックしても動作してしまう

年月日のいずれに入力にあったら表示したいか、年月日の全項目に入力にあったら表示したいか分かりませんが、一旦年月日が全て入力されたら表示するようなコードに変更しました。
どういう実装をしているかはコメントをご参照ください。

$(function () {
  $('button').on('click', () => {
    // 入力欄の値を取得し、変数に代入する
    const year = $("#year").val();
    const month = $("#month").val();
    const day = $("#day").val();
    // 値が全て入力されたかをチェックする
    if (year && month && day) {
      // 値が全て入力されたら表示する
      $('.second-wrapper').fadeIn();
    }
  });
});

最後に、質問のタグに対するアドバイスですが、
初心者かどうかより、言語や技術を記載した方が、知見のある方が集まりやすいです。
HTML,CSSよりHTMLCSSを。
JavaScript初心者よりJavaScriptを。
さらに、jQueryを利用しているならjQueryも入れましょう。むしろ一番入れた方がいいです。

1Like

Your answer might help someone💌