티스토리 뷰

# 이 내용은 반드시 암기해야함.

*다른 서버와 데이터를 주고받는 통신을 하게되는 때가 있다.

*문자열로 다른 서버와 데이터를 주고받을 수 있지만 객체로는 주고 받을 수 없다.

 이 때 JSON의 형식으로 문자열로 바꿔줘서 보내줘야함. 

( JSON 은 자바스크립트의 객체는 아니고 객체처럼 표현하는 표기법임)

-문자열로 형변환해서 데이터를 보내주고, 받은 문자열로된 데이터는 JSON 으로 다시 형변환해서 사용한다고 생각하면  됨. 

*제이슨을 -> 문자열로

JSON.stringify(data);

 

문자열을 -> 제이슨으로

JSON.parse(문자열);

이 때 키, 값이 전부 " "로 묶여 있어야한다. 안그러면 에러가 발생.  꼭 쌍따옴표(" ") 로 묶어줘야됨.

여기를 보면 오른 쪽 아래에 쌍따옴표로 키와 값을 묶어주지 않아서 왼쪽에서 에러가 발생했음.

그래서 key, value 를 각각  쌍따옴표(" ")로 묶어줬더니 아래와 같이 에러 없이 잘 처리되었다.

 

 

이점 꼭 기억해둬야한다. 

 

<body>
    
    <script>
        var data = [
            {id: 'aaa123', title: 'aaa', content:'a...'},
            {id: 'bbb123', title: 'bbb', content:'b...'},
            {id: 'ccc123', title: 'ccc', content:'c...'},
        ];

        //console.log(data);
        //JS객체를 JSON문자열로 형변환
        var str = JSON.stringify(data);
        console.log(str);

        //JSON문자열을 JS객체로 형변환
        var obj = JSON.parse(str);
        console.log(obj);

        //단, 문자열을 객체로 변경할 때는 엄격한 규칙이 있습니다.
        //key, value가 "" 처리어야 합니다.
        var result = JSON.parse('{"id": "aaa123"}');
        console.log(result);

    </script>

    

</body>

결과

 

 

 

 

<자바스크립트 이벤트핸들러>  

*이벤트 -> 사용자의 동작

 핸들러 -> 사용자의 동작을 제어하는 함수

*인라인 이벤트 모델, 기본 이벤트 모델, 표준 이벤트 모델 

 이 세가지 방법을 다 알고있으면 좋음.

 

핸들링 하기 위해서는 먼저 이벤트 종류들을 먼저 알아야함.

 

*이름을 보면 어떤 이벤트를 다루는지 대부분 다 알수있음.

* click, keyup, change(값이 변경되었을 때) , load   -> 이정도만 알고있기. 

   focus ( input이나 textarea 같은데 사용됨) 이거도 종종 사용됨.

*이벤트 앞에 on 이라는 키워드가 붙음

 onclick  ,  onfocus, onchange 이런식으로.

 

#인라인 이벤트 모델

* 위에 사진을 보면 중간에처럼 

태그 안에 onclick="console.log('출력')" 처럼 모든 자바스크립트 문법을 쓸 수 있음.

 

자바스크립트 문법이 길어지면 이렇게 쓰기 어렵기 떄문에

아래처럼

선언적 함수를 작성해놓고 호출해서 사용한다.

 

코드

<body>
    
    <button onclick="aaa();">인라인이벤트</button>

    <!-- 태그자체는 객체. 인라인에서 this 키워드를 넣으면 태그 나 자신(태그-객체)을 가리킴-->
    <button onclick="bbb(this);">1</button> 
    <button onclick="bbb(this);">2</button>
    <button onclick="bbb(this);">3</button>

    <script>
        //인라인이벤트 - 함수의 선언은 script에 하고, 태그에서 연결
        function aaa(){
            alert(1);
        }

        function bbb(a){
            //this가 태그에서 사용되면 태그 자기 자신을 가르킵니다.
            // console.log(a);
            a.innerHTML = 'hello';
        }

    </script>

</body>

결과

1, 2 ,3 버튼을 누르면  값이 hello로 바뀐다.

 

*익명함수로 연결하는 방식.

*태그를 JS(script 태그) 내에 얻어와서 script내에서

 태그에 익명함수를 걸어서 실행.

* document.getElementByld(" 가져오고싶은 태그의 ID "); 

  이렇게 해서 가져오고싶은 태그를 가져온다.

 

* 기본이벤트를 사용할 때는

 

 script 태그가 취득할 태그보다 아래 쪽에 위치해야함.

 

이유는 스크립트 내에서 태그를 불러오려고 하는데 

