Javascript (カレンダー006_機能検討jQuery入力)

■jQueryを使ってデータを入力する方法を考える。

前回、データをポップアップで表示することができたので、今回は、データを入力する方法を考えてみる。表示と同じようにshow, hideを使って入力画面の表示、非表示を切り替えるようにしてみた。
入力内容はもともとの項目と同じように、タイトル用のテキスト部分と内容用のテキスト部分、登録するボタンを用意した。カレンダー上の日付をクリックすると登録画面が表示される(下の図)。

$("body").append("<div id='inputLayer'>") 
$("body").append("<input type='text' id='inputtext'>") 
$("body").append("<textarea name='comments' id='inputtextarea' rows='8' cols='40'></textarea>") 
$("body").append("<input type='button' id='inputbutton' onclick='input(this)' value='save'>") 
$("body").append("</div>")

saveボタンを押して登録した後、カレンダー上から登録が完了している日付(緑色の日付)をクリックすると、タイトルと内容がポップアップして表示される。

データ入力をポップアップする画面に切り替えたので、画面上はカレンダーしか表示されていない状態となっている。実際は見えないだけでソースには、表示用、入力用のコードが隠れているけど。

ひとまず形にはなったので、htmlとcssのコードを記載しておく。jQueryはhtml、cssのファイルと同じフォルダに入れる想定。

<html>
<head>
<meta charset="utf-8">
<title>Calendar</title>
<link href="calender006.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="jquery-3.5.1.min.js"></script>
<script>
//===============================================
//Input memo into localStorage with date index ("2020.7.3").
//===============================================
function presetDiary(dateStr){
    var diary_date=document.getElementById("diary_date");
    diary_date.innerHTML=dateStr;
    var title=localStorage[dateStr+"_title"];
    var body=localStorage[dateStr+"_body"];
}

//===============================================
//Input data when button is clicked.
//===============================================
function input(obj){
     var dateStr=obj.getAttribute("data-date");
     var diary_title=document.getElementById("inputtext").value
     var diary_body=document.getElementById("inputtextarea").value
     
     localStorage[dateStr+"_title"]=diary_title;
     localStorage[dateStr+"_body"]=diary_body;
     location.reload();
}

//===============================================
//Display when browser is loaded.
//===============================================
window.onload=function(){

     var date=new Date();
     var year=date.getFullYear();
     var month=date.getMonth()+1;
     var today=date.getDate();

     var firstDate=new Date(year, month-1,1);
     var lastDate=new Date(year, month, 0);
     var todayStr = year + "." + month +"."+today;
     //settign data
     presetDiary(todayStr);
     var table_title = year +"-"+month;
     var captionHtml = "<caption>"+table_title+"</caption>";
     
     var weekdays = new Array("Sun","Mon","Tue","Wed","Thr","Fri","Sat");
     var weekdaysStr="<tr>";
     for (var i=0; i <7; i++){
         if (i==0){
             weekdaysStr += "<td class='sun' align=\"center\"><font color=\"#FF0000\">"+weekdays[i] + "</td>";
             } else if(i==6){
             weekdaysStr += "<td class='sat' align=\"center\"><font color=\"#0000FF\">"+weekdays[i] + "</td>";
             } else{
             weekdaysStr += "<td align=\"center\">"+weekdays[i] + "</td>";
             }
         }
     weekdaysStr += "</tr>";
     var htmlStr="<tr>";
     
     var startWeekDay = firstDate.getDay();
     for (var i=0; i<startWeekDay; i++){
         htmlStr += "<td>&nbsp;</td>";
         }
//===============================================
//Put cells
     for (var i=1; i<=lastDate.getDate(); i++){
         var date=new Date(year, month-1,i);
         var weekDay = date.getDay();
         var dateStr=year+"."+month+"."+i;
         var cellStr=date.getDate();
         if(localStorage[dateStr+"_title"]) cellStr ="<u>"+cellStr+"</u>";
         if(weekDay==0) htmlStr+="<tr>";
     
         if(localStorage[dateStr+"_title"]){
              if(weekDay==0){
                  htmlStr+="<td align=\"center\"  bgcolor=\"#00FF00\" class='sun'><font color=\"#FF0000\">";
              }else if(weekDay==6){
                  htmlStr+="<td align=\"center\"  bgcolor=\"#00FF00\" class='sat'><font color=\"#0000FF\">";
              }else {
                  htmlStr+="<td align=\"center\" bgcolor=\"#00FF00\">";
              }
         }else{
              if(weekDay==0){
                  htmlStr+="<td align=\"center\" class='sun'><font color=\"#FF0000\">";
              }else if(weekDay==6){
                  htmlStr+="<td align=\"center\" class='sat'><font color=\"#0000FF\">";
              }else {
                  htmlStr+="<td align=\"center\">";
              }
         }

         htmlStr += "<a onclick='presetDiary(\""+dateStr+"\");'>" + cellStr+"</a></td>";
         if(weekDay==6) htmlStr += "</tr>\n";
     }
     
//If calendar last day is not end of month, put blank cells.
     var lastDayWeek = lastDate.getDay();
     if (lastDayWeek !=6){
         for (var i = lastDayWeek+1; i<=6; i++){
             htmlStr += "<td align=\"right\">&nbsp;</td>";
         }
         htmlStr +="</tr>";
     }
     document.getElementById("calendar").innerHTML = "<table width=\"300pt\" style=\"table-layout: fixed;\" border=\"3\" cellspacing=\"0\" cellpadding=\"5\" bordercolor=\"#ffcc66\">"+captionHtml + weekdaysStr+ htmlStr + "</table>";
}

