前提・実現したいこと
現在node.jsのexpressでウェブアプリケーションを作ろうとしています。他サイトから引っ張ってきたカレンダーを使って、サイトに使用したいのですが、このカレンダーはnode.jsで使うことを想定していないため、innerHTMLを使うとエラーが出ます
質問 1
そもそもnode.jsでHTMLを後からいじるという考え方が間違っていますか?(だからinnerHTMLやappendが使えない?)
質問2
このカレンダーはcalendar.jsでテーブルを作成しているのですが、node.jsでこのテーブルを作るにはどうすれば良いのでしょうか?
node.js初心者なため、初歩的な質問かもしれませんが、回答お願いします。
発生している問題・エラーメッセージ
Cannot set property 'innerHTML' of null
該当のソースコード
app.js
const express = require('express'); const mysql = require('mysql') const jsdom = require('jsdom-global')() const calendar = require('./calendar.js') app.get('/calendar',(req,res)=>{ res.render('calendar.ejs') })
calendar.js
var today = new Date(); var currentMonth = today.getMonth(); var currentYear = today.getFullYear(); function generate_year_range(start, end) { var years = ""; for (var year = start; year <= end; year++) { years += "<option value='" + year + "'>" + year + "</option>"; } return years; } var today = new Date(); var currentMonth = today.getMonth(); var currentYear = today.getFullYear(); var selectYear = document.getElementById("year"); var selectMonth = document.getElementById("month"); var createYear = generate_year_range(1970, 2200); document.getElementById("year").innerHTML = createYear; var calendar = document.getElementById("calendar"); var lang = calendar.getAttribute('data-lang'); var months = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]; var days = ["日", "月", "火", "水", "木", "金", "土"]; var dayHeader = "<tr>"; for (day in days) { dayHeader += "<th data-days='" + days[day] + "'>" + days[day] + "</th>"; } dayHeader += "</tr>"; document.getElementById("thead-month").innerHTML = dayHeader; monthAndYear = document.getElementById("monthAndYear"); showCalendar(currentMonth, currentYear); function showCalendar(month, year) { var firstDay = ( new Date( year, month ) ).getDay(); tbl = document.getElementById("calendar-body"); tbl.innerHTML = ""; monthAndYear.innerHTML = months[month] + " " + year; selectYear.value = year; selectMonth.value = month; // creating all cells var date = 1; for ( var i = 0; i < 6; i++ ) { var row = document.createElement("tr"); for ( var j = 0; j < 7; j++ ) { if ( i === 0 && j < firstDay ) { cell = document.createElement( "td" ); cellText = document.createTextNode(""); cell.appendChild(cellText); row.appendChild(cell); } else if (date > daysInMonth(month, year)) { break; } else { cell = document.createElement("td"); cell.setAttribute("data-date", date); cell.setAttribute("data-month", month + 1); cell.setAttribute("data-year", year); cell.setAttribute("data-month_name", months[month]); cell.className = "date-picker"; cell.innerHTML = "<span>" + date + "</span>"; if ( date === today.getDate() && year === today.getFullYear() && month === today.getMonth() ) { cell.className = "date-picker selected"; } row.appendChild(cell); date++; } } tbl.appendChild(row); } } function daysInMonth(iMonth, iYear) { return 32 - new Date(iYear, iMonth, 32).getDate(); }
calendar.ejs
<div class="container-calendar"> <h4 id="monthAndYear"></h4> <div class="button-container-calendar"> <button id="previous">‹</button> <button id="next" >›</button> </div> <table class="table-calendar" id="calendar" data-lang="ja"> <thead id="thead-month"></thead> <tbody id="calendar-body"></tbody> </table> <div id="calendar_footer" class="footer-container-calendar"> <label for="month">日付指定:</label> <select id="month"> <option value=0>1月</option> <option value=1>2月</option> <option value=2>3月</option> <option value=3>4月</option> <option value=4>5月</option> <option value=5>6月</option> <option value=6>7月</option> <option value=7>8月</option> <option value=8>9月</option> <option value=9>10月</option> <option value=10>11月</option> <option value=11>12月</option> </select> <select id="year"></select> <div id="footer_btn"></div> </div> </div>
まだ回答がついていません
会員登録して回答してみよう