레이블이 DOM Script인 게시물을 표시합니다. 모든 게시물 표시
레이블이 DOM Script인 게시물을 표시합니다. 모든 게시물 표시

2007년 8월 7일 화요일

onload에 여러개의 함수를 걸어주기!

예전에 BC카드 프로젝트를 작업할때 window.onload 이벤트를 쓸일이 있었다.
onload 이벤트를 바르게 쓸줄 몰라 <body onload="함수명()"> 이렇게 인라인으로 함수처리를 했었는데
그 당시 스크립트에 능했던 연길씨가 window.onload = function() {} 을 걸어서 쓰는걸 보고 놀라워 했었다.

그때 연길씨가 window.onload = function; 라고 작업해주면서, 이렇게 쓰면 onload 함수가 하나일땐 상관 없는데
여러개일땐 곤란한데 라고 중얼거려주시는걸 흘려 들었는데, DOM Script 6장을 공부하면서 잠시 추억에 젖어 BC 프로젝트 할때가 떠올랐다.

window.onload = firstFunction;
아주 직관적인 방법이지만 약간 근시안적이라고 윤석찬님이 책에 표현해 주셨다.

위처럼 onload 함수를 걸어주면 page onload 했을때 함수를 하나만 실행시킬수 있다.

window.onload = firstFunction;
window.onload = secondFunction;
이렇게 두개를 적어준다고 해도, 뒤에 선언한 secondFunction 함수만 실행 된다.

차선책으로 아래와 같이 적어줄수도 있다.

window.onload = function() {
 firstFunction();
 secondFunction();
}

실행해야 될 함수 개수가 적을땐 간단히 해결할수 있지만, 스크립트 규모가 크거나 문서를 읽고 난 후 실행해야할 함수 개수가 많을 경우엔
아래와 같이 쓰는게 좋다.

function addLoadEvent(func) {
    var oldonload = window.onload;
        if(typeof window.onload != 'function') {
            window.onload = func;
        } else {
            window.onload = function() {
                oldonload();
                func();
        }
    }
}

addLoadEvent(firstFunction);
addLoadEvent(secondFunction);

2007년 8월 2일 목요일

자바스크립트를 올바르게 사용하기

  • 단계적 기능 축소 : 스크립트를 사용하지 않더라도 동작 가능한 웹문서 만들기
    (자바스크립트를 정확하게 사용하여, 자바스크립트 기능이 없는 브라우저 사용자들도 웹사이트를 이용할 수 있게 하는 것.)
  • 스크립트 분리 : 웹 문서 구조에서 동작 분리하기
  • 하위 호환성 : 구 웹브라우저에서도 동작 가능하도록 학인하기

javascript:슈도 프로토콜
프로토콜이란 http://, ftp:// 와 같이 인터넷상의 컴퓨터들 간에 데이터를 주고받기 위한 일종의 약속으로 슈도 프로토콜은 이런 아이디어에서 출발한 비표준임.
javascript:슈도 프로토콜은 하이퍼링크에서 자바스크립트를 부르기 위해 만들었음.
제작할때 흔히 쓰던 코딩방식에서 슈도 프로토콜 이용 예를 볼수 있다.

<script type="text/javascript">
    function pop(url,name,w,h) {
        window.open(url,name,'width='+w+',height='+h+',scrollbars=no,status=1')
    }
</script>

<a href="javascript:pop('팝업주소.html','PopupName',300,400)">가로300*세로400 팝업 띄우기</a>

위 예제는 javascript:슈도 프로토콜을 지원하는 브라우저에서만 작동함.
마크업에서 슈도 프로토콜을 이용해 자바스크립트 기능을 참조하는 것은 나쁜 방법 임.


Upgrade1 - 자바스크립트 기능을 끄더라도 href 속성 값이 제대로 작동하게 변경

    <a href="팝업주소.html" onclick="pop('팝업주소.html','PopupName',300,400); return false;">가로300*세로400 팝업 띄우기</a>
    <a href="팝업주소.html" onclick="pop(this.getAttribute('href'),'PopupName',300,400); return false;">가로300*세로400 팝업 띄우기</a>

