본문 바로가기
코딩도전기/Dom

CODO Day7_Java Script_DOM

by 코도꼬마 2023. 2. 9.

Event 객체와 This

  • 이벤트가 발생할 경우 이벤트 객체가 반환
  • 이벤트가 발생한 당사자 요소인 this(이벤트를 당한 태그)
  • 이 두 객체를 활용하면 복잡한 내용도 쉽게 해결할 수 있다.

<body>
    <!--Event : 이벤트 객체(발생한 이벤트의 모든 정보)를 받을 때-->
    <button onclick="arg1(event)">button 1</button>

    <!--This : 이벤트가 발생된 당사자 정보를 받을 때(버튼 자체)-->
    <button onclick="arg1(this)">button 2</button>
    
    <!--둘 다 받을 수도 있다-->
    <p><a href="#" onclick="arg2(event, this)">click 1</a></p>
    <p><a href="#" onclick="arg2(event, this)">click 2</a></p>    
</body>
<script>
    function arg1(obj){
        console.log(obj);
    }

    function arg2(evt, elem){  //evt, elem : 값에 임의로 지어놓은 이름('무엇이 들어올 것이다'를 명시/기능X)
        console.log(evt);
        console.log(elem);
        console.log(elem.innerHTML);
    }
</script>

 

Event Listener

  • 특정 요소에 특정 이벤트를 감시하는 기능을 추가
  • 잘 사용하지 않음(주로 속성으로 사용하기 때문)

  • 속성에 추가한 이벤트 에서 on만 빠진 형태

</head>
<body>
    <h4 id="msg">FOCUS NULL</h4>
    <P><input type="text" id="txtinput"/></P>
    <div id="eventZone"></div>
    <h4>mouse position : <span id="pos"></span></h4>
</body>
<script>
    //1단계 : 이벤트를 걸어줄 요소 가져오기
    var txtinput = document.getElementById('txtinput');
    var zone = document.getElementById('eventZone');

    //2단계 : 리스너 추가(이벤트, 실행함수)
    txtinput.addEventListener('focusin',fcin);

    function fcin(){
        console.log('focus in');  //이벤트가 잘 걸렸는지 확인

        //3단계 : 핸들링할 요소 가져오기 -> 원하는 속성 가져오기
        txtinput.style.backgroundColor = 'pink';
        document.getElementById('msg').innerHTML = 'FOCUS IN';
    }

    //실행함수에 ()를 붙이지 않음 - ()를 쓸 경우 함수가 실행되기 때문
    //실행하라는 것이 아니라 이벤트가 걸릴 경우 실행할 함수를 알려주는 것이므로
    txtinput.addEventListener('focusout',fcout);

    function fcout(evt){  
        //만약 이벤트 객체가 필요하다면 ()안에 넣어주기/ 이벤트가 발생하면 무조건 값을 넣어줌
        console.log('focus out');
        console.log(evt);
        txtinput.style.backgroundColor = 'skyblue';
        document.getElementById('msg').innerHTML = 'FOCUS OUT';
        //skyblue로 색상 변경
        //FOCUS OUT 출력
    }

    //딱 여기서만 쓸거면 익명함수를 쓰는 것이 좋다
    txtinput.addEventListener('keyup',function(evt){
        console.log(evt.keyCode);  //keyCode 가져오기
        if(evt.keyCode == 13){
            console.log(txtinput.value + '전송');
        }
    })

    zone.addEventListener('click',function(){
        console.log('click');
        zone.style.backgroundColor = 'orange';
    })

    zone.addEventListener('dblclick',function(){
        console.log('double click');
        //이벤트 리스너에서는 this 그냥 사용 가능
        this.style.backgroundColor = 'yellow';

    })

    zone.addEventListener('mouseenter',function(evt){
        console.log(evt);
        //evt.target == this
        evt.target.style.backgroundColor = 'blue';
    })

    zone.addEventListener('mouseout',function(){
        console.log('OUT');
        this.style.backgroundColor = 'yellowgreen';
    })

    document.addEventListener('mousemove',function(evt){
        //console.log(evt.screenX + '/' + evt.screenY);
        document.getElementById('pos').innerHTML = evt.screenX + '/' + evt.screenY;
    })
</script>

 

 

Browser Object Model

  • 브라우저(윈도우)를 모델로 봄
  • HTML과 Java Script는 Browser 안에서만 실행이 된다.
  • BOM은 DOM보다 한 단계 더 큰 개념이다.

 

Window Object

  • Window는 브라우저 “창”을 의미
  • window객체를 이용해 새로운 “window”를 “open” 할 수도 “close” 할 수도 있다.