스크립트 태그가 불러오려는 태그보다 위에 위치해 있으면

태그를 호출할 때 취특하고자 하는 태그는 존재 하지 않는 상태이기 때문에

없는 값을 호출 한다고 에러 발생.

 

아래 사진 참고.

기본이벤트 사용시 script태그를 일반 태그보다 위에 놓으면 이렇게 에러가 발생.

 

스크립트 태그를 아래에 위치해놓으면 제대로 동작됨.

코드

<body>

    <button id="btn">기본이벤트</button>

    <script>
        //취득할 태그보다 아래에 있어야 합니다.
        var a = document.getElementById("btn");
        a.onclick = function(){
            console.log('기본이벤트');
            console.log(this);//자기자신
            console.log(a); //태그자신
        }
    </script>

</body>

결과

 

하지만 이벤트 태그 사용시  취득할 태그보다 script 태그를 위에 선언하더라도 

제대로 동작하게 하는 방법이 있음.  

바로  onload 이벤트 사용 하는 법. 

아래에서 마저 확인.

 

 

# onload 이벤트 사용시 스크립트를 위에 작성할수 있음.

* 주의점 : onload는 화면별로 1개만 사용할 수 있다는 점 잘 기억해두자.

* 사용법을 주의해서 알아두자.

---------------------------------------------------------------------------------------------------------

    <script>
        //화면 로딩이 완료된 이후에 실행 - onload는 화면별로 1개만 사용할 수 있습니다.
        window.onload = function(){

            var a = document.getElementById("btn");
            a.onclick = function(){
                console.log('기본 이벤트');
            }

        }

    </script>
---------------------------------------------------------------------------------------------------------
아래 코드에서 마저 확인
 
<body>
    
    <script>
        //화면 로딩이 완료된 이후에 실행 - onload는 화면별로 1개만 사용할 수 있습니다.
        window.onload = function(){

            var a = document.getElementById("btn");
            a.onclick = function(){
                console.log('기본 이벤트');
            }

        }

    </script>

    <button id="btn">기본이벤트</button>

</body>

결과

결과

 

 

 

 

표준 이벤트 모델

*표준 이벤트의 장점은 

 동일한 이벤트를 여러개 사용 가능합니다. (이벤트 체이닝이 가능)

*사용 예시

var btn = document.getElementById("btn");      // 태그를 가져와서 변수에 담음
        btn.addEventListener("click", function () {   // addEventListener("이벤트명", 함수)  

            console.log("표준이벤트");

        });

 

-addEventListener("이벤트명", 함수) 이렇게 사용하는데. 

(이 때, 함수자리에다가 함수() 이렇게 소괄호를 붙이지 않고 함수이름만 쓴다는 점 주의하자.)

또한

선언해 놓은 함수명을 적지 않고 

 addEventListener("이벤트명", function(){});

이렇게 함수를 호출하지 않고 함수를 바로 선언해서 사용 가능. 

 

코드

<body>

    <button id="btn">표준이벤트</button>

    <script>
        //표준이벤트 - 는 동일한 이벤트를 체이닝할 수 있음.
        var btn = document.getElementById("btn");
        btn.addEventListener("click", function () {

            console.log("표준이벤트");

        });

        btn.addEventListener("click", function () {

            console.log("표준이벤트2");

        });

        //1st
        // function aaa(){
        //     console.log("표준이벤트")
        // }

    </script>

</body>

결과

 

#########   this 키워드  #########

*자바에서의 this랑은 개념이 조금 다르니까 주의해서 기억해두자.

    함수에서의 this -> window라는 최상위 객체
    이벤트에서의 this -> 태그자신
 
 
코드
    <script>
        //함수에서의 this -> window라는 최상위 객체
        //이벤트에서의 this -> 태그자신

        var a = 1; //전역변수 a는 window에 선언됨

        function aaa(){
            var a = 10; //지역변수
            console.log(a); //지역변수 접근
            console.log(this); //window
            console.log(this.a); //전역변수에 접근
        }
        aaa();


        var btn = document.getElementById("btn");
        btn.addEventListener("click", function(){
            console.log(this); //태그 자기자신
        }); 

    </script>

aaa() 함수에 구현부를 보면  a 변수 하나가 10의 값을 가진채 선언되어 있다.

이는 선언됨과 동시에 window라는 JS 의 최상위 객체에 값이 담긴다.

그래서 아래에서 

this.a  을  출력하면 

window 객체의 a라는 변수의 값인 10이 호출됨. 

 

결과

 

 

 

 

 

*BOM은 브라우저 객체 모델이라 하며, 내장객체들을 의미함.

