티스토리 뷰
/**
* Context2 jQuery Plug-in
* @author leeejong@neowiz.com
*/
(function( $ ){
//divContainer는 Array로, 각 level별 jQuery Div 객체들을 담아둔다.
//이 변수는 클로저와 함께 유지된다.
var divContainer = [];
$.fn.context2 = function( options ){
//옵션 Default를 설정해준다. 유저는 Data, 최대길이, 사용될 함수를 옵션으로 사용할 수 있다.
var options = $.extend({ contextData:[], maxHeight:100, usrFn:function(){} },options);
var contextData = options.contextData;
var maxHeight = options.maxHeight;
var usrFn = options.usrFn;
//플러그인 요소 가 아닌 다른영역(document)이 클릭되었을때 divContainer가 담고있는 모든 div들을 지워준다.
$(document).on('click', function(){
for( var i in divContainer )
divContainer[i].remove();
});
//플러그인이 클릭되면 drawContext를 호출한다.
return this.on( "click", function(e){
drawContext.call( this, 0, contextData );
return false;
});
//drawContext
function drawContext( level, nodeData ){
var $this = $(this),
$body = $('BODY');
var styles = {
overflow : "auto",
position : "absolute",
border : "2px outset white",
minwidth : "160px",
liststyletype : "none",
backgroundColor : "lightgray",
width : "100px",
maxHeight : options.maxHeight +"px"
};
var $div = $('<div />').css( styles ).appendTo( $body ),
$ul = $('<ul />').appendTo( $div );
//클릭이벤트가 발생했으므로 현재레벨 및 하위레벨의 div들은 모두 삭제해준다.
for( var i=level; i<divContainer.length; i++ )
divContainer[i].remove();
//그리고 방금 생성한 div를 현재level에 추가해준다.
divContainer[level] = $div;
//위치선정 알고리즘
var offset = $this.offset(),
left = offset.left + (level ? $this.outerWidth() : 0),
top = offset.top + (!level ? $this.outerHeight() : 0),
bodyWidth = $body.width() + $body.scrollLeft(),
bodyHeight = $body.height() + $body.scrollTop();
if( level && ($this.width() + left) > bodyWidth )
left = offset.left - $this.width();
$div.css({
left: left,
top: top
});
nodeData.forEach( function(child){
var $child = $('<li style="font-family:consolas; font-size: 10px; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: rgb(212, 212, 212); text-align: left; margin: 0px; padding: 4px 10px 4px 4px; height: auto; float: none;" />')
.appendTo( $ul );
if(child.children === undefined){
$child.text(child.text).click( function(e) {
usrFn(child);
return false;
});
}
else{
$child.text(child.text+' ★').click( function(e){
drawContext.call( this, level+1, child.children );
return false;
});
}
});
}
}
}( jQuery ));
'IT > WebB' 카테고리의 다른 글
MSSQL 바이너리 -> 가져와서 파싱하기 (0) | 2015.12.08 |
---|---|
RequireJS (0) | 2015.12.08 |
Closure가 무엇인가 (0) | 2014.05.29 |
AJAX (0) | 2014.03.17 |
Javascript 상속-함수를 사용한 방식 (0) | 2013.08.05 |
- Total
- Today
- Yesterday
- nsstring
- 하포원
- 박찬욱
- 연구개발직
- 티스토리챌린지
- Octane S2
- 하 준 숴이
- 깝스 1회
- 취업
- 0x0422
- happo-one
- 칠레와인
- cfstring
- 존슨 황
- 감정수업
- 개발자취업
- 취준생
- 일리네어
- 개발자
- 컴공
- 존슨황
- 오블완
- 나가노 스키여행
- Java Developer Day
- 컴퓨터공학과
- swift
- 언프리티 랩스타
- 송강호
- JS
- 이창동
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |