4-1. 일기장 미리보기
4-2. 일기장의 프로그래밍적 원리 이해하기
사용자로부터 입력받을 값
우리는 날짜마다 한 줄 일기와 기분을 저장할 수 있는 일기장을 만드려고 합니다. 하루치의 일기에 저장되는 값들은 다음과 같습니다.
- 날짜 (년-월-일)
- 한 줄 텍스트
- 기분 (행복, 보통, 슬픔) - HTML에서 기본 제공하는 Select box
- 또는 이모지(emoji) 😠 😞 😐 😊 😃 - 오픈소스 라이브러리 사용
일기장을 저장하는 방법
우리는 JavaScript의 로컬 스토리지(Local storage)를 활용하여 사용자가 입력한 일기장을 저장할 겁니다. 로컬 스토리지는 여러분들의 브라우저에 저장되므로 다른 컴퓨터 또는 기기에서 접속할 경우 저장한 값을 볼 수 없다는 단점이 있지만 그만큼 안전하다는 장점도 있지요. 또한 로그인 기능이 필요하지 않아 사용자 접근성이 좋습니다.
로컬 스토리지를 사용하는 방법은 다음과 같습니다.
localStorage.setItem("test-key", "테스트입니다");
위의 코드는 test-key라는 공간(Key)에 “테스트입니다”라는 텍스트를 저장하라는 코드입니다.
저장한 값을 꺼내서 사용하고 싶을 때는 아래와 같은 코드를 사용합니다. test-key라는 키에서 값을 꺼내 storage 변수에 저장합니다.
var storage = localStorage.getItem("test-key");
로컬 스토리지에 저장된 값을 확인하는 방법
개발자 도구를 사용하여 로컬 스토리지에 저장된 값을 확인, 수정, 삭제할 수 있습니다. 개발자 도구를 열기 위해 Live Preview 오른쪽 상단의 메뉴 버튼을 누르고 Devtools 창 열기를 선택합니다.
상단 메뉴의 Application를 선택하고 좌측 메뉴의 Storage - Local Storage - http://127.0.0.1:3000 을 선택하여 저장된 값을 확인할 수 있습니다.
💡 가끔 저장된 값이 보이지 않을 때가 있는데 Live Preview의 버그때문에 그럴 수 있습니다. 저장된 값이 보이지 않을 때는 개발자 도구를 닫고 웹페이지의 새로고침 버튼을 누른 후 다시 실행해주세요. 만약 계속해서 보이지 않는다면 Live Preview 대신 크롬 브라우저를 사용해서 개발하셔도 무방합니다.
- 새로고침: 마우스 오른쪽 버튼 - Refresh
- 편집: 마우스 오른쪽 버튼 - Edit
- 삭제: 마우스 오른쪽 버튼 - Delete
개발자 콘솔에서 값 출력하기
거의 모든 웹 브라우저는 개발자를 위한 개발자 콘솔 기능을 지원합니다. 개발자 도구 상단 Console 메뉴에서 접근 가능합니다. 아래 코드를 입력하고 콘솔에 접속합니다.
console.log("Hello World!");
로컬 스토리지 test-key에 저장된 값을 개발자 콘솔에서 출력할 수 있습니다.
var storage = localStorage.getItem("test-key");
console.log(storage);
4-3. HTML로 일기장 틀 만들기
보일러플레이트
새로운 프로젝트를 시작할 때는 항상 보일러플레이트 코드부터 시작합니다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Hello, world!</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="container">
<h1>Hello, world!</h1>
</main>
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="script.js"></script>
</body>
</html>
script.js
$(document).ready(function() {
});
style.css
/* 비어있음 */
사용자 입력 구현하기
사용자로부터 입력받을 폼을 구현합니다. 처음보는 요소가 두 개 있습니다.
<input type="date" id="date" />
<input type="text" id="text" />
<div id="emoji"></div>
<select id="mood">
<option value="행복">행복</option>
<option value="보통">보통</option>
<option value="슬픔">슬픔</option>
</select>
<button type="button" id="save">저장하기</button>
<div id="result"></div>
- input type=”date”
- 날짜를 입력받을 수 있습니다. 달력 버튼을 눌러 사용자가 날짜를 선택할 수 있습니다.
- YYYY-MM-DD (e.g. 2022-11-16) 형식의 텍스트로 받을 수 있습니다.
- select box
- 사용자로부터 여러개의 입력 중에 1개의 입력을 선택하도록 할 수 있습니다.
- value 인자를 통해 사용자가 선택한 값을 받아올 수 있습니다.
4-4. 로컬저장소를 활용한 일기장 내용 저장하기
사용자 입력값 받아와 출력하기
save 버튼을 누르면 date, text, mood 로부터 입력값을 받아와 result에 그대로 뿌려주겠습니다. 일기장의 내용을 임시로 p 태그로 감싸서 출력할게요.
function saveHandler() {
var date = $("#date").val();
var text = $("#text").val();
var mood = $("#mood").val();
var diary = `<p>${date}: ${text} - ${mood}</p>`;
$("#result").html(diary);
}
$(document).ready(function() {
$("#save").click(saveHandler);
});
로컬저장소에 저장하기
사용자가 입력한 일기를 로컬저장소에 저장하는 방법은 간단합니다. diary 키 일기를 저장합니다.
function saveHandler() {
var date = $("#date").val();
var text = $("#text").val();
var mood = $("#mood").val();
var diary = `<p>${date}: ${text} - ${mood}</p>`;
$("#result").html(diary);
localStorage.setItem("diary", diary);
}
이렇게 하면 최근에 사용자가 입력한 값이 저장될겁니다. 개발자 도구에서 저장소를 한 번 볼까요?
저장에 성공했습니다. 근데 이 방식에는 문제가 있군요. 지금의 코드는 최근 입력한 일기를 저장할 수는 있지만 과거의 일기를 함께 저장하지는 못합니다. 이 문제는 나중에 해결하도록 하죠!
저장된 일기 출력하기
컴퓨터를 껐다 켜도 과거의 일기를 다시 볼 수 있도록 저장된 일기를 출력할 시간입니다. localStorage의 getItem() 함수를 사용하여 일기를 가져옵니다. 그리고 result에 출력합니다.
💡 saveHandler() 함수 안의 diary 변수에서 var를 삭제합니다. 그리고 최상단에 diary 변수를 빈칸으로 정의합니다. 이렇게 하면 diary 변수를 모든 함수에서 사용할 수 있도록 설정하는 방법인데 이런 변수를 “전역 변수”라고 합니다.
var diary = "";
function saveHandler() {
var date = $("#date").val();
var text = $("#text").val();
var mood = $("#mood").val();
diary = `<p>${date}: ${text} - ${mood}</p>`;
$("#result").html(diary);
localStorage.setItem("diary", diary);
}
$(document).ready(function() {
diary = localStorage.getItem("diary");
$("#result").html(diary);
$("#save").click(saveHandler);
});
이렇게 코드를 작성하면 과거의 일기가 잘 보이네요.
과거의 일기를 지우지 않고 누적시키기
위의 코드로 일기를 저장하고 저장된 일기를 출력시키는 것까지 완료했습니다. 문제점은 오늘 일기를 작성하면 과거의 일기가 지워지고 오늘 일기만 저장된다는 점인데요. 이 문제를 해결하는 방법은 정말 간단합니다. 일기를 저장하기전에 과거의 일기를 더해서(+) 저장하면 끝!
diary = `<p>${date}: ${text} - ${mood}</p>` + diary;
이렇게 하면 오늘의 일기 뒤에 과거의 일기가 더해져서 저장된답니다. 이렇게 하면 최신 일기부터 위에서 아래로 보여지겠죠! 한 번 해볼까요?
만약 과거 일기부터 위에서 보고싶다면 아래와 같이 코드를 수정합니다.
diary = diary + `<p>${date}: ${text} - ${mood}</p>`;
null 예외 처리하기
위의 스크린샷에서도 볼 수 있지만 위의 코드로 처음 일기를 작성할 경우 null 값이 가장 처음에 들어가는 것을 볼 수 있습니다. null 값이 저장되는 이유는 첫 일기 작성 전에 localStorage.getItem(”diary”) 코드로 과거의 일기를 불러올 때 로컬스토리지에 저장된 값이 하나도 없어서 생기는 문제인데요. 이 문제를 해결하기 위해 아래와 같이 코드를 작성합니다.
$(document).ready(function() {
diary = localStorage.getItem("diary");
if (diary == null) {
diary = "";
}
$("#result").html(diary);
$("#save").click(saveHandler);
});
전체 코드
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>일기장</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="container">
<h1>일기장</h1>
<input type="date" id="date" />
<input type="text" id="text" />
<select id="mood">
<option value="행복">행복</option>
<option value="보통">보통</option>
<option value="슬픔">슬픔</option>
</select>
<button type="button" id="save">저장하기</button>
<div id="result"></div>
</main>
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="script.js"></script>
</body>
</html>
var diary = "";
function saveHandler() {
var date = $("#date").val();
var text = $("#text").val();
var mood = $("#mood").val();
diary = `<p>${date}: ${text} - ${mood}</p>` + diary;
$("#result").html(diary);
localStorage.setItem("diary", diary);
}
$(document).ready(function() {
diary = localStorage.getItem("diary");
if (diary == null) {
diary = "";
}
$("#result").html(diary);
$("#save").click(saveHandler);
});
4-5. Bootstrap을 활용한 일기장 디자인 꾸미기
입력 꾸미기
이번에는 Bootstrap의 Floating labels를 이용하여 멋드러지게 꾸며보겠습니다.
Floating labels 문서: https://getbootstrap.com/docs/5.2/forms/floating-labels/
<div class="row g-2 mb-3">
<div class="col-md">
<div class="form-floating">
<input type="date" class="form-control" id="date">
<label for="date">오늘 날짜를 입력해주세요</label>
</div>
</div>
<div class="col-md">
<div class="form-floating">
<select class="form-select" id="mood">
<option value="행복">행복</option>
<option value="보통">보통</option>
<option value="슬픔">슬픔</option>
</select>
<label for="mood">오늘 기분은 어땠나요?</label>
</div>
</div>
</div>
<div class="form-floating mb-3">
<input type="text" class="form-control" id="text">
<label for="text">오늘 있었던 일을 기록하세요</label>
</div>
<button type="button" id="save" class="btn btn-primary">저장하기</button>
기록 꾸미기
기록 부분은 List group의 Custom content로 꾸며보겠습니다. 주의해야 할 점은 일기장 기록의 경우 JavaScript 부분의 코드 수정도 필요하단 점 잊지마시구요. index.html 에 미리 작성한 후 script.js로 옯기시면 편합니다.
List group - Custom content 문서: https://getbootstrap.com/docs/5.2/components/list-group/#custom-content
기본 List group 코드
<div class="list-group" id="result">
<a href="#" class="list-group-item list-group-item-action" aria-current="true">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">List group item heading</h5>
<small>3 days ago</small>
</div>
<small>And some small print.</small>
</a>
</div>
index.html
<div class="list-group" id="result"></div>
script.js
diary = `<a href="#" class="list-group-item list-group-item-action" aria-current="true">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">${text}</h5>
<small>${date}</small>
</div>
<small>${mood}</small>
</a>` + diary;
전체 코드
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>일기장</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<main class="container">
<h1>일기장</h1>
<div class="row g-2 mb-3">
<div class="col-md">
<div class="form-floating">
<input type="date" class="form-control" id="date">
<label for="date">오늘 날짜를 입력해주세요</label>
</div>
</div>
<div class="col-md">
<div class="form-floating">
<select class="form-select" id="mood">
<option value="행복">행복</option>
<option value="보통">보통</option>
<option value="슬픔">슬픔</option>
</select>
<label for="mood">오늘 기분은 어땠나요?</label>
</div>
</div>
</div>
<div class="form-floating mb-3">
<input type="text" class="form-control" id="text">
<label for="text">오늘 있었던 일을 기록하세요</label>
</div>
<button type="button" id="save" class="btn btn-primary mb-3">저장하기</button>
<div class="list-group" id="result"></div>
</main>
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="script.js"></script>
</body>
</html>
script.js
var diary = "";
function saveHandler() {
var date = $("#date").val();
var text = $("#text").val();
var mood = $("#mood").val();
diary = `<a href="#" class="list-group-item list-group-item-action" aria-current="true">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">${text}</h5>
<small>${date}</small>
</div>
<small>${mood}</small>
</a>` + diary;
$("#result").html(diary);
localStorage.setItem("diary", diary);
}
$(document).ready(function() {
diary = localStorage.getItem("diary");
if (diary == null) {
diary = "";
}
$("#result").html(diary);
$("#save").click(saveHandler);
});
4-6. 오픈소스 라이브러리 사용하기
오픈소스 라이브러리 검색하기
우리는 일기에 기분을 쓸 때 그 날의 기분을 행복, 보통, 슬픔으로 표현했는데 이것을 이모지(😠 😞 😐 😊 😃)로 표현할 수 있다면 더 멋지겠죠? 다른 사람들이 만들어놓은 오픈소스 라이브러리를 검색하여 만들어보겠습니다!
구글에 “jquery emoji rating plugin”이라고 검색합니다.
가장 상단에 나오는 Basic Emoji Rating Plugin For jQuery - EmojiRating 글에 들어가보도록 하겠습니다.
플러그인 페이지: https://www.jqueryscript.net/other/Emoji-Rating-Plugin-jQuery.html
이 플러그인은 마우스로 이모지를 선택하여 기분을 표현할 수 있는 훌륭한 플러그인이네요. 적용하는 방법도 나와있고 “Go to website” 버튼을 눌러 소스코드를 확인할 수도 있습니다.
소스코드: https://github.com/mrmins/EmojiRaiting
emoji.js 파일 또는 emoji.min.js 파일을 눌러 다운로드합니다. 그리고 그 파일을 우리가 만든 part4 폴더로 복사합니다
💡 emoji.js 와 emoji.min.js 파일의 내용은 완전히 동일합니다. 차이가 있다면 emoji.min.js는 압축을 해서 용량이 더 작아요.
이모지 플러그인 적용하기
이모지 플러그인을 불러오기 위해 아래쪽에 다음과 같이 작성합니다. (순서 중요!)
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="emoji.min.js"></script>
<script src="script.js"></script>
GitHub에 나와있는 문서를 참고하여 아래와 같이 코드를 작성합니다.
<div class="row g-2 mb-3">
<div class="col-md">
<div class="form-floating">
<input type="date" class="form-control" id="date">
<label for="date">오늘 날짜를 입력해주세요</label>
</div>
</div>
<div class="col-md">
<small style="color: gray;">오늘 기분은 어땠나요?</small>
<div id="emoji"></div>
</div>
</div>
script.js
$(document).ready(function() {
$("#emoji").emoji();
... 생략 ...
});
원하는 이모지로 바꾸기
여러분들이 원하는 이모지로 바꿀 수 있는 기능이 있습니다. 먼저 아래와 같이 작성하고 emojis 변수안에 있는 이모지를 바꿔줍니다. 아래 사이트에서 이모지를 복사할 수 있습니다. 여러분들이 원하는 이모지로 바꿔보세요!
Get Emoji: https://getemoji.com/
var emojis = ["💙","💚","💛","🧡","❤️"]
... 생략 ...
$(document).ready(function() {
$("#emoji").emoji({
emojis: emojis
});
... 생략 ...
기본 이모지는 다음과 같습니다
var emojis = ["😠","😞","😐","😊","😃"];
이모지를 클릭했을 때 기분값 저장하기
이모지가 화면에 출력되고 여러분들 마음대로 선택할 수 있다면 라이브러리 적용은 완료되었습니다. 이제 이모지로부터 값을 전달받아 일기가 저장될 때 로컬스토리에 함께 저장하면 되겠죠?
사용자가 이모지를 클릭했을 때 실행할 함수를 아래와 같이 지정할 수 있습니다.
function emojiSelected(event, value) {
console.log(value);
}
$("#emoji").emoji({
emojis: emojis,
callback: emojiSelected
});
개발자 콘솔을 열어 이모지를 클릭하면서 로그를 확인하면 1 ~ 5 사이의 값이 출력되는 것을 확인할 수 있죠. 우리는 다음과 같은 코드를 작성하여 emoji 변수에 사용자가 선택한 이모지를 저장할 수 있습니다.
var emoji = "😐";
function emojiSelected(event, value) {
if (value == 1) {
emoji = "😠";
} else if (value == 2) {
emoji = "😞";
} else if (value == 3) {
emoji = "😐";
} else if (value == 4) {
emoji = "😊";
} else if (value == 5) {
emoji = "😃";
}
}
일기를 로컬스토리지에 저장할 때 mood 대신 emoji를 저장하도록 코드를 수정합니다. mood는 이제 필요없으니 삭제할게요!
function saveHandler() {
var date = $("#date").val();
var text = $("#text").val();
diary = `<a href="#" class="list-group-item list-group-item-action" aria-current="true">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">${text}</h5>
<small>${date}</small>
</div>
<small>${emoji}</small>
</a>` + diary;
$("#result").html(diary);
localStorage.setItem("diary", diary);
}
4-7. 기타 기능 구현하기
입력이 비어있을 때 저장하지 않도록 처리하기
사용자가 아무것도 입력하지 않은 상태로 저장하기 버튼을 누르면 아래와 같이 저장됩니다.
값이 비어있을 때는 저장되지 않도록 예외처리 해주죠. saveHandler()에 아래 코드를 작성합니다.
if (date == "" || text == "") {
return false;
}
위 코드는 date에 빈값이 있거나(OR) 텍스트에 빈값이 있으면 실행을 종료하라는 코드입니다.
저장 후 값 초기화하기
지금의 일기장은 값을 저장하고 난 후 마지막에 입력한 값이 그대로 남아있습니다. 사용자가 [저장하기] 버튼을 누르면 입력한 값이 초기화될 수 있도록 코드를 작성해보죠! saveHandler() 마지막에 다음과 같은 코드를 작성합니다.
$("#date").val("");
$("#text").val("");
홈페이지와 연결하기
서비스를 완성했으니 main.html과 연결하겠습니다. part2, part3의 index.html에도 일기장 링크를 추가해야 합니다.
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/main.html">빵형의 홈페이지</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav me-auto mb-2 mb-md-0">
<li class="nav-item">
<a class="nav-link" aria-current="page" href="/main.html">홈</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/part2/index.html">사칙연산 계산기</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/part3/index.html">대출이자 계산기</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/part4/index.html">일기장</a>
</li>
</ul>
</div>
</div>
</nav>
stylecss
body {
min-height: 75rem;
padding-top: 4.5rem;
}
전체 코드
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>일기장</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="style.css">
</head>
<body>
<nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="/main.html">빵형의 홈페이지</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarCollapse">
<ul class="navbar-nav me-auto mb-2 mb-md-0">
<li class="nav-item">
<a class="nav-link" aria-current="page" href="/main.html">홈</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/part2/index.html">사칙연산 계산기</a>
</li>
<li class="nav-item">
<a class="nav-link" href="/part3/index.html">대출이자 계산기</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="/part4/index.html">일기장</a>
</li>
</ul>
</div>
</div>
</nav>
<main class="container">
<h1>일기장</h1>
<div class="row g-2 mb-3">
<div class="col-md">
<div class="form-floating">
<input type="date" class="form-control" id="date">
<label for="date">오늘 날짜를 입력해주세요</label>
</div>
</div>
<div class="col-md">
<small style="color: gray;">오늘 기분은 어땠나요?</small>
<div id="emoji"></div>
</div>
</div>
<div class="form-floating mb-3">
<input type="text" class="form-control" id="text">
<label for="text">오늘 있었던 일을 기록하세요</label>
</div>
<button type="button" id="save" class="btn btn-primary mb-3">저장하기</button>
<div class="list-group" id="result"></div>
</main>
<script src="https://code.jquery.com/jquery-3.6.1.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"></script>
<script src="emoji.min.js"></script>
<script src="script.js"></script>
</body>
</html>
script.js
var emoji = "😐";
var emojis = ["😠","😞","😐","😊","😃"];
var diary = "";
function emojiSelected(event, value) {
if (value == 1) {
emoji = "😠";
} else if (value == 2) {
emoji = "😞";
} else if (value == 3) {
emoji = "😐";
} else if (value == 4) {
emoji = "😊";
} else if (value == 5) {
emoji = "😃";
}
}
function saveHandler() {
var date = $("#date").val();
var text = $("#text").val();
if (date == "" || text == "") {
return false;
}
diary = `<a href="#" class="list-group-item list-group-item-action" aria-current="true">
<div class="d-flex w-100 justify-content-between">
<h5 class="mb-1">${text}</h5>
<small>${date}</small>
</div>
<small>${emoji}</small>
</a>` + diary;
$("#result").html(diary);
localStorage.setItem("diary", diary);
$("#date").val("");
$("#text").val("");
}
$(document).ready(function() {
$("#emoji").emoji({
emojis: emojis,
callback: emojiSelected
});
diary = localStorage.getItem("diary");
if (diary == null) {
diary = "";
}
$("#result").html(diary);
$("#save").click(saveHandler);
});
style.css
body {
min-height: 75rem;
padding-top: 4.5rem;
}