*BOM(Browser Object Model) 안에 DOM이 들어감.

*DOM, document Object Model 객체는 문서 객체 모델이라 하며 화면을 핸들링하는 다양한 방법을 제공해줌.

*DOM 은 너무너무 중요. 모르면 자바스크립트를 모른다고 봐도 무방.

*DOM 객체,  즉  document.함수 로 요소에 접근하는 방법들은 아주 중요하니 아래에서 나오는 내용들을 잘 숙지하도록 하자.

 

https://velog.io/@uiseop/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%ED%99%98%EA%B2%BD-DOM%EA%B3%BC-BOM 참고

 

* 노드, 엘리멘트, 태그는 다 같은 말이다.

* 아래에 메서드들은 반환값이 여러개이기 때문에 배열의 형식으로 값을 반환 해줌.

* getElementsByTagName() 은 자주 사용하지는 않는다.

★getElementById() 에서는  ID 는 고유한 값으로 하나이기 때문에 반환이 1개라서

    중간에 Elements 즉 s 가 붙지 않았다. 

 

 

★ 위에 3개의 함수들은  반환하는 값이 1개이더라도 배열로 반환을 해준다.

     따라서 반환받는 값이 배열이라는 것을 인지하고  배열[인덱스] 이렇게  해당하는 태그를 호출해서 사용하도록 하자.

 

 

코드

<body>
    
    <button id = "btn">버튼</button>
    <input type="checkbox" name ="inter" value="1">java
    <input type="checkbox" name ="inter" value="2">js
    <input type="checkbox" name ="inter" value="3">css
    <input type="checkbox" name ="inter" value="4">html

    <script>
        //element == node == 태그

        var btn = document.getElementById("btn")
        var inter = document.getElementsByName("inter");//name이 inter인 태그

        btn.onclick = function(){

            for(var i = 0; i<inter.length; i++){
                console.log(inter[i]);
            }

        }
        

    </script>

    <hr>

    <button id = "btn2">버튼</button>

    <input type="radio" name="aaa" class="hello" value="1">프로그램
    <input type="radio" name="aaa" class="hello" value="2">디자인
    <input type="radio" name="aaa" class="hello" value="3">네트워크
    <input type="radio" name="aaa" class="hello" value="4">보안

    <script>
        var btn2 =  document.getElementById("btn2");
        var hello = document.getElementsByClassName("hello"); //class명이 hello인 태그 - 반환이 배열
        
        btn2.onclick = function(){

            for(var i = 0; i < hello.length; i++){
                console.log(hello[i]);
            }

        }

    </script>
    <br>

    <button id="btn3">버튼</button>

    <ul id="bye">
        <li>목록1</li>
        <li>목록2</li>
        <li>목록3</li>
    </ul>

    
    <ul>
        <li>목록1</li>
        <li>목록2</li>
        <li>목록3</li>
    </ul>

    <script>
        var btn3 = document.getElementById("btn3");

        //document는 한페이지 전체에서 값을 찾아옴. 
        var bye = document.getElementById("bye");//id가 bye인 태그
        var li = bye.getElementsByTagName("li");//bye인 태그에서 탐색

        btn3.onclick = function(){
            for(var i = 0; i<li.length; i++){
                console.log(li[i]);
            }
        }

    </script>


</body>

 

 

#document는 페이지 (한 화면) 전체에서 값을 찾음.

 

아래사진에서 보면 

document.getElementsByTagName("태그");

한 페이지 전체에서의 해당하는 태그를 다 배열에 담아서 반환해줌.

그런데 내가 원하는 범위내에서만 해당하는 태그를 가져올 수도 있음.

범위를 감싸고 있는 태그에 선택자를 준다.

 

아래에서 범위를 감싸고 있는 ul 태그에 id = "bye" 를 주었다.

그리고 나서 

var bye 라는 변수에 태그를 담아주었다. 

(    var bye = document.getElementById("btn3");    )

그리고 나서 

bye.getElementsByTagName("태그"); 하면   

bye를 id값으로 갖는 ul태그의 범위 내에 있는 

li 태그들만 배열에 담겨서 반환이 됨.

 

 

 

 

#지금까지 살펴본 방법들을  아래에 2개로 다 할 수 있음.

* css의 선택자를 선택하는 방법과 동일.

 

*document.querySelector( "이 안에 css 문법이 들어감 " )

*querySelector() 은 단일 선택자이기 때문에 

 querySelector(" css 문 ")   여기에 css 문 자리에  .box2 > ul > li 로 지정해주면

