2021.03.09 국비교육 42일차

[TOC]

이벤트

  • 이벤트 발생 형태
    • 어플리케이션 사용자가 발생시키는 형태 : 버튼클릭, 키보드 입력 등
    • 어플리케이션 스스로 발생 : 페이지 로드 등

DOM Level 0 (인라인 이벤트모델, 고전 이벤트 모델 )

  • 방식 1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    function init(){
        console.log("init() : 모든 html이 모두 DOM으로 생성된 후 실행")
    }
    ///////////////////////////////
    function xxx(){
        console.log("click   xxx() 호출");
    }
    function yyy(){
        console.log("onmouseover"); // 마우스 올리면 동작
    }
    function zzz(){
        console.log("onmouseout"); // 마우스 빠져 나가면 동작
    }

    /////////////////////////////////////////

    function kkk(v){
        console.log("키보드가 up", v);
    }
    function xyz(e){ //매개변수 : 이벤트
        console.log(e, e.screenX, e.screenY); // 좌표값 = 이벤트가 발생한 위치
    }
</script>
</head>
<body onload="init()">
    <!-- 인라인 방식 이벤트 처리, 화면 로딩 후 -->
    <button onclick="xxx()" onmouseover="yyy()" onmouseout="zzz()">클릭</button>
    <!-- 인라인 방식 처리 click, mouseover, mouseout -->
    <input type="text" name="userid" onkeyUp="kkk(this.value)">
    <!-- 인라인 방식 처리, keyup, this : 이벤트 발생 태그 -->
    <button onclick="xyz(event)">이벤트정보</button>
    <!-- 인라인 방식 처리 발생한 event객체를 매개변수로 넘김 -->
</body>
</html>
  • 방식2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    window.onload = init; // 함수등록 but init(); 은 안됨

    function init(){
        console.log("모든 html이 모두 DOM으로 생성된 후 실행");
        ///xxx 클릭 이벤트 처리 등록
        document.getElementById("xxx").onclick = function(){
            console.log("clicked");
        };
        /// xxx onmouserover 핸들러 -> console.log("mouseover")
        document.getElementById("xxx").onmouseover = function(){
            console.log("mouseover");
        };
        document.getElementById("xxx").onmouseout = function(){
            console.log("mouseout");
        };

        //keyup
        document.getElementById("userid").onkeyup = function(){
            console.log(this.value);
        }

        document.getElementById("xyz").onclick = function(){
            console.log(event.screenX, event.screenY); // 매개변수 없이 사용 가능
        }
    }


    /* window.onload = function (){
        console.log("모든 html이 모두 DOM으로 생성된 후 실행");
    } */
</script>
</head>
<body>
<button id = "xxx">클릭</button>
<input type = "text" name = "userid" id = "userid">
<button id = "xyz">이벤트 정보</button>

</body>
</html>
  • mouseover시에 이미지 전환하기
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    window.onload = function() {
        var imgs = document.getElementsByTagName("img");
        for(var i=0; i<imgs.length-1;i++){
            var img = imgs[i];
            img.onmouseover = function(){ // 태그에 이벤트 핸들러 달아주기
                console.log(imgs[3].src = this.src);
            }
        }

    }
</script>
</head>
<body>
    <table border="1">
        <tr>
            <td><img src="../image/a.jpg" width="100" height="100"></td>
            <td><img src="../image/b.jpg" width="100" height="100"></td>
            <td><img src="../image/c.jpg" width="100" height="100"></td>
        </tr>
        <tr>
            <td colspan="3"><img src="../image/a.jpg" width="300"
                height="300"></td>
        </tr>
    </table>

</body>
</html>

preventDefault

  • 이벤트 stop시킴
<!DOCTYPE html>
<html><head><meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    window.onload=function(){
        var form=document.getElementById("xxx");
        console.log(form);
        document.getElementById("xxx").onsubmit=function(){
            alert("xxxxxxx");
            event.preventDefault();
        }

        var form=document.getElementById("yyy");
        console.log(form);
        document.getElementById("yyy").onsubmit=function(){
            alert("yyyyyyyyyyyyyy");
            return false;
        }
    };

    function xxx(){
        alert("submit");   
    }
    function xxx2(){
        var id= document.getElementById("userid").value;
        var passwd= document.getElementById("passwd").value;
        var result=false;
        if(id.length>=3 && passwd.length !=0){
            result= true;
        }else{
            alert("에러");
        }
        return result; //return false; action 금지 form에 return이꼭 있어야함 
        //return false;

    }
    function xxx3(e){
        alert("submit"); 
        e.preventDefault()//action 금지 event.prevent()
        //event.preventDefault();
    }
