'dojo.byId'에 해당되는 글 2건

  1. 2008/07/24 dojo by example(3) - 유틸리티 함수 (2)
  2. 2008/07/13 dojo by example(1) - 유틸리티 함수
hacking/web2008/07/24 17:49
크리에이티브 커먼즈 라이선스
Creative Commons License
남아 있는 유틸리티 함수들 중에서 정말 자주 쓰이는 몇가지만 더 알아보자.

dojo.byId(id)
document.getElementById(id)와 동일하며 프로토타입$(id)와 동일하다.
지정한 id를 가진 DOM 노드를 찾는다. 참고로 dijit.byId(id)와는 전혀 다른 녀석이니 헷갈리지 않기를... 그리고 다른 window(frame/iframe)의 노드를 찾고 싶을 때는 dojo.withGlobal(window,'byId',dojo,[id]) 처럼 하면 된다(뭐가 이렇게 복잡하냐고? 그래도 없는 것 보다는 낫다).
$()보다 길어서 타이핑하기 귀찮겠지만... 덕분에 프로토타입이나 jQuery와 섞어서 사용해도 아무런 문제를 읽으키지 않는다. 굳이 $()를 쓰고 싶으면 예전에 쓴 블로그를 참조하시길...

dojo.attr() - DOM 속성 관련 함수들
dojo.attr()은 getter/setter 두가지 역할을 겸하고 있으며, domNode 대신 해당 노드의 id를 문자열로 지정해도 된다.
  • dojo.attr(domNode, attrName) : 지정한 DOM 노드의 지정한 속성 값을 가져온다. domNode.getAttribute(attrName)와 비슷하다.
  • dojo.attr(domNode, attrName, attrValue) : 지정한 DOM 노드의 지정한 속성 값을 변경한다. domNode.setAttribute(attrName, attrValue)와 비슷하다. 참고로, dojo 1.1.1 이후 버전에서는 attrName/Value 쌍을 배열로 지정할 수 있다. 예를 들면: dojo.attr(domNode, { action: 'add.php', method: 'POST' });
  • dojo.removeAttr(domNode, attrName) : 지정한 DOM 노드의 지정한 속성을 삭제한다. domNode.removeAttribute(attrName)와 비슷하다.
domNode.setAttribute/getAttribute/removeAttribute를 사용하면되는데 왜 이런게 필요하냐고 물으신다면... 자바스크립트 닭질을 좀 더 하시길 권해드리는 바이다. 일단 dojo에서 이런 걸 제공한다는 사실만 기억해두면 조만간 고맙게 쓰게 될 날이 온다.

dojo.style() - DOM CSS 속성 관련 함수들
dojo.style()도 getter/setter 두가지 역할을 겸하고 있으며, domNode 대신 해당 노드의 id를 문자열로 지정해도 된다.
  • dojo.style(domNode, cssAttrName) : 지정한 DOM 노드의 스타일 중에서 지정한 CSS속성 값을 가져온다. 주의 할 점은 cssAttrName은 CSS 형식(font-size, left-padding ...)이 아닌 자바스크립트 형식(fontSize, leftPadding ...)으로 지정해야 한다는 것이다. 참고로, dojo 1.1.1 이후 버전에서는 CSS 형식과 자바스크립트 형식 둘 다 사용할 수 있으며, cssAttrName/Value 쌍을 배열로 지정할 수 있다. 예를 들면: dojo.style(domNode, { fontSize: '20pt', 'text-decoration': 'underline' });
  • dojo.style(domNode, cssAttrName, cssAttrValue) : 지정한 DOM 노드의 스타일 중에서 지정한 CSS속성 값을 변경한다.
dojo.style()함수는 계산된 스타일(computed style)을 대상으로 한다. 즉, 캐스캐이드된 여러가지 CSS속성들이 모두 적용된 상태를 기준으로 값을 얻어오거나 변경한다.

dojo.*Class() - DOM CSS 클래스 관련 함수들
별거 아닌거 같지만 짱 편한 함수 몇 개 소개한다. 이런 짓 해보신 적 없으신가?
domNode.className = domNode.className + ' ' + 'newClass'; // 공백 주의!
domNode.className = domNode.className.replace('oldClass', ' ');

