-
자바스크립트 - DOM프로그래밍/JavaScript 자바스크립트 2021. 10. 6.반응형<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><link rel="icon" href="data:;base64,iVBORw0KGgo="><script type="text/javascript">function getElements(attrName, attrValue) {// 모든 요소var elements = document.getElementsByTagName("*");var founds = [];for(var i=0; i<elements.length; i++) {if(elements[i].hasAttribute(attrName) && elements[i].getAttribute(attrName).toLowerCase() === attrValue.toLowerCase()) {founds.push(elements[i]);}}return founds;}function result() {var s;// id로 접근var name = document.getElementById("name").value;// name으로 접근var age = document.getElementsByName('age')[0].value;// tag로 접근var birth = document.getElementsByTagName("input")[2].value;// 선택자로 접근// var chk = document.querySelector("input[type=checkbox]").checked;// 속성으로 접근var chk = getElements("type", "checkbox")[0].checked;// class 속성으로 접근var tel = document.getElementsByClassName("telClass")[0].value;s = "<p>이름 : " + name +"</p>";s += "<p>나이 : " + age +"</p>";s += "<p>생년월일 : " + birth +", 양력:"+chk+"</p>";s += "<p>전화번호 : " + tel +"</p>";// document.getElementById("layout").innerText = s;// document.getElementById("layout").innerHTML = s;// 선택자로 접근(클래스등 동일한 이름의 선택자가 두개이상이면 처음 객체만 찾음)document.querySelector("#layout").innerHTML = s;// 스타일 변경var inputs = document.getElementsByTagName("input");for(var i = 0; i<inputs.length; i++) {if(inputs[i].type === "text") {inputs[i].style.border = "1px solid red";}}// document.getElementById("layout").style.background = '#ff0';// background-colordocument.getElementById("layout").style.backgroundColor = '#ff0';}</script></head><body><h3>DOM</h3><div><p>이름 : <input type="text" id="name"> </p><p>나이 : <input type="text" name="age"> </p><p>생년월일 : <input type="text"> <input type="checkbox"> 양력 </p><p>전화번호 : <input type="text" class="telClass"> </p><p><button type="button" onclick="result()">확인</button></p></div><div id="layout"></div></body></html>
요소에 접근하기 위한 방법은 엄청 다양하다.
document.getElementsByTagName("*"); 을 통해서 모든 요소에 접근 할 수 있고 아니면 특정 태그나 클래스 이름 아이디 등등 접근할 방법이 많다.
document.getElementById("name").value; 아이디로 접근
document.getElementsByName('age')[0].value; 네임으로 접근
document.getElementsByClassName("telClass")[0].value; 클래스로 접근
querySelector("#layout").innerHTML = s; 쿼리 셀렉터로 접근
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><link rel="icon" href="data:;base64,iVBORw0KGgo="><script type="text/javascript">function fun() {// alert("음 언제 배웠지 ???");alert(event.currentTarget.firstChild.nodeValue);}// 속성 값 및 자식 노드수 알아보기function sub1() {var str;var div = document.getElementById("layout");// 속성값 가져오기str = div.getAttribute("style");// 자식 노드 정보(childNodes:문자열,공백,엔터등도검색)// str += "\n자식수 : " + div.childNodes.length; // 처음실행시:7// console.log(div.childNodes); // [text, p, text, p, text, p, text]// 자식 노드 정보(children:태그만)str += "\n자식수 : " + div.children.length; // 처음실행시:3console.log(div.children); // [p, p, p]alert(str);}// 노드를 마지막에 추가function sub2() {var div = document.getElementById("layout");var node = document.createElement("p");node.setAttribute("onclick", "fun();") // click 이벤트 추가var textNode = document.createTextNode("마지막 !!!");node.appendChild(textNode);div.appendChild(node);}// 노드를 특정 노드 앞에 추가function sub3() {var div = document.getElementById("layout");var node = document.createElement("p");var textNode = document.createTextNode("앞 !!!");node.appendChild(textNode);div.insertBefore(node, div.childNodes[0]);// div.insertBefore(node, div.childNodes[1]);// div.insertBefore(node, div.children[1]);}// 노드 삭제function sub4() {var div = document.getElementById("layout");if(div.childNodes.length > 1) {div.removeChild(div.childNodes[1]);}}// 스타일 없애기function sub5() {var div = document.getElementById("layout");// div.style.border = "none";div.style.removeProperty("border");}// 처음 p 태그 세개를 클릭하면 요소의 text 값 가져오기window.onload = function(){var ps = document.getElementById("layout").children;for(var i=0; i<ps.length; i++) {ps[i].addEventListener("click", function(){alert(this.firstChild.nodeValue); // 태그의 텍스트 가져오기});}};</script></head><body><h3>노드 추가 및 삭제</h3><div id="layout" style="width:300px; height: 300px; border: 1px solid #f00;"><p>자바</p><p>안드로이드</p><p>프레임워크</p></div><hr><div><p><button type="button" onclick="sub1()">노드정보</button><button type="button" onclick="sub2()">노드추가</button><button type="button" onclick="sub3()">특정노드앞에추가</button><button type="button" onclick="sub4()">노드삭제</button><button type="button" onclick="sub5()">스타일없애기</button></p></div></body></html>속성 값 가져오기 = getAttribute() 먼저 요소를 가져온 변수에 대입 해야함.
childNodes.length 랑 children.length의 결과는 다르다.
공백이나 엔터 같은것들도 포함 하는게 childNodes
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><link rel="icon" href="data:;base64,iVBORw0KGgo="></head><body><h3>노드 찾기</h3><div><p><a>HTML</a></p><p class="css"><a>CSS</a></p><p><a>javascript</a><span>jquery</span></p></div><hr><div class="pp"><div class="p"><div class="c1">javascript</div><div class="c2">css</div></div></div><script type="text/javascript">// 모든 p 태그var list = document.getElementsByTagName("p");// 자식검색 : text(공백,문자열,엔터등), tag 검색var c1 = list[2].childNodes;// 자식검색 : tag만 검색var c2 = list[2].children;// a태그만 검색var c3 = list[2].getElementsByTagName("a");console.log(c1); // [text,a,text,span]console.log(c2); // [a,span]console.log(c3); // [a]var child = document.querySelector(".c1");// 부모 검색var p1 = child.parentNode; // 부모노드, 빈공간도 포함var p2 = child.parentElement; // 부모노드만console.log(p1);console.log(p2);// 형제var s1 = child.nextSibling; // 텍스트(빈공간)도 포함var s2 = child.nextElementSibling; // 태그만console.log(s1); // #textconsole.log(s2); // <div class="c2">css</div>// 텍스트var s3 = s2.firstChild.nodeValue;console.log(s3);</script></body></html>검색을 위해서는 배열을 사용해야함.
모든 p 태그를 가져와서 리스트에 담으면 리스트가 되는데
그걸 인덱스를 활용해서 뽑아냄
== 공부 해야 할 소스
<!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title><link rel="icon" href="data:;base64,iVBORw0KGgo="><style type="text/css">* {margin: 0; padding: 0;box-sizing: border-box;}body {font-size: 14px;font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;}a {color: #000;text-decoration: none;cursor: pointer;}a:active, a:hover {text-decoration: underline;color: #F28011;}.btn {color: #333;border: 1px solid #333;background-color: #fff;padding: 4px 10px;border-radius: 4px;font-weight: 500;cursor:pointer;font-size: 14px;font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;vertical-align: baseline;}.btn:hover, .btn:active, .btn:focus {background-color: #e6e6e6;border-color: #adadad;color:#333;}.boxTF {border: 1px solid #999;padding: 5px 5px;background-color: #fff;border-radius: 4px;font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;vertical-align: baseline;}.selectField {border: 1px solid #999;padding: 4px 5px;border-radius: 4px;font-family: "맑은 고딕", 나눔고딕, 돋움, sans-serif;vertical-align: baseline;}textarea:focus, input:focus {outline: none;}.title {width:100%;font-size: 16px;font-weight: bold;padding: 13px 0;}.container {width: 800px;margin: 30px auto;}.table {width: 100%; border-spacing: 0; border-collapse: collapse;}.table tr th {padding: 7px 0;background: #eee;}#tbScore input {/* border:1px solid #999; */border: none;padding:5px 5px;width:100%;height: 30px;}#tbScore span {cursor: pointer;}tr.over {background: #f5fffa;}</style><script type="text/javascript">function isValidDateFormat(data){var regexp = /[12][0-9]{3}[\.|\-|\/]?[0-9]{2}[\.|\-|\/]?[0-9]{2}/;if(! regexp.test(data))return false;regexp=/(\.)|(\-)|(\/)/g;data=data.replace(regexp, "");var y=parseInt(data.substr(0, 4));var m=parseInt(data.substr(4, 2));if(m<1||m>12)return false;var d=parseInt(data.substr(6));var lastDay = (new Date(y, m, 0)).getDate();if(d<1||d>lastDay)return false;return true;}function isValidNumberFormat(data){var format=/^(\d+)$/;return format.test(data);}function isValidScoreFormat(data){if(! isValidNumberFormat(data)) {return false;}if(parseInt(data)<0||parseInt(data)>100) {return false;}return true;}function init() {// 이벤트 등록var inputForm = document.getElementById('inputForm');var inputs = inputForm.getElementsByTagName('input');for (var i = 0; i < 6 /*inputs.length*/; i++ ) {inputs[i].onkeypress = function(){ fnReturn('inputForm'); };inputs[i].onkeyup = function(){ fnKeyup('inputForm'); };}}function fnReturn(id) {var inputForm = document.getElementById(id);var inputs = inputForm.getElementsByTagName('input');var obj;// 이벤트를 발생시킨 객체if (event.srcElement) obj = event.srcElement;else if (event.target) obj = event.target;if (event.keyCode == 13) {for (var i = 0; i < inputs.length; i++ ) {if(i<5 && obj==inputs[i]) {inputs[i+1].focus();break;} else if(i==5 && obj==inputs[i]) {if(id=="inputForm")insertScore();elseupdateOk(id);break;}}}}function fnKeyup(id) {var inputForm = document.getElementById(id);var inputs = inputForm.getElementsByTagName('input');var obj;if (event.srcElement) obj = event.srcElement;else if (event.target) obj = event.target;var idx = 0;for (var i = 0; i < inputs.length; i++ ) {if(obj==inputs[i]) {idx = i;break;}}if(idx>=3 && idx<=5) {var kor=inputs[3].value.trim();var eng=inputs[4].value.trim();var mat=inputs[5].value.trim();var k = isValidScoreFormat(kor) ? parseInt(kor):0;var e = isValidScoreFormat(eng) ? parseInt(eng):0;var m = isValidScoreFormat(mat) ? parseInt(mat):0;var tot=k+e+m;var ave=Math.floor(tot/3);if(!kor && !eng && !mat) {tot="";ave="";}inputs[6].value = tot;inputs[7].value = ave;}}window.addEventListener('load', function() {init();}, false);function check(id) {var inputForm = document.getElementById(id);var inputs = inputForm.getElementsByTagName('input');var s;for (var i = 0; i < inputs.length; i++ ) {s=inputs[i].value.trim();if(! s) {alert("값을 입력 하세요.");inputs[i].focus();return false;}if(i==2 && !isValidDateFormat(s)) {alert("날짜의 형식이 잘못 되었습니다.");inputs[i].focus();return false;}if(i>=3 && i<=5 && (! isValidScoreFormat(s))) {alert("점수를 정확히 입력 하세요.");inputs[i].focus();return false;}}return true;}var nID=1;function insertScore() {if(! check('inputForm')) {return;}var inputForm = document.getElementById('inputForm');var inputs = inputForm.getElementsByTagName('input');var tbScore = document.getElementById('tbScore');var tr = tbScore.getElementsByTagName('tr');if(tr.length==1) {nID=1;}nID++;var id="row"+nID;var row, cell, span;var tot, ave, s;row=document.createElement("tr");row.setAttribute("id", id);row.setAttribute("height", "30");row.setAttribute("align", "center");row.onmouseover=function() {this.setAttribute("class", "over");};row.onmouseout=function() {this.removeAttribute("class");};// 학번, 이름, 생년월일, 국어, 영어, 수학tot=0;for(var i=0; i<6; i++) {s=inputs[i].value.trim();cell=document.createElement("td");cell.appendChild(document.createTextNode(s));row.appendChild(cell);if(i>=3&&i<=5) {tot += parseInt(s);}inputs[i].value="";}ave=Math.floor(tot/3);inputs[6].value="";inputs[7].value="";inputs[0].focus();cell=document.createElement("td");cell.appendChild(document.createTextNode(tot));row.appendChild(cell);cell=document.createElement("td");cell.appendChild(document.createTextNode(ave));row.appendChild(cell);cell=document.createElement("td");span=document.createElement("span");span.appendChild(document.createTextNode("수정"));span.onclick=function() { updateScore(id); };// span.setAttribute("style", "cursor:pointer;");cell.appendChild(span);cell.appendChild(document.createTextNode(" | "));span=document.createElement("span");span.appendChild(document.createTextNode("삭제"));span.onclick=function() { deleteScore(id); };// span.setAttribute("style", "cursor:pointer;");cell.appendChild(span);row.appendChild(cell);tbScore.appendChild(row);}var arr=[];function updateScore(id) {var row=document.getElementById(id);var tds = row.getElementsByTagName("td");var str, s, input;for(var i=0; i<tds.length; i++) {if(i != tds.length-1) {arr[i] = tds[i].innerText;s="";if(i==6||i==7)s=" readonly='readonly' style='border: none; text-align: center;' "elses=" onfocus='this.select();' ";tds[i].innerText = "";str = "<input type='text' value='" + arr[i] + "'" + s +">";tds[i].innerHTML = str;input = tds[i].getElementsByTagName('input')[0];input.onkeypress = function(){ fnReturn(id); };input.onkeyup = function(){ fnKeyup(id); }} else {tds[i].innerText = "";str = "<span onclick='updateOk(\""+id+"\");'>완료</span> | <span onclick='updateCancel(\""+id+"\");'>취소</span>";tds[i].innerHTML = str;}}}function updateOk(id) {if(! check(id)) {return;}var row=document.getElementById(id);var tds = row.getElementsByTagName("td");var input, str;for(var i=0; i<tds.length; i++) {if(i != tds.length-1) {input = tds[i].getElementsByTagName('input')[0];tds[i].innerText = input.value;} else {tds[i].innerText = "";str = "<span onclick='updateScore(\""+id+"\");'>수정</span> | <span onclick='deleteScore(\""+id+"\");'>삭제</span>";tds[i].innerHTML = str;}}}function updateCancel(id) {var row=document.getElementById(id);var tds = row.getElementsByTagName("td");for(var i=0; i<tds.length; i++) {if(i != tds.length-1) {tds[i].innerText = "";tds[i].innerText = arr[i];} else {tds[i].innerText = "";str = "<span onclick='updateScore(\""+id+"\");'>수정</span> | <span onclick='deleteScore(\""+id+"\");'>삭제</span>";tds[i].innerHTML = str;}}}function deleteScore(id) {if(! confirm("데이터를 삭제 하시겠습니까 ? ")) {return;}var tb= document.getElementById("tbScore");var row=document.getElementById(id);tb.removeChild(row);}</script></head><body><div class="container"><div class="title"><h3><span>|</span> 성적 처리</h3></div><form name="scoreForm" method="post"><table class="table" border="1"><thead><tr><th width="80">학번</th><th width="100">이름</th><th width="100">생년월일</th><th width="80">국어</th><th width="80">영어</th><th width="80">수학</th><th width="80">총점</th><th width="80">평균</th><th>변경</th></tr></thead><tbody id="tbScore"><tr id="inputForm" align="center"><td><input type="text" name="hak" id="hak" onfocus="this.select();"></td><td><input type="text" name="name" id="name" onfocus="this.select();"></td><td><input type="text" name="birth" id="birth" onfocus="this.select();"></td><td><input type="text" name="kor" id="kor" onfocus="this.select();"></td><td><input type="text" name="eng" id="eng" onfocus="this.select();"></td><td><input type="text" name="mat" id="mat" onfocus="this.select();"></td><td><input type="text" name="tot" id="tot" readonly="readonly" style="border: none; text-align: center;"></td><td><input type="text" name="ave" id="ave" readonly="readonly" style="border: none; text-align: center;"></td><td><button type="button" class="btn" onclick="insertScore();" style="width: 100%;">등록하기</button></td></tr></tbody></table></form></div></body></html>각 칸에 대한 요소들 확인하기
스타일 및 CSS 확인
정규식 확인
스크립트 흐름 파악
공부 해야함
반응형'프로그래밍 > JavaScript 자바스크립트' 카테고리의 다른 글
자바스크립트 - 반응형 웹 (0) 2021.10.07 자바스크립트 - 파일 File (1) 2021.10.06 자바스크립트 - 정규식 (0) 2021.10.06 자바스크립트 - Form 폼 (양식) / 예제 (0) 2021.10.06 자바스크립트 - Event 이벤트 핸들러 (0) 2021.10.02