open()
- open 함수는 새로운 윈도우 창을 생성 해 준다. 총 3개의 인자값을 갖는다.
- window.open(보여줄 페이지 주소,"창 이름","옵션");  //창이름은 잘 쓰지 않음

close()
- 열었던 새 창을 닫는 역할을 수행하는 함수
<body>
    <button onclick="myWindow()">창열기</button>
    <button onclick="closeWin()">창닫기</button>
</body>
<script>

    console.log(window);  //window는 브라우저를 의미
    console.log(window.innerWidth + " / " + window.innerHeight);
    var win;

    function myWindow(){
        console.log('window open!!')
        //window.open(url,title,option);

        //width / height : 창의 크기
        //top / left : 창의 위치(left의 경우 1번 모니터를 기준으로 한다)
        //resizable = no : 창크기 변경 여부(모든 브라우저에서 되지는 않음)
        //scrollbar = no : 스크롤바 생성(일부 브라우저에서만 동작)

        //창을 다루기 위해서는 변수에 담아야 한다
        win = window.open('https://www.w3cschools.com','',
        'width=400,height=400,top=500,left=500,resizable=no,scrollbar=no');
    }

    function closeWin(){
        win.close();
    }
</script>

 

  • location객체는 창을 이동시키거나 이동주소에 대한 정보를 제공해 준다.
  • window.location 이 정식 명칭이나 window 는 생략할 수 있다.

<body>
    <li>location은 위치 정보를 얻어 올 때 사용</li>
    <li>window.location.href</li>  <!--윈도우 생략가능-->
    <li>window.location.protocol</li>
    <li>window.location.hostname</li>
    <li>window.location.pathname</li>
    <li>window.location.port</li>
    <li>window는 생략 가능하다</li>
</ol>
<button>페이지 이동</button>
</body>
<script>
    //서버환경에서 실행해야 된다
    console.log('href : ',location.href);          //현재 페이지가 존재하는 경로
    console.log('protocol : ',location.protocol);  //http or https
    console.log('hostname : ',location.hostname);  //네트워크 상에서 도메인
    console.log('pathname : ',location.pathname);  //도메인을 제외한 나머지 주소
    console.log('port : ',location.port);          //포트번호

    var btn = document.getElementsByTagName('button');
    console.log(btn);
    btn[0].addEventListener('click',function(){
        location.href='./03_event.html'; //이동하고 싶은 곳으로 이동(./ : 현재)
    })
</script>

 

 

부모창과 자식창

  • 새창을 열면 새창은 “자식”, 기존창은 “부모”가 된다.
  • 자식은 부모창을 opener 라고 명명한다.
  • 부모와 자식 사이에 데이터를 전달 할 수 있다.
  • 로컬에서는 연결되지 않음(file:///D:/STUDY/04_DOM/09_parent.html)
  • 서버로 열어야함(http://127.0.0.1:5500/09_parent.html)
//부모창

<body>
    <button>창열기</button>
    <button>창닫기</button>
    <br/>
    자식창으로 보낼 데이터 : <input type="text" id="toChild"/>
    <input type="button" value="보내기" onclick="sendVal()"/>
    <br/>
    자식창에서 보낸 데이터 : <input type="text" id="fromChild"/>
</body>
<script>
    var win;
    var btn = document.getElementsByTagName('button');
    console.log(btn);
    btn[0].addEventListener('click',function(){
        win = window.open('./09_child.html','child','width=420,height=130');
    })
    btn[1].addEventListener('click',function(){
        win.close();
    })

    function sendVal(){
        //console.log('자식으로 데이터 보내기');
        var val = document.getElementById('toChild').value;
        win.document.getElementById('fromParent').value = val;
        console.log(val);

    }

    function plus(a,b){
        console.log('부모함수 plus 실행 : ',a+b);
    }
</script>
//자식창

<body>
    <h3>자식창</h3>
    부모창에서 받아온 값 : <input type="text" id="fromParent"/>
    <br/>
    부모창으로 보낼 값 : <input type="text" id="toParent"/>
    <input type="button" value="보내기" onclick="sendVal()"/>
</body>
<script>
    function sendVal(){
        console.log('부모에게 데이터 보내기');
        var val = document.getElementById('toParent').value;
        //opener == 부모 브라우저 창
        opener.document.getElementById('fromChild').value=val;
        opener.plus(10,20);
    }
</script>

'코딩도전기 > Dom' 카테고리의 다른 글

부모창_자식창 코드리뷰  (0) 2023.02.10
CODO Day8_Java Script_DOM  (0) 2023.02.10
DOM_TEST  (0) 2023.02.09
CODO Day6_Java Script_Dom(속성&이벤트)  (0) 2023.02.08