이게 중간 중간 공백 신경 쓰려면 열라 귀찮다. 아무튼 이런 닭질은 이젠 안녕이다.
  • dojo.addClass(domNode, cssClassName) : 지정한 DOM 노드에 지정한 CSS 클래스를 추가한다. cssClassName에는 여러 개의 클래스 이름을 공백으로 구분하여 지정해도 된다.
  • dojo.removeClass(domNode, cssClassName) : 지정한 DOM 노드에서 지정한 CSS 클래스를 제거한다. cssClassName에는 여러 개의 클래스 이름을 공백으로 구분하여 지정해도 된다.
  • dojo.toggleClass(domNode, cssClassName) : 지정한 DOM 노드에서 지정한 CSS 클래스를 갖고 있으면 제거하고, 없으면 추가한다.
  • dojo.hasClass(domNode, cssClassName) : 지정한 DOM 노드가 지정한 CSS 클래스를 갖고 있는지 확인한다.
dojo.attr()/dojo.style()/dojo.*Class()함수들은 dojo.query()와 함께 쓰면 더욱 편리하다. dojo.query에 대해서는 다음에 따로 알아보기로 하고, 예를 하나만 들어보면:
dojo.query('tr').forEach(
    function(node, i) {
        dojo.addClass(node, (i % 2) ? 'even' : 'odd');
    }
);

유틸리티 함수는 세 번으로 끝낼려고 했는데... 생각보다 길어졌다.

다음에 남은 유틸리티 함수들을 알아보고, 그 다음에 에니메이션 관련 함수들 알아보기로 하고... 오늘은 여기까지~

Posted by iolo
hacking/web2008/07/13 19:58
크리에이티브 커먼즈 라이선스
Creative Commons License
dojo를 알고 있는 ajax 개발자들 조차도 dojo하면 먼저 뽀대는 나지만 용량이 크기, 느리고, 무거운 위젯 시스템(일명 dijit)을 떠올린다. dijit도 많이 가벼워졌고, 더 가볍게 쓸 수 있는 방법들 많이 있지만, 일단 무시하고...

dojo의 기본 시스템(일명 dojo core), 그 중에서도 유틸리티 함수들에 대해서 알아보기로 하자.

서버에서 ajax로 다음과 같은 json 데이터를 받아 왔다고 치자:
items: [
  { link: 'http://www.googledocs.com/', title: 'Google Docs' },
  { link: 'http://www.zoho.com/', title: 'Zoho' },
  { link: 'http://www.thinkfree.com/', title: 'ThinkFree Online' }
]

(데이터의 의미가 뭔지 알려고 하지 말자... 다친다 -.-;;;)

이걸 일반적인 자바스크립트로 처리한다고 치면:
for(var i = 0; i < items.length; i++) {
  str += '<a href="' + items[i].link + '">' + items[i].title + '</a>';
}
document.getElementById('resultDiv').innerHTML = str;

dojo 없이도 개선해야 할 여지가 많이 있지만, 그건 이 글을 범위를 벗어나니 스킵~

백문이 불여일견! dojo로 바꿔보자.
dojo.forEach(result, function(item) {
  str += '<a href="' + item.link + '">' + item.title + '</a>';
});
dojo.byId('resultDiv').innerHTML = str;

뭐가 달라졌을까...
1. 맨 아랫줄을 보면 document.getElementById() 대신 dojo.byId()가 사용된 것을 볼 수 있는데, 이건 프로토타입의 $() 와 비슷하다. 그냥 타이핑을 줄여주는 것 뿐이다.
2. 고전적인 for 루프 대신 dojo.forEach() 가 사용되었다.
for (var item in items) { } 도 있으므로 별 필요가 없다고 생각할 수 있지만, 자바스크립트의 for...in...은 유명한 evil 중의 하나다. 믿어라. 크록포드옹께서 그리 말씀하셨다.
다음에 보게 되겠지만 dojo.forEach()는 dojo의 배열 지원 함수 중의 하나에 불과하다. 모두 합체하면 게키강가3가 나온다. 믿거나 말거나... -.-;;; 루리루리짱께서 그리 말씀하셨다.

두둥! 이것이 바로 게키강가3!

아무튼 다시 원래 길로 돌아와서...
별로 편한거 같지 않다는 분들이 계시다. 한가지만 더 해보자.
dojo.forEach(result, function(item) {
  str += dojo.string.substitute('<a href="${link}">${title}</a>', item);
});
dojo.byId('resultDiv').innerHTML = str;

dojo.string.substitute()라는 이름은 길지만, 의미가 명확한 함수를 사용했다.
멋지다! 결과는 달라지지 않았지만, 코드가 아름다워졌다! 자바스크립트와 HTML의 따옴표 사이에서 방황했던 개발자라면... 감동! 그 자체다.

그래도 별로 편한거 같지 않다는 분들이 계시다.
하지만... 너무 덥다. -.-;;;; 오늘은 그만 하자.
아쉬운 분들을 위해 선물 하나 준비했다. 클릭하면 크게 보이겠지만, 그냥 작게 보고 만족하자.=3=333
사용자 삽입 이미지

Posted by iolo