//===============================================
//additional windows for input and show data
//===============================================
$(function(){
    $("body").append("<div id='glayLayer'></div><div id='overLayer'></div>")
    $("body").append("<div id='inputLayer'>")
    $("body").append("<input type='text' id='inputtext'>")
    $("body").append("<textarea name='comments' id='inputtextarea' rows='8' cols='40'></textarea>")
    $("body").append("<input type='button' id='inputbutton' onclick='input(this)' value='save'>")
    $("body").append("</div>")
    
    $("#glayLayer").click(function(){
        $(this).hide()
        $("#overLayer").hide()
    })
    $("#inputLayer").click(function(){
        $(this).hide()
        $("#inputtext").hide()
        $("#inputtextarea").hide()
        $("#inputbutton").hide()
    })
   
    $("td").click(function(){
    var diary_date=document.getElementById("diary_date");
    var diary_num = parseFloat(diary_date);
    console.log(diary_date.innerHTML+"_title" + typeof(diary_date) + typeof(diary_num));
    var title=localStorage[diary_date.innerHTML+"_title"];
    var body=localStorage[diary_date.innerHTML+"_body"];

    if(title){
        $("#glayLayer").show()
        $("#overLayer").show().html(title+"\n"+body).css({
            marginTop:"-"+$("#overLayer").height()/2+"px" , 
            marginLeft:"-"+$("#overLayer").width()/2+"px" ,
            position:absolute
        })
        return false;
    }
    else {
        $("#inputLayer").show()
        $("#inputtext").show()
        $("#inputtextarea").show()
        $("#inputbutton").show()
         inputbutton.setAttribute("data-date", diary_date.innerHTML)
    
    }
    var diary_date="";
    
    
    })
});
</script>
</head>
<!--//===============================================
//body part
//===============================================-->
<body>
       <div class="frame-box">
       <div class="calendar-box">
       <div id="calendar" class="calendar"</div>
       </div>
       <div class="diary_box">
       <div hidden id="diary_date" class="diary_date" ></div>
       </div>
</body>
</html>

次にcalender006.css

html,body{
    margin:0;
    padding:0;
    height:100%;
}
dl dt td{
    margin:20px 50px;
    font-size:small;
    border:1px solid #7BAEB5;
    border-left:1em solid #7BAEB5;
    padding-left:10px;
    width:600px;
    cursor:pointer;
}
#glayLayer{
    display:none;
    position:fixed;
    left:0;
    top:0;
    height:100%;
    width:100%;
    background:#7BAEB5;
    filter:alpha(opacity=75);
    opacity: 0.75;
}
* html #glayLayer{
    position:absolute;
}
#overLayer{
    display:none;
    width:400px;
    background:white;
    padding:10px;
    position: fixed;
    top:10%;
    left:5%;
}
* html #overLayer{
    position: absolute;
}

#inputLayer {
    display:none;
    position:fixed;
    left:0;
    top:0;
    height:100%;
    width:100%;
    background:#7BAEB5;
    filter:alpha(opacity=75);
    opacity: 0.75;
}
* html #inputLayer{
    position: absolute;
}

#inputtext {
    display:none;
    background:white;
    padding:10px;
    position: fixed;
    top:10%;
    left:5%;
}
#inputtextarea {
    display:none;
    background:white;
    position: fixed;
    top:20%;
    left:5%;
}
#inputbutton {
    display:none;
    background:white;
    position: fixed;
    top:40%;
    left:5%;

}