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;
컴포넌를 처음 알게된 곳은 여기. 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... |




이올린에 북마크하기
이올린에 추천하기