고래씌

[JavaScript] 10. window 객체 본문

Front-End/JavaScript

[JavaScript] 10. window 객체

고래씌 2023. 11. 13. 15:09

1. windows용 객체

: window 객체는 자바스크립트의 최상위 객체이며 크게 BOM과 DOM으로 나눔

 

- BOM(Browser Object Model) : location, history, screen, navigator...

- DOM(Document Object Model) : document

 

 

1) window.open('url', '창이름', '특성')

▶ window.open('url', '창이름', '특성')
  - 첫번째 인자값 : 새 창에서 열고자 하는 url 주소
  - 두번째 인자값 : 창 이름, 창이름이 같은게 이미 열려있을 경우, 새로 열리지 않고 이미 열려있는 창에서 새로고침이 된다.
  - 세번째 인자값 : 창의 특성, 새로 열릴창의 너비, 높이, 툴바, 스크롤바, 리사이즈여부 등등...(브라우저마다 작동방식 다름)

 

 

▶ 창의 특성

1) px

width = 500

height = 600

 

2) yes / no

resizable : 창 크기 조절가능 여부

location : 주소창이 보일건지 안보일건지 여부

menubar : 메뉴바 표시 여부

scrollbars : 스크롤바 표시 여부

status : 상태표시줄

toolbar : 도구 모음

 

 

3) 새창 열리며 네이버 창 열림

window.open('http://naver.com','네이버'); 

 

=> 같은 창이 이미 열려 있어서 확인버튼을 누르면 계속 새로고침

 

 

 

4) 새창 열리며 열면서 크기가 지정되어 열림

window.open('http://naver.com', '네이버', 'width=500, height=600, resizable=no, location=no');

 


1-2. window 객체의 timer 관련 메소드

1) window.setTimeout(콜백함수, ms)

 

■ 10_window객체.html

    <button onclick="test2();">확인</button>
    <script>
        function test2(){

            // 확인버튼을 누르면 3초후 alert창이 뜨도록 설정

            // setTimeout(function(){     // 익명함수
            //     alert('하이하이');
            // }, 3000);

            const newWindow = window.open() // 새로 열린 창의 window 객체 반환
            newWindow.alert('이 페이지는 3초후에 자동으로 닫힙니다..')  // 새로 열린창의 alert임


            let timeFn = setTimeout(function() {    // timeFn 변수에 저장
                newWindow.close();       // 3초뒤 창 닫음
            },3000);   // 3초




            clearTimeout(timeFn);   // setTimeout 비워주는 함수

        }

    </script>

 

setTimeout

- 내가 제시한 일정 시간 후에 해당 함수를 "딱 한번"만 실행

- 어떤 코드를 바로 실행하지 않고 일정 시간 기다린 후 실행해야하는 경우가 있는데, 이 경우 setTimeout 사용.

 

- 첫번째 인자 : 실행할 코드를 담고 있는 함수를 받음

- 두번째 인자 : 지연 시간을 밀리초(ms) 단위로 받음

 

☞ ★지워주지 않으면 백그라운드 어딘가에 계속 실행을 하고 있기 때문에 반드시 지워줘야 한다!

 

 

clearTimeout

: setTimeout을 비워주는 함수

 

☞ clearTimeout를 쓰려면 꼭 변수명을 제시해줘야 한다.

 

 

 

■ clearTimeout을 선언하지 않았을 때

    <script>
        function test2(){
            const newWindow = window.open() // 새로 열린 창의 window 객체 반환
            newWindow.alert('이 페이지는 3초후에 자동으로 닫힙니다..')  


            let timeFn = setTimeout(function() {
                newWindow.close();
            },3000);   // 3초
        }
       
    </script>

 

 

=> 3초 뒤 자동으로 창이 닫히는 것을 확인

 

 

■ clearTimeout을 선언했을 때

    <script>
        function test2(){
           
            const newWindow = window.open() // 새로 열린 창의 window 객체 반환
            newWindow.alert('이 페이지는 3초후에 자동으로 닫힙니다..')  // 새로 열린창의 alert임


            let timeFn = setTimeout(function() {
                newWindow.close();
            },3000);   // 3초
           
            clearTimeout(timeFn);   // setTimeout 비워주는 함수
        }
       
    </script>

 

 

=> 3초가 지나도 자동으로 창이 닫히지 않는 것을 확인

 

 

 

2) window.setInterval(콜백함수, ms);

 

■ 10_window객체.html

    <button onclick="test3()">확인</button>
    <div id="area1" class="area"></div>

    <script>
        function test3(){

            let count = 0;

            const clock = setInterval( 
                function(){      // 첫번째 인자
                    const now = new Date();   // 현재 날짜, 월, 일, 시간 등의 정보를 가져옴
                    let hour = now.getHours();   // 시간 가져옴
                    let min = now.getMinutes();   // 분 가져옴
                    let second = now.getSeconds();   // 초 가져옴
                    count++;

                    if(count > 10) clearInterval(clock);   // 10초가 지나면 멈춘다

                    if(hour > 12) {
                        hour -= 12;  // 12시가 되면 0으로 바뀜  // 13시 -> 1시
                    }

                    if(hour < 10) {
                        hour = "0"+hour; // 1시 -> 01시
                    }

                    if(min < 10) {
                        min = "0"+min;  // 1분 -> 01분
                    }

                    if(second < 10) {
                        second = "0"+second;
                    }

                    area1.innerHTML = `${hour}:${min}:${second}`;
                }
                , 1000  // 1초  // 2번째 인자
            )

            // setInterval : 내가 지정한 시간 간격마다 매번 함수를 실행
            

        }
    </script>

 

 

