const inp = document.querySelector('input');
inp.setCustomValidity('입력이 아무래도 뭔가 이상한 느낌이 들어요');
변경된 알람 메세지
⇒ 하지만 제출이 되지 않는다 !
알림 메세지 분기처리로 해결
const btn = document.querySelector('button');
const inp = document.querySelector('input');
btn.addEventListener('click', () => {
if (inp.validity.typeMismatch) {
inp.setCustomValidity('알맞은 양식의 이메일 주소를 입력하세요!');
} else {
inp.setCustomValidity('');
}
})
전체 input 요소에 적용하기
const btn = document.querySelector('button');
const inps = document.querySelectorAll('input');
btn.addEventListener('click', () => {
inps.forEach((inp) => {
validate(inp);
})
})
function validate(target) {
if (target.validity.valueMissing) {
target.setCustomValidity('값이 없습니다. 정신 차리자');
} else if (target.validity.typeMismatch) {
target.setCustomValidity('알맞은 양식의 데이터를 입력하세요!');
} else {
target.setCustomValidity('');
}
}
회고
프로젝트 시작전 form validation에 대해 다시 짚어가는 시간을 가졌다. 마침 HTML/CSS 정규 수업때 놓친게 많은 부분이었는데 추가적인 기능까지 알 수 있어 정말 유익했다. DOM 쓰는게 능숙하지 않아서 JS 커스텀 배운다고 할 때 겁먹었는데 생각보다 간단해서 이해하기 쉬웠다. 이 코드들은 두고두고 많이 활용될 것 같다ㅎ-ㅎ
// p 엘리먼트를 선택하고 숨긴다.
$("p").hide();
// test id를 가진 엘리먼트를 선택하고 표시한다.
$("#test").show();
// test class를 가진 엘리먼트를 선택하고 해당 엘리먼트의 내용을 변경한다.
$('.test').text('hello world');
// test id를 가진 엘리먼트의 내용을 변경한다.
$('#test').html('<b>hello</b> world');
// test id를 가진 엘리먼트를 선택하고 폰트컬러를 red로 변경한다.
$('#test').css('color', 'red');
// img 엘리먼트를 선택하고 src속성의 값을 변경한다.
$('img').attr('src', 'a.jpg');
// one 클래스 하위에 존재하는 two 클래스를 가진 엘리먼트를 선택하고 내용을 변경한다.
$('.one .two').text('hello world');
// two라는 id를 가진 p 엘리먼트를 선택하고 내용을 변경한다.
$('p#two').text('hello world');
// test class를 가진 엘리먼트를 클릭시에 alert을 실행한다.
$(".test").click(function(){
alert("클릭!");
});
// test class를 가진 엘리먼트를 클릭시에 해당 엘리먼트의 폰트 컬러를 red로 변경한다.
$(".test").click(function(){
$(this).css('color', 'red');
});
버전별 차이
jquery-1.x : 구형 브라우저 대부분 지원, 가장 안정적인 버전, 최신 버전과 호완문제가 있어 migrate를 함께 넣어주어야 합니다.
jquery-2.x : 익스플로러 8버전 버림, 따라서 파일 크기 감소. 9버전 이상을 호환할 것이라면 2.x를 사용할 것!
jquery-3.x : Promises와 ajax, when, data 등 여러 최신 플러그인과 HTML5 호환
jQuery 선택자(Selector)
// p 태그 선택하기
$("p")
// div태그안에 있는 p태그 선택하기
$("div p")
// id가 main인 엘리먼트를 선택하기
$("#title")
// class가 btn인 엘리먼트를 선택하기
$(".btn")
// 여러 클래스를 가진 요소 선택하기
$(".class1.class2")
// 다른 태그 내에 있는 특정 태그를 가진 모든 요소 선택하기
$("ul li a")
// p 아래 모든 a 요소
$("ul a")
// p 바로 아래 자식인 a 요소
$("ul > a")
// li태그중 3번째
// $("li").eq(3).css("color", "red" );
// li태그중 6번째 이상
// $("li:gt(6)").css("color", "red");
// li태그중 2번째 마다
// $("li:nth-child(2n)").css("color", "red");
// li태그중 3번째 마다
// $("li:nth-child(3n)").css("color", "red");
// li태그중 첫번째
// $("li:first").css("color", "red");
// li태그중 마지막
// $("li:last").css("color", "red");
// li태그중 짝수번째
// $("li:even").css("color", "red");
// li태그중 홀수번째
// $("li:odd").css("color", "red");
속성 필터
해당하는 속성을 가지고 있는 노드
[href]
input[name]
해당 속성의 값이 문자열과 일치하는 노드
input[name='newmilk']
해당 속성의 값에서 주어진 문자열을 포함하고 있는 노드
input[name*='man’]
// href 속성이 있는 요소
$("[href]").css("background-color", "red");
// input 중 name속성이 있는 요소
$("input[name]").css("background-color", "red");
// name 속성의 값이 newmilk인 요소
$("input[name='newmilk']").val("newmilk");
// name 속성의 값에서 man이 포함되는 요소
// $("input[name*='man']").val("man이 포함된 요소");
a태그 예제
// title 어트리뷰트를 갖는 하이퍼 링크와 일치된다.
$("a[title]")
// href 값이 mailto로 시작하는 하이퍼 링크와 일치된다.
$('a[href^="mailto:"]')
// pdf 파일에 링크가 걸린 모든 하이퍼링크와 일치된다.
$('a[href$=".pdf"]')
// studyin.co.kr이라는 값이 포함되어 있는 모든 하이퍼 링크와 일치된다.
$('a[href*="studyin.co.kr"]')
// div.child를 반환
$("span.subchild").parent();
// 주어진 선택자와 일치하는 모든 부모 선택
// div.parent 반환
$("span.subchild").parents("div.parent");
// 모든 부모 선택
// div.child, div.parent, div.grandparent 반환
$("span.subchild").parents();
closest() : 가장 가까운 조상 선택
// 가장 가까운 부모 선택. 단 하나의 부모만 선택하며, 초기 요소 자체도 검색 대상에 포함
// [div.child] 반환
$("span.subchild").closest("div");
// 셀렉터도 검색 대상에 포함되므로 [div.child]를 반환
$("div.child").closest("div");
children() : 바로 아래 자식 엘리먼트를 탐색
find() : 모든 하위 엘리먼트를 탐색
// 바로 아래 자식 엘리먼트 선택:
// [div.parent, div.surrogateParent1, div.surrogateParent2] 반환
$("div.grandparent").children("div");
// 선택한 요소 내에서 선택자와 일치하는 모든 요소 찾기:
// [div.child, div.parent, div.surrogateParent1, div.surrogateParent2] 반환
$("div.grandparent").find("div");
siblings() : 모든 형제 앨리먼트를 탐색
// 주어진 선택자와 일치하는 요소의 형제 요소를 양방향으로 선택:
// [ div.surrogateParent1, div.surrogateParent2 ] 반환
$("div.parent").siblings();
// [ div.parent, div.surrogateParent2 ] 반환
$("div.surrogateParent1").siblings();
next() : 다음 형제 엘리먼트를 탐색
prev() : 이전 형제 엘리먼트를 탐색
// 다음 형제 앨리먼트를 탐색
// [div.surrogateParent1] 반환
$("div.parent").next();
// Selecting a prev sibling of the selectors:
// div.parent 앞에 형제가 없으므로 [] 반환
$("div.parent").prev();
// Selecting all the next siblings of the selector:
// [div.surrogateParent1, div.surrogateParent2] 반환
$("div.parent").nextAll();
// [div.surrogateParent1] 반환
$("div.parent").nextAll().first();
// [div.surrogateParent2] 반환
$("div.parent").nextAll().last();
// 이전 형제 엘리먼트를 탐색
// [div.surrogateParent1, div.parent] 반환
$("div.surrogateParent2").prevAll();
// [div.surrogateParent1] 반환
$("div.surrogateParent2").prevAll().first();
// [div.parent] 반환
$("div.surrogateParent2").prevAll().last();
jQuery의 다양한 문법을 배웠다. jQuery를 잘 활용하기 위함이 아닌, 현업에 투입 되었을때 아직 남아있을 수도 있는 jQuery 코드를 읽을 수 있는 능력을 갖추기 위해 진행된 부분이라 내용을 깊게 다루진 않았다. 논리적인 지식보다는 단순 문법이라 어렴풋이 기억하고 있다가 필요할 때가 되면 다시 이 게시글을 찾아야겠다.
preload =“none”, “auto”; : 페이지를 로드할때 영상을 미리 로드할지 말지 결정합니다.
poster : 비디오를 내려받을 동안 혹은 영상을 재생할때까지 표시할 이미지를 지정합니다.
controls : 브라우저가 재생에 핋요한 컨트롤러를 제공할지 지정합니다.
autoplay: 파일이 다운로드가 완료되면 자동으로 재생될지 지정하는 속성입니다.
muted: 소리를 끕니다.
loop : 비디오가 끝나고 반복적으로 재생할지 지정합니다.
video 반응형 만들기
video {
width: 100%;
}
video {
max-width: 100%
}
iframe 반응형 만들기
.cont-video {
position: relative;
padding-top: 56.25%;
/* 16:9 비율 : aspect-ratio 사용 가능하나 지원 브라우저가 별로 없다. 최신기술! */
/* 많은 개발자들이 잘 모르는 CSS 매직을 알려드리겠습니다 :) */
/* padding-top, padding-bottom 속성의 % 값은 부모 요소의 넓이에 비례합니다. */
/* 예를 들어 부모의 넚이가 1200px 이라면 자식요소의 padding-top=50% 의 값은 600px 과 같습니다. */
}
.video-next-level {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
오랜만에 돌아온 CSS 수업! JS 하다가 들으니까 사막의 오아시스 같다... 기본 문법 학습이나 실습을 하며 어느정도 웹을 만들어낼수는 있지만, 아직 웹접근성이라던지 최적화, 반응형을 만드는거에 약하다는 생각이 들었는데 이렇게 다시 실무에서 활용할 수 있는 좋은 기술들을 알 수 있어서 좋았다.
레티나 디스플레이는 처음 듣는 단어였는데 이런것까지 신경써야 한다니 아직 갈길이 멀은것 같다. 수업시간에 예시로 네이버 쇼핑 페이지에 들어갔는데 레티나 디스플레이 대응이 안되어 있어 맥북을 사용하는 나의 화면에는 이미지가 살짝 깨져보였다ㅎ 네이버 같은 대기업도 안맞춰논게 있다니.. 까볼수록 신기한 세계다ㅋㅋㅋ 시간이 난다면 초반에 진행했던 과제들을 개선하며 다시 만들어보는 시간을 가져봐야겠다!