index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Momentum App</title>
</head>
<body>
<div id="login-form">
<!-- div태그로 묶고 id 생성, 원하는 태그 찾기위해 -->
<input type="text" placeholder="What is your name?" />
<!-- 사용자는 텍스트를 입력, type='text'로 지정해 줌 -->
<!-- input박스 안에 미리보기로 작성할 말은 placeholder=""로 지정 -->
<button>Log In</button>
</div>
<script src="app.js"></script>
</body>
</html>
app.js
const loginInput = document.querySelector("#login-form input");
const loginButton = document.querySelector("#login-form button");
//querySelector 로 id태그를 쓸때는 #를 써야함
//getElementById 로 id태그를 쓸땐 #를 안써도 OK
// console.dir() 불러온 함수의 내부(element)를 세부적으로 보여줌
function onLoginBtnClick() {
console.log("hello", loginInput.value);
}
loginButton.addEventListener("click", onLoginBtnClick);
4.0과 다르게 input에 추가적으로 속성을 지정해줌
→ required maxlength="15"
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css"></link>
<title>Moment App</title>
</head>
<body>
<script src="app.js"></script>
<form id="login-form">
<input required maxlength="15" type="text"
placeholder="What is your name?"
/>
<!-- input에 입력하는 text의 길이를 15로 제한함 -->
<input type="submit" value="Log In" />
</form>
</body>
</html>
→ 이 방법은 browser에서
>>if<<
위 html에서 maxlength가 없다면, js코드에서 조건 설정을 해줘야 함, 근데 이 방식 별로임;
_절대 user를 믿지마. 절대 믿으면 안 돼
app.js
const loginInput = document.querySelector("#login-form input");
const loginButton = document.querySelector("#login-form button");
function onLoginBtnClick() {
console.log("hello", loginInput.value);
const username = loginInput.value;
if (username === "") {
alert("제발 니 이름써");
} else if (username.length > 15) {
alert("니 이름 너무 길어.");
}
}
loginButton.addEventListener("click", onLoginBtnClick);
1) part 1
function onLoginSubmit(event){
event.preventDefault();
// 브라우저가 기본 동작을 실행하지 못하게 막기
// event object는 preventDefault함수를 기본적으로 갖고 있음
console.log(event);
}
loginForm.addEventListener("submit", onLoginSubmit);
// submit 이벤트가 발생한다면, onLoginSubmit함수를 실행시킨다는 의미
// JS는 onLoginSubmit함수 호출시 인자를 담아서 호출함. 해당 인자는 event object를 담은 정보들
JS는(기본적으로)argument를 담아서 함수를 호출하는데, 이 argument가 기본 정보들을 제공하고 있음
2) part 2
style.css
.hidden{
display: none
}
app.js
function onLoginSubmit(event) {
event.preventDefault(); //자동 새로고침 방지
const username = loginInput.value;
loginForm.classList.add("hidden"); //로그인 폼 숨김
console.log(username);
}
loginForm.addEventListener("submit", onLoginSubmit);
>> 사용자에게 이름을 입력받고 새로고침되지 않은 채로 로그임 폼을 숨김
* visibility:hidden은 공간은 그대로 두고 보이지만 않음 / display:none은 잡아둔 공간도 사라짐
index.html
<body>
<form id="login-form">
<input
required
maxlength="15"
type="text"
placeholder="What is your name?"
/>
<input type="submit" value="Log In" />
</form>
<h1 id="greeting" class="hidden"></h1>
<!-- 추가한 부분^ -->
<script src="app.js"></script>
</body>
app.js
const loginForm = document.querySelector("#login-form");
const loginInput = document.querySelector("#login-form input");
const loginButton = document.querySelector("#login-form button");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden"; //"hidden"을 두 개 이상 사용하기 때문에
function onLoginSubmit(event) {
event.preventDefault();
loginForm.classList.add(HIDDEN_CLASSNAME);
const username = loginInput.value;
greeting.innerText = "Hello " + username; //h1태그로 표시될 내용
greeting.classList.remove(HIDDEN_CLASSNAME);//h1태그에서 hidden class를 제거함
}
loginForm.addEventListener("submit", onLoginSubmit);
>> greeting.classList.remove(HIDDEN_CLASSNAME); 코드를 통해 hidden 됐던 문구가 나타남
"Hello " + username; ===
Hello ${username}
;
되도록 이면 후자의 방법을 사용
const HIDDEN_CLASSNAME = 'hidden';
관습: string만 포함된 변수는 대문자로 쓴다 + 중요한 변수가 아니기 때문에
1) localStorage.setItem(key, value)
: 로컬 저장소에 해당 키와 값을 저장함
2) localStorage.getItem(key)
: 로컬 저장소에 해당 키에 해당되는 값을 불러옴
3) localStorage.removeItem(key)
: 로컬 저장소에 해당 키에 해당되는 키, 값을 삭제함
app.js
const loginForm = document.querySelector("#login-form");
const loginInput = document.querySelector("#login-form input");
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";
function onLoginSubmit(event) {
event.preventDefault();
loginForm.classList.add(HIDDEN_CLASSNAME);
const username = loginInput.value;
localStorage.setItem("username", username);
// 로컬 저장소에서 "username"이라는 키값과 값을 저장함
greeting.innerText = `Hello ${username}`;
greeting.classList.remove(HIDDEN_CLASSNAME);
}
loginForm.addEventListener("submit", onLoginSubmit);
index.html
<body>
<form class="hidden" id="login-form">
<!-- class hidden 추가함 -->
<input
required
maxlength="15"
type="text"
placeholder="What is your name?"
/>
<input type="submit" value="Log In" />
</form>
<h1 id="greeting" class="hidden"></h1>
<script src="app.js"></script>
</body>
app.js
const greeting = document.querySelector("#greeting");
const HIDDEN_CLASSNAME = "hidden";
const USERNAME_KEY = "username";
function onLoginSubmit(event) {
event.preventDefault();
loginForm.classList.add(HIDDEN_CLASSNAME);
const username = loginInput.value;
localStorage.setItem(USERNAME_KEY, username);
paintGreetings(username);
}
function paintGreetings(username) {
greeting.innerText = `Hello ${username}`;
// username을 받고 greeting 아이디를 갖고 있는 태그 안에 Hello username이 뜨게 만듦
greeting.classList.remove(HIDDEN_CLASSNAME);
// greeting 아이디를 갖는 태그에 있는 class 값을 제거함
}
const savedUsername = localStorage.getItem(USERNAME_KEY);
// 저장되어 있는 username이라는 키에 들어있는 값을 불러옴
if (savedUsername === null) { // 저장된 username값이 없을 때
loginForm.classList.remove(HIDDEN_CLASSNAME);
loginForm.addEventListener("submit", onLoginSubmit);
} else {
paintGreetings(savedUsername);
}