컨디션이 너무 안좋은날....
다시 DOM 학습!
Document Object Model
어제 배운 것 복습.. 흐름을 이해하자.
○ <div class="d-flex">
→ display box model에서 학습했었다. display:flex;는 행 방향으로 배치
p태그는 원래 블록요소인데, display:flex가 적용되어 한 행에 모두 표현된다.
cf) Document에서 Justify Content를 참고하자.
○ <div class="p-2 bg-primary flex-grow-1">Flex item 3</div>
grow-1 에서 1은 비율을 표현한 것이다.
◎ Align Items (수직정렬,수평정렬 때 중요)
→ Justify Content와 같이 쓰일 때 수평으로 배치 또는 수직으로 배치할 수 있다.
◎ border는 무엇인가?
→ 부트스트랩 항목에서 찾지 못했을 때 웬만한건 Utilities에 들어있다. 거기서 찾아보자.
◎ Border Radius
<span class="rounded-circle"></span> → 원을 그릴 때 유용
★ 선택자
CSS Selector Reference 항상 참고하자
https://www.w3schools.com/cssref/css_selectors.php
→ querySelector 를 사용할 때 선택자를 넣어주어야 되기 때문.
● ID로 element값을 받아오기.
<script>
function findElementById() {
// 둘 다 알아야 하지만 querySelector는 id뿐만 아니라 class등을 찾을 수 있다.
// 방법 1
var el_p1 = window.document.getElementById("p1"); // window.은 생략 가능하다.
console.log(el_p1);
// 방법 2 (유용하다)
el_p1 = document.querySelector("#p1"); // getElementById보다 훨씬 더 다양하게 활용할 수 있다. id뿐아니라 class, 태그 등등
}
</script>
<!-- body태그 안 -->
<button onclick="findElementById()" class="btn btn-info btn-sm">ID로 찾기</button>
<p id="p1" class="border border-danger bg-success" style="width: 100px; height: 100px;"></p>
→ 해당 id를 보유하고 있는 태그를 컨트롤할 수 있게 된다.
● Class로 찾기
<script>
function findElementByClass() {
// 방법 1
var el_class1 = document.getElementsByClassName("class1"); // HTMLCollection 타입으로 리턴
console.log(el_class1);
console.log(el_class1[0]); // 배열은 아니지만(콜렉션 타입이지만) 배열처럼 사용할 수 있다.
for(var el of el_class1){ // Collection 타입도 배열처럼 관리한다.. 따라서 for문이 가능한 것
console.log(el);
}
console.log("");
// 방법 2
el_class1 = document.querySelectorAll(".class1"); // 두 개 이상 가져올 땐 All을 붙인다. // NodeList 타입 리턴
console.log(el_class1);
console.log(el_class1[0]); // 타입은 다르지만 사용 방법은 같다..
for(var el of el_class1){
console.log(el);
}
}
</script>
<!-- body태그 안 -->
<button onclick="findElementByClass()" class="btn btn-info btn-sm">Class로 찾기</button>
<p class="class1 border border-dark bg-danger" style="width: 100px; height: 100px;"></p>
→ Collection 타입도 배열처럼 관리한다. 따라서 for문이 가능한 것
★ querySelector와 querySelectorAll을 정말 많이 사용한다.
● Tag(태그)로 찾기
<script>
function findElementByTag() {
// 방법 1
var el_p = document.getElementsByTagName("p"); // 태그를 직접 입력
for(var el of el_p){
console.log(el);
}
// 방법 2
el_p = document.querySelectorAll("p"); // 태그를 직접 입력
for(var el of el_p){
console.log(el);
}
}
</script>
<!-- body태그 안 -->
<button onclick="findElementByTag()" class="btn btn-info btn-sm">Tag로 찾기</button>
<p class="class1 border border-dark bg-danger" style="width: 100px; height: 100px;"></p>
<p class="class1 border border-danger bg-info" style="width: 100px; height: 100px;"></p>
● 체크된 것만 찾기
<script>
function findElementByChecked() {
var el_checked = document.querySelectorAll("[name=skill]:checked"); // 사용법 숙지
for(var el of el_checked){
console.log(el);
}
}
</script>
<!-- body태그 안 -->
<button onclick="findElementByChecked()" class="btn btn-info btn-sm">체크된 것만 찾기</button>
<div class="d-flex align-items-center">
<div class="me-3"><input type="checkbox" name="skill" value="java"/>java</div>
<div class="me-3"><input type="checkbox" name="skill" value="javascript"/>javascript</div>
<div class="me-3"><input type="checkbox" name="skill" value="vue"/>vue</div>
</div>
.→ 체크박스의 name속성은 해당 관련 내용을 묶어주는 역할을 한다. (name이 체크박스를 그룹핑하는 것)
속성과 속성 데이터값을 선택자로 이용하는 법. https://www.w3schools.com/cssref/css_selectors.php 사이트 참고하여 공부..
■ Element 변경 및 추가, 삭제
● 엘리먼트의 속성 변경
<script>
function changeContent(){
let el_div1 = document.querySelector("#div1");
// 기존 내용을 대체 // 해당 HTML에 접근하려면 .innerHTML을 쓴다
el_div1.innerHTML = "<img src='/htmlcssjs/resources/image/ul/king1.jpg' width='150'/>";
}
</script>
<!-- body태그 안 -->
<button onclick="changeContent()" class="btn btn-warning btn-sm">변경</button>
→ 해당 HTML element에 접근하려면 .innerHTML을 쓴다.
element 타입이 무엇인지 파악하자..
● 엘리먼트의 속성 추가
<script>
function appendContent(){
let el_div1 = document.querySelector("#div1");
// 새로운 엘리먼트 생성 // 만약 id를 갖고 있는 엘리먼트라면 맨 마지막의 내용을 삭제하는 것도 해당 id로 찾아서 할 수 있다.
const el_img = document.createElement("img");
el_img.setAttribute("src", "/htmlcssjs/resources/image/ul/king2.jpg");
el_img.setAttribute("width", "150");
// 기존 내용 뒤에 추가
el_div1.appendChild(el_img);
}
</script>
<!-- body태그 안 -->
<button onclick="appendContent()" class="btn btn-warning btn-sm">추가</button>
appendChild() → 상속에서의 Child가 아니라 해당 관련 내용이란 것
● 엘리먼트의 속성 삭제
<script>
function deleteContent(){
let el_div1 = document.querySelector("#div1");
// 기존 내용을 모두 삭제
//el_div1.innerHTML = "";
// 맨 뒤에 있는 엘리먼트 삭제
el_div1.removeChild(el_div1.lastElementChild);
}
</script>
<!-- body태그 안 -->
<button onclick="deleteContent()" class="btn btn-warning btn-sm">삭제</button>
→ .innerHTML로 한번에 값을 깔끔히 지워버리는 것을 보며 틀에 박힌 생각 깨보자.
● 이미지 사이즈 변경해보기
<script>
function changeSize(){
var el_img1 = document.querySelector("#img1");
el_img1.style.width = "50px"; // style로 접근할 때 가능하면 px을 생략하지말고 단위를 넣어주는 것이 좋다.
el_img1.style.height = "50px";
// style = "border-radius:50px; border-width:5px; border-color:red; border-style:solid"
el_img1.style.borderRadius = "25px";
el_img1.style.borderWidth = "5px";
el_img1.style.borderColor = "red";
el_img1.style.borderStyle = "solid";
}
</script>
<!-- body태그 안 -->
<button onclick="changeSize()" class="btn btn-primary btn-sm">크기 변경</button>
<hr/>
<div id="div2">
<img id="img1" src="/htmlcssjs/resources/image/ul/king3.jpg" width="200" />
<img class="rounded-circle" src="/htmlcssjs/resources/image/ul/king4.jpg"
width="200" height="200"/>
</div>
→버튼을 만들고 그 버튼을 클릭했을 때, 특정한 id나 class 등으로 접근하여 엘리먼트 변경이 가능하다.
● 속성값 변경해보기
<script>
function chageAttribute(){
var el_img2 = document.querySelector("#img2");
//el_img2.setAtrribute("src", "/htmlcssjs/resources/image/ul/king5.jpg")
el_img2.src = "/htmlcssjs/resources/image/ul/king6.jpg"; // 해당 엘리먼트의 속성값에 접근하여 값을 변경
}
</script>
<!-- body태그 안 -->
<button onclick="chageAttribute()" class="btn btn-primary btn-sm">속성값 변경</button>
<hr/>
<div id="div3">
<img id="img2"
src="/htmlcssjs/resources/image/ul/king5.jpg"
class="rounded-circle"
width="200" height="200"/>
</div>
→ 속성값에 접근하는 방법.. Document를 보며 사용
■ DOM Form의 유효성 검사 ★
form 형식이 어떻게 이루어져 있는지와 유효성 검사가 어떻게 이루어지는지를 배웠다.
전체적인 흐름을 이해하려 노력했다.
body태그 안에 form이 어떻게 구성되어있는지 먼저 보자.
<!-- body태그 안의 form -->
<form id="joinForm" name="joinForm" action="/htmlcssjs/dom" onsubmit="handleCheckData()" novalidate="novalidate">
<div class="mb-3">
<label for="uid" class="form-lable">ID</label>
<input type="text" class="form-control" id="uid" name="uid" value="Abc123"/>
<span id="uidSpan" class="form-text">알파벳 대소문자, 숫자를 혼용해서 6자 이상 10장 이하</span>
</div>
<div class="mb-3">
<label for="email" class="form-lable">Email</label>
<input type="email" class="form-control" id="email" name="email" value="Abc123@mycompany.com"/>
</div>
<div class="mb-3">
<label for="password" class="form-lable">Password</label>
<input type="password" class="form-control" id="password" name="password" value="Abc12345"/>
<span id="passwordSpan" class="form-text">알파벳 대소문자, 숫자를 혼용해서 8자 이상 15장 이하</span>
</div>
<div class="mb-3">
<label for="phone" class="form-lable">Phone</label>
<input type="text" class="form-control" id="phone" name="phone" value="010-123-1234"/>
<span id="phoneSpan" class="form-text">예) 010-123-1234, 010-1234-1234</span>
</div>
<div class="mb-3">
<label for="city" class="form-lable">City</label>
<select id="city" name="city" class="form-control">
<option value="seoul">서울</option>
<option value="pusan">부산</option>
<option selected value="jeju">제주</option>
</select>
</div>
<div class="mb-3">
<label class="form-lable">Hobby</label>
<div class="d-flex">
<div class="form-check me-3">
<input class="form-check-input" type="checkbox" id="hobby1" name="hobby" value="movie" checked/>
<label class="form-check-lable" for="hobby1"> 영화 </label>
</div>
<div class="form-check me-3">
<input class="form-check-input" type="checkbox" id="hobby2" name="hobby" value="trip" checked/>
<label class="form-check-lable" for="hobby2"> 여행 </label>
</div>
<div class="form-check me-3">
<input class="form-check-input" type="checkbox" id="hobby3" name="hobby" value="game" />
<label class="form-check-lable" for="hobby3"> 게임 </label>
</div>
</div>
</div>
<div class="mb-3">
<label class="form-lable">Job</label>
<div class="d-flex">
<div class="form-check me-3">
<input class="form-check-input" type="radio" id="job1" name="job" value="developer" />
<label class="form-check-lable" for="job1"> 개발자 </label>
</div>
<div class="form-check me-3">
<input class="form-check-input" type="radio" id="job2" name="job" value="designer" checked/>
<label class="form-check-lable" for="job2"> 디자이너 </label>
</div>
<div class="form-check me-3">
<input class="form-check-input" type="radio" id="job3" name="job" value="manager" />
<label class="form-check-lable" for="job3"> 매니저 </label>
</div>
</div>
</div>
<div class="text-center">
<input type="submit" class="btn btn-primary btn-sm" value="Join" />
<input type="reset" class="btn btn-primary btn-sm" value="Reset" />
</div>
</form>
폼의 속성에 novalidate="novalidate"를 추가해주게 되면 폼 자체가 유효성 검사를 하지 않게 된다. 따라서 위의 코드의 폼을 생각하면 아이디, 이메일, 비밀번호, 휴대폰 번호 등 개발자가 직접 유효성 검사를 해주어야 한다.
(novalidate="novalidate"는 novalidate만 써주어도 적용된다)
☞ 위 코드의 적용된 화면
★ 자바스크립트에서 유효성 검사
<script>
function handleCheckData(){
console.log("입력 데이터를 검사합니다.");
// form 태그의 action 기능을 수행하지 않도록 함.
event.preventDefault(); // 이벤트가 일어나지 않도록 하는 실행문
// 각 입력 양식의 데이터 검사
var totalResult = true;
// 1) ID 검사 -----------------------------------------------------------
var el_uid = document.querySelector("#uid"); // 방법 1
// el_uid = document.joinForm.uid; // 방법 2 (동적 필드 메소드 개념)
console.log("uid: ", el_uid.value); // 해당 엘리먼트의 값 확인
var uidPattern = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{6,10}$/; // 알파벳 대소문자, 숫자를 혼용해서 6자 이상 10장 이하 정규표현식
var uidResult = uidPattern.test(el_uid.value); // 엘리먼트의 값이 정규표현식을 만족하는지 true, false 반환
console.log("uidResult:", uidResult); // 브라우저 콘솔창에서 확인
var el_uid_span = document.querySelector("#uidSpan"); // uid 엘리멘트 안에 있는 span태그에 id를 부여하여 엘리멘트를 찾음
if(uidResult){ // 만약 엘리먼트의 값이 정규표현식을 만족한다면
el_uid.classList.remove("bg-danger"); // 해당 태그 바탕색 원래대로 // 형식이 맞다면 다시 없애줌.
el_uid_span.classList.remove("text-danger"); // 형식 힌트 메시지의 글자색을 원래대로
}else { // 엘리먼트의 값이 정규표현식을 만족하지 않는다면
el_uid.classList.add("bg-danger"); // 해당 태그 바탕색 빨갛게
// 우리는 부트스트랩을 사용하고 있기 때문에 클래스로 접근
el_uid_span.classList.add("text-danger"); // 형식 힌트 메시지를 빨갛게 만들어줌
totalResult = false; // 전체 데이터 양식 검사
}
// 나머지 검사들도 1번과 비슷하게 해주면 된다.
// 2) email 검사 -----------------------------------------------------------
var el_email = document.querySelector("#email");
var emailPattern = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/;
var emailResult = emailPattern.test(el_email.value);
if(emailResult){
el_email.classList.remove("bg-danger");
} else{
el_email.classList.add("bg-danger");
totalResult = false;
}
// 3) Password 검사 -----------------------------------------------------------
var el_password = document.querySelector("#password");
var passwordPattern = /^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,15}$/;
var passwordResult = passwordPattern.test(el_password.value);
var el_password_Span = document.querySelector("#passwordSpan");
if(passwordResult){
el_password_Span.classList.remove("text-danger");
} else {
el_password_Span.classList.add("text-danger");
totalResult = false;
}
// 4) Phone 검사 -----------------------------------------------------------
var el_phone = document.querySelector("#phone");
var phonePattern = /^(010|011)-\d{3,4}-\d{4}$/;;
var phoneResult = phonePattern.test(el_phone.value);
var el_phone_Span = document.querySelector("#phoneSpan");
// 힌트 글 변경해주기!
if(phoneResult){
// .innerHTML로 값을 변경해준다!
el_phone_Span.innerHTML = "예) 010-123-1234, 010-1234-1234";
el_phone_Span.classList.remove("text-danger");
} else {
el_phone_Span.innerHTML = "형식에 맞게 다시 입력해주세요.";
el_phone_Span.classList.add("text-danger");
totalResult = false;
}
// 5) 전체 유효성 검사 결과가 true일 경우 -----------------------------------------------------------
if(totalResult){
var el_form = document.querySelector("#joinForm");
// el_form = document.joinForm; // 이것도 가능하다.. name 때문에 동적속성으로 추가가 된다.
// 강제적(수동적)으로 form의 프리벤트로 막아놨던 action 기능을 수행하도록 하려면?
el_form.submit();
}
}
</script>
■ jQuery 시작
여태까지 순수 자바스크립트를 사용하였다. 순수 자바스크립트를 바닐라 자바스크립트라고 부르기도 한다고 한다...
○ jQuery 사용해보기
<script>
// jQuery를 사용한 함수
function changeBgColor1(){
var jq_color_div = $(".colorDiv"); // css 선택자 문법으로 사용 // jquery 객체를 만들어줌.
// jQuery 객체 얻기
console.log(jq_color_div);
// jQuery 객체가 가지고 있는 메소드 호출
// jq_color_div.css("background-color", "orange"); // 일괄적으로 전체에 적용됨
jq_color_div.addClass("bg-danger"); // jQuery는 element객체 타입으로 가져오는 것이 아니라 jQuery객체로 가져온다.
// jQuery를 쓰지않는다면? for문을 이용하여 대입해주어야 한다.
}
// 자바스크립트만을 사용한 함수
function changeBgColor2(){
// HTML NodeList 객체 얻기
var el_color_div = document.querySelectorAll(".colorDiv");
console.log(el_color_div);
// for문으로 반복해서 스타일 적용
// Element 객체가 가지고 있는 속성과 메소드 사용
for(var el of el_color_div){
// el.style.backgroundColor = "orange";
el.classList.add("bg-danger");
}
}
</script>
<body>
<button onclick="changeBgColor1()" class="btn btn-outline-info btn-sm">배경색 변경</button>
<hr/>
<div class="d-flex">
<div class="colorDiv me-3 border" style="width:100px; height:100px"></div>
<div class="colorDiv me-3 border" style="width:100px; height:100px"></div>
<div class="colorDiv me-3 border" style="width:100px; height:100px"></div>
</div>
</body>
오늘은 맛보기로 여기까지 수업.. 내일 jQuery 계속해서 학습할 것이다.
◈ jQuery를 사용하는 이유?
1. 간편한 DOM 조작
→ 순수 자바스크립트 코드보다 간결하게 작성할 수 있다.
2. 브라우저 호환성
→ jQuery는 다양한 브라우저에서 일관된 동작을 보장하여 여러 브라우저 간 호환성 문제를 해결해야 할 때 사용하면 비교적 쉽게 해결할 수 있다.
3. AJAX (Asynchronous JavaScript and XML) 요청 처리
→ AJAX 요청을 보내고 받는 기능을 쉽게 구현할 수 있도록 지원. 이를 통해 비동기적으로 서버와 통신하여 웹 페이지를 동적으로 업데이트할 수 있음.
등등... 있다고 한다.
직접 사용하며 공부하고 정리해보자.
'JAVA' 카테고리의 다른 글
29일차 2024 - 4 - 5 (Git과 GitHub) (0) | 2024.04.05 |
---|---|
28일차 2024 - 4 - 4 (0) | 2024.04.04 |
26일차 2024 - 4 - 2 (0) | 2024.04.02 |
25일차 2024 - 4 - 1 (0) | 2024.04.01 |
24일차 2024 - 3 - 29 (2) | 2024.03.29 |