티스토리 툴바

BLOG main image
분류 전체보기 (181)
(131)
성윤이 (0)
(5)
일상 (11)
낙관주의 (3)
삽질 (11)
웹사업개발팀 (5)
You just have not to waste you..
03:11 - best espresso maker
Guys usually require guarantee..
05/12 - college papers
Your supreme notes connecting..
05/11 - thesis service
Excellent topic just about uni..
05/11 - thesis writing service
This is the best column I hav..
05/11 - thesis writing service
Buy essays or written essay an..
05/10 - Buy custom essay papers
People find information just a..
05/09 - Buy essay
The best topic referring to th..
05/09 - buy an essay
A doctoral degree is very seri..
05/08 - dissertation
Everyone selects his/her own p..
05/07 - Essays for Sale
48,984 Visitors up to today!
Today 16 hit, Yesterday 50 hit
daisy rss
tistory 티스토리 가입하기!
2007/07/26 15:06
[]
Ajax을 이용한 UI에서 로딩인티케이터 컴포넌트를 사용하다 생긴 문제점을 개선해 보았다.

컴포넌를 처음 알게된 곳은 여기. http://firejune.com/1132&stext=protoload

위 포스트에도 언급되어 있지만, 이 컴포넌트의 큰 작정은 Dom Element단위로 인디케이터의 타겟을 지정할 수 있는것이다. 그런데 이 기능을 사용하다 보니 아래와 같은 문제점을 발견했다.

[문제점]
타겟 element가 tbody/tr/td와 같이 div와 동일레벨에 위치할 수 없는 경우, 즉 타겟 element의 parent에 div를 appendChild할 수 없는 경우 인디케이터의 위치가 정확하게 표시되지 않고, IE6.0의 경우 브라우저가 죽어버린다.

[원인]
div오브젝트로 인디케이터 오브젝트를 생성하고, 지정된 element의 offsetParent에 appendChild하게 되는데, tbody/tr/td를 타겟 element로 셋팅한 경우 그 offsetParent인 table 등에는 div 를 appendChild할 수 없다. 실제로 실행해보면 인디케이터오브젝트는 body의 child로 삽입되게 되다. 그런데 인디케이터의 위치를 구할때는 타겟 element의 parent를 기준으로 구하고(offsetLeft, offsetTop), 디스플레이는 body를 기준으로 하므로 보여지는 위치가 틀리게 된다. 더하여 IE6.0의 경우 인디케이터 오브젝트의 style.filter를 셋팅하다가 죽어버린다.

[해결책]
인디케이터 오브젝트를 항상 body에 appendChild하고, 스크립오브젝트의 위치를 body를 기준으로 계산하는 식으로 소스를 수정하면 정상적으로 동작할 것 같다. 성능의 차이가 있긴 하겠지만 이정도는... ^

1. 스크린 오브젝트를 appendChild하는 부분
원본
(element.offsetParent || document.body).appendChild(element._loading = e);
수정본
document.body.appendChild(element._loading = e);

2. 스크린오브젝트 위치 구하는 부분
원본
var left = this.offsetLeft,
             top = this.offsetTop,
             width = this.offsetWidth,
             height = this.offsetHeight,
             l = this._loading;

수정본
pos = Position.cumulativeOffset(this);
var left = pos[0],
     top = pos[1],
     width = this.offsetWidth,
     height = this.offsetHeight,
     l = this._loading;



Trackback Address :: http://10year.tistory.com/trackback/39 관련글 쓰기
Tracked from Firejune Blog | 2007/07/27 01:06 | DEL
Andreas Kalsch씨는 Ajax 로딩에 사용되는 인디케이터를 쉽게 다룰 수 있도록 Protoload라는 이름의 자바스크립트 라이브러리를 만들고 공개했다. Ajax 로딩 이벤트에 추가할 수 있으며 서버로부터 응답이 발생할 때 까지 나타나게 된다. 인디케이터는 기본으로 모달성격을 띠고 있으며, 종류는 크게 3가지로 분류할 수 있다. 전역(body) 인디케이터와, 박스 인디케이터, 그리고 부분(element) 인디케이터이다. 특히, element..
Tracked from Outsider's Dev Story | 2008/03/30 23:56 | DEL
Protoload는 Andreas Kalsch가 만든 Prototype Framework를 기반으로 한 Ajax 로딩 인디케이터를 사용하게 해주는 라이브러리이다. Ajax 로딩 인디케이터란 Ajax 통신을 시작할 때 데이터가 로딩중임을 사용자에게 알려주는 역할을 하는 것으로 보통은 GIF이미지가 사용되고 어떤 인디케이터를 사용할 지는 만드는 사람 맘이긴 하지만 보통 우측의 이미지가 Ajax 로딩 인디케이터의 대표적이다.Prototype Framew...
파이어준 | 2007/07/27 01:05 | PERMALINK | EDIT/DEL | REPLY
오! 멋진 패치로군요. 트랙백 주셔서 감사합니다.
Outsider | 2008/03/26 22:07 | PERMALINK | EDIT/DEL | REPLY
이 패치덕에 IE에서 좀 다른 위치에 인디케이터가 나오던 문제를 쉽게 해결했습니다.
감사합니다.
Antonio | 2008/12/04 19:39 | PERMALINK | EDIT/DEL | REPLY
하루종일 인티케이터 위치를 못잡아서... 찾다가.. 포기할까 했는데.........
우연히.. 이 패치를 보고.. 바로 해결이 되었습니다.....
너무너무 감사합니다............ 대단하십니다.......
프로그램 경력8년차가 Ajax 인디케이터 때문에 헤메고 있는 어느날에...........-.-
Name
Password
Homepage
Secret