Upgrade2 - 마크업과 스크립트 분리
onclick과 같은 이벤트 핸들러의 경우 기능 부여를 위해 마크업에 넣어서 표현했었는데, 아래의 마크업만으로도 기능 부여가 가능함

    <a href="팝업주소.html" class="popup">가로300*세로400 팝업 띄우기</a>

    getElementById(id).event = action
    getElementsByTagName("a").event = action

  1. 문서 내 모든 링크의 배열을 만든다.
  2. 배열을 반복해 각 링크들을 검사한다.
  3. 링크가 popup 이라는 클래스를 가지고 있으면 링크의 클릭 여부를 검사한다.
    A. 클릭되면, 링크의 href 속성 값을 popup 함수로 처리한다.
    B. 링크가 원래 창에서 작동하지 않도록 기본 동작은 처리하지 않는다.

<script type="text/javascript">
    var links = document.getElementsByTagName("a");
    for(var i=0; i<links.length; i++) {
        if(links[i].className == "popup") {
            links[i].onclick = function() {
                pop(this.getAttribute('href'),'PopupName',300,400)
                return false;
            }
        }
    }
</script>

위 스크립트를 외부 파일로 빼냈을경우 스크립트 링크선언을 마크업 상단 <head> 태그에
<script type="text/javascript" src="외부파일.js"></script> 태그로 넣기때문에, 그 아래 문서들을 다 불러오기 전에
호출하게 되므로, getElementsByTagName 와 같은 메소드가 동작하지 않게됨

문서를 다 불러온다음 이벤트 핸들러를 처리 하게 해야 하므로,
onload 이벤트를 사용해서 함수를 동작하게 해야 함

    window.onload = prepareLinks;
    function prepareLinks() {
        var links = document.getElementsByTagName("a");
        for(var i=0; i<links.length; i++) {
            if(links[i].className == "popup") {
                links[i].onclick = function() {
                    pop(this.getAttribute('href'),'PopupName',300,400)
                    return false;
                }
            }
        }
    }

    function pop(url,name,w,h) {
        window.open(url,name,'width='+w+',height='+h+',scrollbars=no,status=1')
    }

Upgrade3 - 하위 호환성 부여하기

    if(!method) {
        return false;
    }

    해당 메소드를 지원하지 않는다면 실행하지 않게 하기

    if(!getElementById) {
        return false;
    }

    if(!getElementById) return false;
    if(!getElementById || !getElementsByTagName) return false;

[최종 코드]
    window.onload = function() {
        if(!document.getElementsByTagName) return false;
        var links = document.getElementsByTagName("a");
        for(var i=0; i<links.length; i++) {
            if(links[i].className == "popup") {
                links[i].onclick = function() {
                    pop(this.getAttribute('href'),'PopupName',300,400)
                    return false;
                }
            }
        }
    }

    function pop(url,name,w,h) {
        window.open(url,name,'width='+w+',height='+h+',scrollbars=no,status=1')
    }

이상, 다이내믹한 웹 표준 사이트를 위한 DOM 스크립트 5장 내용을 정리해 보았습니다.

2007년 7월 27일 금요일

기본 웹페이지 문서 구조

사용자 삽입 이미지

기본 웹 페이지의 문서 구조 - design by Sangini


요소노드 : <html> 을 비롯하여 모든 태그들을 요소 노드라고 할수 있다.
                nodeType = 1

속성노드 : <h1 class="logo"></h1>
                나는 주로 h1 태그에 로고 이미지를 많이 넣어 사용하기 때문에 속성노드인
                class="logo" 라고 주었다.
                nodeType = 2

텍스트노드 : <h1 class="logo">페이지의 가장 큰 제목입니다.</h1>
                   텍스트 노드에는 공백도 포함된다.
                   nodeType = 3