</script>
</head>
<body>
<form action="target.html" onsubmit="xxx()">
아이디<input type="text" name="userid"><br>
비번<input type="text" name="passwd"><br>
<button>버튼</button>
<input type="submit" value="로그인">
<input type="reset" value="취소"><br>
</form>
<form action="target.html" onsubmit="return  xxx2()"><!-- 주의 -->
아이디<input type="text" name="userid" id="userid"><br>
비번<input type="text" name="passwd" id="passwd"><br>
<button>버튼</button>
<input type="submit" value="로그인"><br>
</form>
<form action="target.html" onsubmit="xxx3(event)"><!-- 주의  -->
아이디<input type="text" name="userid" ><br>
비번<input type="text" name="passwd" ><br>
<button>버튼</button>
<input type="submit" value="로그인"><br>
</form>
<form action="target.html" id="test"><!-- 주의  -->
아이디<input type="text" name="userid" ><br>
비번<input type="text" name="passwd" ><br>
<button>버튼</button>
<input type="submit" value="로그인"><br>
</form>
<form action="target.html" id="xxx"><!-- 주의  고전모델방식 onsubmit삭제  -->
    아이디555555<input type="text" name="userid" ><br>
    비번555555<input type="text" name="passwd" ><br>
    <button>버튼</button>
    <input type="submit" value="로그인"><br>
</form>
<form action="target.html" id="yyy"><!-- 주의  -->
    아이디666666<input type="text" name="userid" ><br>
    비번666666<input type="text" name="passwd" ><br>
    <button>버튼</button>
    <input type="submit" value="로그인"><br>
</form>
</body>
</html>

로그인 오류 검증

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>

<script type="text/javascript">

    function formSubmit(){
        var result = true; // 리턴시킬 값
        var str = ""; //span에 보여줄 에러메시지

        //사용자 입력데이터
        var userid = document.getElementById("userid").value;
        var passwd = document.getElementById("passwd").value;
        var username = document.getElementById("username").value;
        var email = document.getElementById("email").value;

        //span 에러 메시지
        var idSpan = document.getElementById("idSpan");
        var pwSpan = document.getElementById("pwSpan");
        var nameSpan = document.getElementById("nameSpan");
        var emailSpan = document.getElementById("emailSpan");

        console.log("!")
        if(userid.length ==0){
            str = "아이디에러";
            idSpan.innerHTML = str;
            pwSpan.innerHTML = "";
            nameSpan.innerHTML = "";
            emailSpan.innerHTML = "";

            result = false;
        }else if(passwd.length ==0 || Number.isNaN(parseInt(passwd))){
            str = "패스워드 에러";
            idSpan.innerHTML = "";
            pwSpan.innerHTML = str;
            nameSpan.innerHTML = "";
            emailSpan.innerHTML = "";

            result = false;
        }else if(username.length >=4 || username.length ==0){
            str = "이름 에러";
            idSpan.innerHTML = "";
            pwSpan.innerHTML = "";
            nameSpan.innerHTML = str;
            emailSpan.innerHTML = "";

            result = false;
        }else if(email.length == 0){
            str = "이메일 에러";
            idSpan.innerHTML = "";
            pwSpan.innerHTML = "";
            nameSpan.innerHTML = "";
            emailSpan.innerHTML = str;

            result = false;
        }

        return result;
    }

</script>

</head>
<body>
<form action="target.html" onsubmit = "return  formSubmit();"> <!-- 인라인 방식처리  -->
    아이디<input type="text" name="userid" id="userid">
    <span id="idSpan"></span><br>

    비번<input type="text" name="passwd" id="passwd">
    <span id="pwSpan"></span><br>

    이름<input type="text" name="username" id="username">
    <span id="nameSpan"></span><br>

    이메일<input type="text" name="email" id="email">
    <span id="emailSpan"></span><br>

    <input type="submit" value="로그인">
    <input type="reset" value="취소"><br>
    <button>버튼</button>
</form>

</body>
</html>

