FrontEnd/JavaScript

#38. JavaScript(개요, 데이터입출력)

열하나요 2023. 8. 24. 13:55

38-1. 개요

on : 이벤트 속성

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <!-- 내가 가져다 쓸 외부 .js파일을 script태그의 src속성으로 연결시켜줌!!(외부방식)-->
    <script src="resources\sample.js"></script>

</head>
<body>

    <!--
        Web(Front-End)의 3요소
        - HTML : 웹 페이지의 구조(웹 문서의 큰 틀 / 뼈대) (정적)
        - CSS : 스타일(색상, 테두리, 디자인, 레이아웃...) (정적)
        - JavaScript : 웹 문서 상에 이벤트가 발생했을 때 추가적으로 실행해야하는 동작을 처리(동적인 효과)
        (Java라는 프로그래밍 언어와는 전혀 무관!!!!!!!!!!!!)
    -->

    <h1>자바스크립트 개요</h1>

    <h3>1. 스크립트 언어란?</h3>
    <p>
        프로그램의 동작을 사용자의 요구에 맞게 수행하도록 <br>
        매우 빠르게 배우고 짧은 소스코드로 상화작용 하도록 고안된 언어들.
    </p>

    <hr>

    <h3>2. 자바스크립트</h3>

    <p>
        웹 브라우저에서 가장 많이, 가장 기본적으로 사용되는 '인터프리터 방식'의 스크립트 언어 <br>
        <!-- 개발자도구에 console창에 입력해 출력값을 볼 수 있음-->

        - 자바 : 컴파일 => 컴파일 단계를 거치고나서 실행되는 개념 => 오류 잡기 수월 <br>
        - 자바스크립트 : 인터프리터 방식 => 컴파일 단계를 거치지않고 곧바로 실행되는 개념 <br>
    </p>

    <!-- 
        인터프리터 방식
        => 소스코드를 읽어내면서 실행(실시간으로 분석해서 실행)
        => 코드상 문법적인 문제가 있다면 바로 알려주지않고 실행시점 알려줌
        => 자바에 비해서 오류찾기가 힘들 수 있음

        자바는 컴파일 + 인터프리터 방식
    -->

    <hr>

    <h3>3. 장단점</h3>
    <h4>* 장점</h4>
    <ul>
        <li>요소에 이벤트가 발생했을 때 코드를 한 줄 씩 읽어나가면서 수행하기 때문에 속도가 빠름</li>
        <li>
            간단한 코드작성으로 초보자가 접하기 쉬운언어(단순한구조, 원칙)
            예) 접근제한자 개념 없음,
                메소드 정의 시 반환형 정의 안함,
                변수 선언 시 자료형을 지정할 필요가 없음(타입 추론)
        </li>
    </ul>

    <h4>* 단점</h4>
    <ul>
        <li>웹 특화된 기술 => 내부에서 제공되는 기술이 제한적임</li>
        <li>HTML내에 소스코드를 작성하기 때문에 외부에 공개됨</li>
    </ul>

    <hr>

    <h3>4. 자바스크립트 소스코드 작성 위치에 따른 종류</h3>

    <ol>
        <li>
            inline(인라인) : 이벤트를 부여하고자 하는 요소 내에 간단한 소스코드를 작성해서 실행하게 하는 방법
        </li>
        <li>
            internal(내부) : 해당 html문서 내에 script태그 영역에 소스코드를 작성해서 실행하게 하는 방법
        </li>
        <li>
            external(외부) : 소스코드들을 별도의 .js파일로 작성해서 script태그를 가져다가 실행하게 하는 방법
        </li>
    </ol>

    <br>

    <h4> 1) inline방식</h4>

    <p>
        태그 내에 직접적으로 실행할 간단한 소스코드를 작성해서 실행 시킴 <br>
        주로 실행해야하는 소스코드가 매~~~~~우 소량일 때 사용 <br><br>

        [ 표현법 ] <br>
        <태그명 이벤트속성="해당 태그에 해당 이벤트가 발생했을 때 실행할 소스코드"><태그명>
    </p>

    <!-- 버튼이 클릭되는 순간(== 버튼에 클릭 이벤트가 발생하는 순간) 알림창 띄우기 -->
    <button onclick="window.alert('나 불렀어~?')">나는 버튼이다</button>

    <!-- 버튼이 클릭되는 순간(== 버튼에 클릭 이벤트가 발생하는 순간) -->
    <button onclick="console.log('우하하하하핳 콘솔이다')">나는 버튼이다</button>

    <!-- Console(개발자도구탭) : 주로 디버깅할 용도 -->

    <br>

    <h4> 2) internal 방식</h4>

    <p>
        script태그 영역에 함수단위로 소스코드들을 작성해놓고 <br>
        특정 요소에 이벤트 발생 시 해당 함수를 호출해서 실행시키는 방식 <br>
        => script태그는 head, body 태그내에 아무곳이나 적어도 상관없음 <br>
    </p>

    <!-- 버튼이 클릭되는 순간(== 클릭 이벤트가 발생하는 순간) 알림창 띄어보기 -->

    <!-- 인라인 + 내부방식 -->
    <button onclick="abc();">알림창 나와랏!!얍!!!!!</button> <!-- 버튼을 클릭할 때 abc함수 호출 -->
    <!-- abc라는 함수가 존재 x - 만들어줘야 함=> script요소! 어디에 만들어도 상관x -->

    <!-- 순수 내부방식 -->
    <!-- 콘솔창에 출력하는 버튼 -->
    <button id="btn">콘솔창 출력</button>



    <script>
        // 자바스크립트 소스코드를 기술할 수 있는 영역
        /* 
            여러 줄 주석
        */

        // 접근제한자 (예약어) 반환형 메소드명(매개변수) --> 자바의 메소드
        // 메소드와 함수의 차이?? => 메소드는 객체가 필요(자료형)
        // 매개변수가 없는 단순한 함수 만들어보기
        // abc라는 이름을 가진 함수 정의 
        function abc(){ // 식별자를 정의한 함수를 선언적 함수라고 한다.
            // 해당 함수 호출 시 실행할 코드를 기술
            window.alert('알림창 출동~');
        }

        // 순수 내부 방식으로 이벤트 부여
        // 1. 이벤트를 적용시키고자하는 요소(태그)를 가지고 오기
        const btn = document.getElementById('btn');

        // 2. 선택된 요소의 이벤트 속성에 접근해서 해당 이벤트 발생 시 실행할 함수를 대입
        btn.onclick = function(){ // 익명함수 : 이름이 없는 함수, 이벤트 발생 시 호출
            // 함수를 호출했을 때 실행할 코드를 기술
            window.console.log('이게머지...?????????????');

            abc(); // 함수 내부에서 미리 정의된 선언적 함수를 호출 가능
            sdwfwjkdsfl(); // 없는거 호출하면 아파함
        }

    </script>

    <hr>

    <h4 onclick="window.alert('버튼만 클릭하라는 법이 어딨어~!!~!!')">external방식</h4>
    <p>
        별도의 .js파일로 소스코드를 작성하고 해당 html문서에서 가져다가 실행하는 방법
    </p>

    <!-- 외부방식 + 인라인 방식 -->
    <button onclick="test();">테스트 출동~~</button>