맨 위에있는 <li>안녕<li> 태그 하나만 반환이 됨.

 

*querySelectorAll() 은  querySelector과 다르게 반환하는 값이 여러개이기 때문에  배열로 값을 반환해줌.

-배열로 반환해주기 때문에 반복문을 돌려서 값을 가져와야한다. 아래 코드 참고.

 

코드

<body>
    
    <button id = "btn">쿼리셀렉터확인</button>
    <ul class = "box">
        <li>hi</li>
        <li>bye</li>
        <li>good afternoon</li>
    </ul>

    <script>
        var btn = document.querySelector("#btn") //css선택자로 얻습니다.
        // var li = document.querySelector(".box > li");//li태그를 얻습니다(단일)
        // console.log(li);

        var lis = document.querySelectorAll(".box li");

        btn.onclick = function(){
            for(var i = 0; i <lis.length; i++){
                console.log(lis[i]);
            }
        }
        
    
    </script>

</body>

-결과

 

 

# 태그의 속성 제어하기 - 엄청 중요함. 꼭 알고있어야함!

 

-태그사이의 값에 접근하려면 

 .innerHTML  을 통해서 접근하면 됨. 

 

- 태그의 속성은   . 속성명으로 접근합니다.

 

-코드

<body>

    <h3>태그의 속성 제어하기</h3>

    <input type="text" value="" id="input" required>
    <div class="msg"></div>
    <button type="button" id="btn">확인</button>

    <script>
        //태그의 속성은 = .속성명으로 접근합니다.
        var input = document.getElementById("input");

        // console.log(input.type);//type속성
        // console.log(input.id);//id속성 -> id속성은 웬만해서는 바꾸는거 아님.
        // console.log(input.value); //value속성
        // console.log(input.required); //required속성
        // input.value = "변경";

        //태그의 사이값을 HTML형식으로 얻음 innerHTML
        var btn = document.getElementById("btn");
        // console.log(btn.innerHTML);

        var msg = document.querySelector(".msg")

        //버튼을 누르면 사용자가 입력한 value가지고와서 msg태그사이에 출력.
        btn.addEventListener("click", function(){

            var a = input.value;
            msg.innerHTML = a;

        })

    </script>

</body>

결과

 

 

 

 

#실습1

 

<body>
   
    <h3>사용자가 버튼을 클릭하면 input태그의 공백여부, 체크박스의 체크여부를 확인</h3>

    아이디:<input type="input" id="id">
    기억하기:<input type="checkbox" class="remember">
    <button id = "btn">확인</button>

    <script>

        var btn = document.getElementById("btn");
        var id = document.getElementById("id");
        var remember = document.querySelector(".remember");

        btn.onclick = function(){

            if(id.value == ""){
                console.log('false')
                // alert("input의 값을 확인하세요!")
            } else {
                console.log('true')
            }
            console.log(remember.checked)
            // if(remember.checked == false){
            //     alert("기억하기를 체크하세요!");
            // }

        }

    </script>

    <hr>

    <h3>인라인이벤트 - 사용자가 체크박스를 클릭할 때 마다 경고창에 value값을 띄워주세요.</h3>
    <!-- <input type="checkbox" value="1" onclick="alert(value);">조항1
    <input type="checkbox" value="2" onclick="alert(value);">조항2
    <input type="checkbox" value="3" onclick="alert(value);">조항3 -->

    <input type="checkbox" value="1" onclick="check(this);">조항1
    <input type="checkbox" value="2" onclick="check(this);">조항2
    <input type="checkbox" value="3" onclick="check(this);">조항3


    <script>

        function check(tag){
            // console.log(tag);
            // alert(tag.value + "조항 선택")

            if(tag.checked){
                alert(tag.value + "조항 선택");
            }

        }



    </script>

</body>

 

결과

 

#실습2

<body>

    <h3>(select에서 value속성은 선택된 값을 의미합니다)</h3>
    <h3>change이벤트</h3>
   
    <h2 id="text">단어를 선택해주세요</h2>

    <select onchange="change(this)" >
        <option>한국어</option>
        <option>English</option>
        <option>중국어</option>
    </select>
   
    <script>

        var text = document.getElementById("text");

        function change(select){
            if(select.value == "한국어" ){
                text.innerHTML = "한국어 입니다."
            } else if(select.value == "English"){
                text.innerHTML = "영어 입니다."
            } else if(select.value == "중국어"){
                text.innerHTML = "중국어 입니다."
            }
        };
    </script>
   

</body>
 
 
결과

 

 

<기억하기>

* 노드 , 엘리먼트 , 태그는 다 같은 말이다!

 

댓글