setInterval

- 웹페이지의 특정 부분을 주기적으로 업데이트해줘야 하거나, 어떤 API로 부터 변경된 데이터를 주기적으로 받아와야 하는 경우가 있는데, 이경우 setInetrval 사용

 

- 어떤 코드를 일정한 시간 간격을 두고 반복해서 실행하고 싶을 때 사용

- 첫번째 인자: 실행할 코드를 담고 있는 함수를 받음.

- 두번째 인자: 반복 주기를 밀리초(ms) 단위로 받음.

 

 

▶if(count > 10) clearInterval(clock);

=> count++; 있어 1초가 증가할때마다 count가 1씩 증가하는데 count값이 10을 초과하면(10초가 지나면) 멈추도록 설정한다

                    if(count > 10) clearInterval(clock);

 

 

 

=> 10초가 지난뒤, 시간이 멈춘 것을 볼 수 있다.

 

 

 


2. BOM(Browser Object Model)

 

1) location 객체

: 브라우저 주소창과 관련된 객체

 

 

▶ a 태그는 클릭시 요청할 url을 작성할 수 있는 href 속성을 제공한다.

    <button onclick="console.log(location);">확인</button>

   
<a href="http://www.naver.com">네이버로 이동</a>

 

▶div 태그

button 태그 assign  => 뒤로가기, replace => 뒤로가기가 없는 페이지 전환

 

 

 

 

▶ 새로고침

    <button onclick="location.href = location.href">새로고침</button>
    <br>

    <button onclick="location.reload();">새로고침</button>

 

 

 

 

2) screen 객체

=> 해상도에 따라 가로, 세로, 해상도, 브라우저 위치 값 등이 다르다

 

 

 

 

3) navigator 객체

=> 브라우저에 대한 정보(제조사, 버전, 종류... 등을 가지고 있는 객체)

 

 

 

4) history 객체

=> 페이지 이동에 대한 기록을 저장하고 있는 객체

 

 

 

 


3. DOM(Document Object Model)

▶ HTML에 있는 각각의 태그들을 노드(Node)라고 부름

- 요소노드(Element Node) : 태그 그 자체만을 의미함

- 텍스트노드(Text Node) : 태그내에 기록되는 문자열

 

▶ 텍스트노드가 존재하는 요소(시작태그가 종료 태그가 한쌍으로 이루어져있는 요소)

: div, a, h1, p, pre...

 

▶ 텍스트노드가 존재하지 않는 요소(시작태그로만 이루어져 있는 요소)

: input, img ....

 

- 속성노드(attribute Node) : 태그내의 속성

- 코멘트노드(comment Node) : HTML내에 작성하는 주석

 

 

3.1 노드생성과 관련된 메소드

1) 텍스트 노드가 존재하는 노드 생성(시작태그 + 종료태그)

 

■ 자바스크립트를 통해 동적으로 요소를 만드는 방법

 

(1) innerHTML 사용

            area2.innerHTML = '<h3>안녕하세요</hr3>';

 

 

(2) document에서 제공하는 메소드를 통해 요소객체로 만드는 방법

ⓐ elementNode 객체 생성

            //      document.createElement('태그명');
            const h3 = document.createElement("h3");    // <h3></h3>

 

 

ⓑ testNode 객체 생성

            //      document.createTextNode("문구");
            const textNode = document.createTextNode("안녕하세요"); // 안녕하세요

 

 

ⓒ 두 개의 노드를 연결(요소노드 하위로 텍스트노드 추가)

☞ 요소노드.appendChild(노드)

appendChildnode 객체만 자식 요소로 추가할 수 있음

            h3.appendChild(textNode);  // <h3>안녕하세요</h3>
            h3.setAttribute('id','js')

 

setAttribute 메서드는 다른 메서드와 함께 사용하여 HTML 요소의 여러 속성 값을 변경할 수도 있습니다. 예를 들어, 다음 코드는 h3태그의 id를 모두 'js'로 변경

 

 

=> console.log(h3, typeof h3);   

console.log(h3, typeof h3);   결과화면

 

 

▶ div태그 요소에 h3를 출력하고 싶다면?

            // appendChild를 이용
            area2.appendChild(h3);

 

=> 확인버튼을 클릭하면 "안녕하세요" 출력됨

 

 

2) 텍스트노드가 존재하지 않는 노드 생성(시작태그만 존재)

    <button onclick="test5();">확인</button>
    <div id="area3" class="big"></div>

    <script>
        function test5(){
            const img = document.createElement('img'); // <img> //클릭하면 이미지 생성됨

            img.setAttribute('src','https://iei.or.kr/resources/images/main/logo.svg');
            img.width = "200";
            img.height = "100";
            img.onclick = function(){   // 이미지클릭하면 삭제됨

                // 요소 삭제
                img.remove();
            }

            console.log(img);

            area3.appendChild(img);  // 확인버튼 클릭시 이미지 생성됨
        }
    </script>