up
This commit is contained in:
parent
4272b7bb13
commit
508969c13f
168 changed files with 340 additions and 10 deletions
|
@ -0,0 +1,9 @@
|
|||
We'll create the table as a string: `"<table>...</table>"`, and then assign it to `innerHTML`.
|
||||
|
||||
The algorithm:
|
||||
|
||||
1. Create the table header with `<th>` and weekday names.
|
||||
1. Create the date object `d = new Date(year, month-1)`. That's the first day of `month` (taking into account that months in JavaScript start from `0`, not `1`).
|
||||
2. First few cells till the first day of the month `d.getDay()` may be empty. Let's fill them in with `<td></td>`.
|
||||
3. Increase the day in `d`: `d.setDate(d.getDate()+1)`. If `d.getMonth()` is not yet the next month, then add the new cell `<td>` to the calendar. If that's a Sunday, then add a newline <code>"</tr><tr>"</code>.
|
||||
4. If the month has finished, but the table row is not yet full, add empty `<td>` into it, to make it square.
|
|
@ -0,0 +1,79 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
border: 1px solid black;
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: bold;
|
||||
background-color: #E6E6E6;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
<div id="calendar"></div>
|
||||
|
||||
<script>
|
||||
function createCalendar(elem, year, month) {
|
||||
|
||||
let mon = month - 1; // months in JS are 0..11, not 1..12
|
||||
let d = new Date(year, mon);
|
||||
|
||||
let table = '<table><tr><th>MO</th><th>TU</th><th>WE</th><th>TH</th><th>FR</th><th>SA</th><th>SU</th></tr><tr>';
|
||||
|
||||
// spaces for the first row
|
||||
// from Monday till the first day of the month
|
||||
// * * * 1 2 3 4
|
||||
for (let i = 0; i < getDay(d); i++) {
|
||||
table += '<td></td>';
|
||||
}
|
||||
|
||||
// <td> with actual dates
|
||||
while (d.getMonth() == mon) {
|
||||
table += '<td>' + d.getDate() + '</td>';
|
||||
|
||||
if (getDay(d) % 7 == 6) { // sunday, last day of week - newline
|
||||
table += '</tr><tr>';
|
||||
}
|
||||
|
||||
d.setDate(d.getDate() + 1);
|
||||
}
|
||||
|
||||
// add spaces after last days of month for the last row
|
||||
// 29 30 31 * * * *
|
||||
if (getDay(d) != 0) {
|
||||
for (let i = getDay(d); i < 7; i++) {
|
||||
table += '<td></td>';
|
||||
}
|
||||
}
|
||||
|
||||
// close the table
|
||||
table += '</tr></table>';
|
||||
|
||||
elem.innerHTML = table;
|
||||
}
|
||||
|
||||
function getDay(date) { // get day number from 0 (monday) to 6 (sunday)
|
||||
let day = date.getDay();
|
||||
if (day == 0) day = 7; // make Sunday (0) the last day
|
||||
return day - 1;
|
||||
}
|
||||
|
||||
createCalendar(calendar, 2012, 9);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,38 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<style>
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
|
||||
td,
|
||||
th {
|
||||
border: 1px solid black;
|
||||
padding: 3px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
th {
|
||||
font-weight: bold;
|
||||
background-color: #E6E6E6;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
|
||||
<div id="calendar"></div>
|
||||
|
||||
<script>
|
||||
function createCalendar(elem, year, month) {
|
||||
// ...your code that generates the calndar in elem...
|
||||
}
|
||||
|
||||
createCalendar(calendar, 2012, 9);
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,17 @@
|
|||
importance: 4
|
||||
|
||||
---
|
||||
|
||||
# Create a calendar
|
||||
|
||||
Write a function `createCalendar(elem, year, month)`.
|
||||
|
||||
The call should create a calendar for the given year/month and put it inside `elem`.
|
||||
|
||||
The calendar should be a table, where a week is `<tr>`, and a day is `<td>`. The table top should be `<th>` with weekday names: the first day should be Monday, and so on till Sunday.
|
||||
|
||||
For instance, `createCalendar(cal, 2012, 9)` should generate in <code><div id='cal'></div></code> the following calendar:
|
||||
|
||||
[iframe height=210 src="solution"]
|
||||
|
||||
P.S. For this task it's enough to generate the calendar, should not yet be clickable.
|
Loading…
Add table
Add a link
Reference in a new issue