DOM level2 addEventListener

  • 기본 사용법
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
    <script type="text/javascript">

        window.onload = function(){ //화면에 dom이 다 준비 된 후 실행
            /* var xxx = document.getElementById("xxx");
            xxx.addEventListener("click", function (){ //이벤트명 on이 빠짐, 이벤트 발생시 동작할 함수
                console.log("버튼클릭");
            }, false); */ // xxx에 클릭 이벤트 발생시 function 동작, 마지막 기본 false

            var xxx = document.getElementById("xxx");
            xxx.addEventListener("click", kkk, false); //이벤이름 on빠짐 kkk = 함수이름

            var myForm = document.getElementById("myForm");
            myForm.addEventListener("submit", function() {
                event.preventDefault();
                console.log("submit취소")
                //return false 안됨
            }, false)
        }

        function kkk(){ //kkk, 클릭 시 이벤트 처리 함수, addEventListener에 등록사용
            console.log("버튼클릭");
        }

    </script>
</head>
<body>
<form action="target.html" id="myForm"><!-- addEventListener사용 인라인 핸들러 없음 -->
아이디<input type="text" name="userid"><br>
비번<input type="text" name="passwd"><br>
<button>버튼</button>
<input type="submit" value="로그인">
<input type="reset" value="취소"><br>
<button id="xxx">xxx클릭</button>
</form>


</body>
</html>

버블링 방지

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">

window.onload = function(){

    var a= document.getElementById("a");
    var b= document.getElementById("b");

    a.addEventListener("click", function(){
        console.log("a");
    }, false)
    b.addEventListener("click", function(e){ //자식에서 click이벤트 발생시키면 부모까지 영향을 미침
        console.log("b");
        e.stopPropagation(); // 이벤트 전파 방지
        //event.stopPropagation();//매개변수 안받을때
    }, false)

}
</script>
</head>
<body>
    <div id="a" style="background-color: #ff0000">
        a
        <div id="b" style="background-color: #00ff00">b</div>

    </div>

</body>
</html>

체크박스 value 복사

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
    window.onload= function(){
        document.getElementById("chk").addEventListener("click", check, false);
        //chk 클릭시 동작할 함수로 check함수 등록

        document.getElementById("address2").addEventListener("keyup", function() { //keyup
            console.log(document.querySelector("#result")); // 하나의 태그를 리턴, id에 사용, css선택자 사용
            document.querySelector("#result").innerHTML = this.value; //this는 address2있는 부분
        }, false);

    }

    function check(){
        document.getElementById("address2").value =
            document.getElementById("address").value;
    }

</script>
</head>
<body>
<input type="text" name="address" id="address" value="공주~~~~"><br>
배송지가 같으면 다음을 체크하세요
<input type="checkbox" name="chk" id="chk"><br>
배송지 주소
<input type="text" name="address2" id="address2" 
><br>
<span id="result"></span>

</body>
</html>

자식 노드 이벤트 발생시키기

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">

//인라인 방식 = > addEventListener방식으로 변환 : setview,unsetview를 사용함수로 등록
 window.onload = function(){

    document.getElementById("vi").addEventListener("click", setView);
    document.getElementById("unvi").addEventListener("click", unsetView);
} 


function setView(){
    var image = document.querySelector("#detail h3");
    image.style.display = "block";
}

function unsetView(){
    var image = document.querySelector("#detail h3");
    image.style.display = "none";
}

</script>

</head>
<body>
<input type="button" id="vi" value="보이기" ><br>
<input type="button" id="unvi" value="감추기" ><br>

<div id="detail">
<h1>아래 내용이 숨겨집니다</h1>
<h3>
    <font color="red">다음과 같은 내용이 숨겨지게 됩니다. </font>
</h3>
</div>

</body>
</html>

여러가지 이벤트

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
var image;
window.onload = function(){
    image = document.getElementById("images");
    image.addEventListener("click", aaa);
    image.addEventListener("mouseover", bbb);
    image.addEventListener("mouseout", ccc);
}

function aaa(){
    image.src = "../image/b.jpg";
}
function bbb(){
    image.src = "../image/c.jpg";
}
function ccc(){
    image.src = "../image/d.jpg";
}

</script>

</head>
<body>
<img id="images" src="../image/a.jpg" width = "200" height = "200">


</body>
</html>

+ Recent posts