</body>
</html>
// 스크립트 영역

function test(){
    window.alert('test불렀어 ~??');
}

 

 

38-2. 데이터입출력

console.dir을 하면 해당 요소의 속성 : "속성값"이 나오는데 input요소는 value값이 '빈문자열'이 나타난다.(null값 아님)
그런데 name값에 값을 입력하면 value값이 name값으로 변경된다.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>입출력해보자!</title>
    <style>
        .area{
            border : 1px solid black;
            width : 500px;
            height : 200px;
        }
    </style>
</head>
<body>
    <h1>자바스크립트에서의 입/출력</h1>

    <!-- 
        자바스크립트 데이터 입출력 관련 객체들
        1. window : 자바스크립트 내장객체로 브라우저의 창이 하나 열릴때마다 하나씩 만들어지는 객체
        브라우저 창 안에 존재하는 모든 요소들의 최상위 객체 == extends Object
        => window.alert(); => alert();
        => console.log(); => window.console.log();
        (모든곳에 적용되기 때문에 생략 가능)

        2. document : 웹문서(HTML)마다 하나씩 만들어지는 객체
                      HTML문서에 대한 정보들을 가지고 있음
                      document.getElementById();

    -->

    <h2>1. 데이터를 출력하는 기본 구문</h2>

    <p>
        1) window.alert('알림창에 출력할 문구'); <br>
        2) window.console.log('콘솔창에 출력할 문구'); <br>
        3) document.write('문서에 출력할 문구'); <br>
        4) 선택한요소.innerHTML/innerText = '해당 요소에 출력할 문구';
    </p>

    <h3>3) document.write('문서에 출력할 문구')</h3>
    <button onclick="documentWrite();">문서에 출력</button>

    <script>
        function documentWrite(){
            //document.write('문서에 출력');
            //document.write('<b>맙소사</b><br><i>안녕</i>이게될까요??');
            // SPA가 유행~?
            // 화면에 출력할 문자열에 HTML태그가 있을 경우 해석해서 동적인 요소를 만들어줌

            var table = '<table border="1">'
                table += '<tr>'
                table += '<td>1</td>'
                table += '<td>2</td>'
                table += '</tr>'
                table += '</table>'
            
            document.write(table);

        }
    </script>

    <h3> 4) 선택한요소.innerHTML / innerText = '해당 요소에 출력할 내용'</h3>

    <div id="area1" class="area" onclick="divclick();">  
        innerHTML과 innerText
        자바스크립트에서 특정한 요소(Element)안의 값(Content)을 가지고 온다거나 <br>
        변경하고자 할 때, <b>innerHTML, innerText</b>라는 속성에 접근 <br>
        => 가지고 올 때 : 변수 = 선택한요소.innerHTML/innerText <br>
        => 변경하고자 할 때 : 선택한요소.innerHTML/innerText = '변경할 값';
    </div>
    <!-- 클래스 선택자를 이용해서 div요소의 테두리를 검정색 실선 1px / 가로길이 500px 세로길이 200px -->

    <button onclick="elementValue();">확인</button>

    <script>
        function elementValue(){
            // 1. 먼저 해당 요소 객체를 가져와서 변수에 담기!
            const divEl = document.getElementById('area1')

            console.log(divEl);

            // 선택한 요소의 정보를 알아내고자 한다면 속성에 .을 찍고 접근하면 됨!!!!!!
            console.log(divEl.id); // id : 해당 요소의 id속성값
            console.log(divEl.className); // className : 해당 요소의 class속성의 값

            console.log(divEl.innerHTML); // HTML 태그들 포함(Content값 안의~)
            console.log(divEl.innerText); // HTML 태그들 미포함

            // content값 get하는 방법

            // set하는 방법
            divEl.innerHTML = '<b>innerHTML로 속성값을 변경함</b>';
            divEl.innerText = '<b>innerText로 속성값을 변경함</b>';

            console.dir(divEl); // 해당 값의 디렉토리 구조를 보고자 할 때 사용(속성들의 정보)

            divEl.style.color = 'red';
        }

        // 실습
        // div요소를 클릭하면 '안녕'이라는 문구를 알림창으로 띄워주기!
        function divclick(){
            window.alert('안녕');
        }
        // 익명함수로도 됨!
        const divEl = document.getElementById('area1');
        divEl.onclick = function(){
            alert('안녕~');
        }

    </script>

    <hr>

    <h2>2. 데이터를 입력받는 기본 구문(변수에 대입 가능)</h2>
    <p>
        1) 변수 = window.confirm('질문내용'); <br>
        2) 변수 = window.prompt('질문내용'); <br>
        3) 변수 = 선택한요소.속성(id, className, innerHTML, innerText, .....); <br>
        4) 변수 = 선택한input요소.value;
    </p>

    <h3>1) window.confirm('질문내용');</h3>
    <p>
        confirm 호출 시 '질문 내용'과 "확인/취소"버튼이 존재하는 알림창 발생 <br>
        확인 버튼 클릭 시 true값, 취소 버튼 클릭 시 false값 반환
    </p>

    <button onclick="testConfirm();">클릭</button>
    <div id="area2" class="area"></div>

    <script>
        function testConfirm(){

            const result = window.confirm('졸리면 확인, 아니면 취소를 누르세요.');
            console.log(result); // 확인 / 취소 결과값 확인

            const divEl = document.getElementById('area2'); // 요소객체 변수에 할당

            //divEl.innerHTML = '<h1>문구테스트</h1>'; // 할당한 요소 객체 innerHTML속성값 변경
            
            if(result) {
                divEl.innerHTML = '<h1 style="color:red; font-size:75px">눈떠!!!</h1>';
            } 
            else { // 꼭 이렇게 else를 개행하고 써줘야 함
                divEl.innerHTML = '<h1>안 졸린데요??</h1>';
            }
        }
    </script>
    
    <hr>

    <h3> 2) window.prompt('질문내용') </h3>

    <p>
        prompt는 호출 시 '질문내용'과 입력할 수 있는 '텍스트 상자'와 '확인/취소'버튼이 보여지는 알림창 발생 <br>
        - 확인 버튼 클릭 시 텍스트상자에 입력한 값을 반환 <br>
        - 취소 버튼 클릭 시 null값을 반환
    </p>

    <button onclick="testPrompt();">클릭</button>
    <div id="area3" class="area"></div>
    
    <script>
        // 자바스크립트 영역
        function testPrompt(){

            const name1 = window.prompt('푸바오 동생 이름 뭘로 지을까?');
            const name2 = window.prompt('푸바오 둘째 동생 이름 뭘로 지을까?');
            console.log(name1);
            console.log(name2);

            // 푸바오의 첫째 동생 이름은 XX이구요 둘째동생 이름은 XX입니다. <= 요 형태로 div요소 내부에 출력!
           const divEl = document.getElementById('area3');
           divEl.innerHTML = '푸바오의 첫째 동생 이름은 ' + name1 + '이구요 둘쨰동생 이름은 ' + name2 + '입니다.';
        }
    </script>

    <button onclick="testPrompt2();">숫자입력</button>
    <ul id="ul1">

    </ul>

    <script>
        function testPrompt2(){
            const num = prompt('숫자만 입력해 주세요~~~~~~~ 제바알~!!');
            
            const ulEl = document.getElementById('ul1');

            // 입력된 값만큼 ul의 자식요소로 넣고 싶음!
            /*
            자바였다면?
            for(int i = 0; i < num; i++){
                ulEl.innerHTML += '<li>자식</li>';
            }
            */

            let str = '';
            for(let i = 0; i < num; i++){
                str += '<li>자식</li>';
            }
            ulEl.innerHTML = str; /* 사용자가 입력한 값 만큼의 li요소 */
        }
    </script>

    <h3> 4) 선택한input요소.value; ******************************************************** </h3>

    아이디 : <input type="text" name="userId" id="userId"> <br>
    비밀번호 : <input type="password" name="userPwd" id="userPwd"> <br>

    <button onclick="testInput();">클릭</button>

    <script>
        function testInput(){
            const inputId = document.getElementById('userId');
            const inputPwd = document.getElementById('userPwd');

            //console.dir(inputId);
            // console.dir을 하면 해당 요소의 속성="속성값"이 나오는데 input요소는 value값이 '빈문자열'이 나타난다.(null값 아님)
            // 그런데 name값에 값을 입력하면 value값이 name값으로 변경된다. 

            console.log(inputId.value);
            console.log(inputPwd.value);

            inputId.value = '응 너 아이디 못 써~';

        }
    </script>

</body>
</html>