-
[jQuery] WidgetDeveloper/HTML+Script 2013. 8. 20. 15:43
출처 : http://devx.tistory.com/262
새로 맡게 된 프로젝트가 jQuery UI를 사용하여서 jQuery UI 코드를 살펴보게 되어서 정리해보았다. 먼저, 사용자 정의 위젯을 만들기 위해서는 jquery.ui.widget.js의 $.widget()을 호출해야 한다.
$.widet()은 팩토리 메소드로 새로 생성할 위젯의 이름과 위젯의 프로퍼티 함수를 정의한 객체를 인자로 받아서 생성된다. 커스텀 위젯을 생성하는 방법은 다음과 같다.
123456789101112131415161718192021222324252627282930313233$.widget(
"ui.mywidget"
,{
// 위젯에서 사용할 옵션들을 정의한다.
options:{key:value,...},
// 커스텀 위젯을 생성하기위한 코드를 정의한다.
_create:
function
(){
// 커스텀 위젯 코드 안에서는 위젯의 element를
// this.element로 위젯의 옵션을 this.options로
// 접근할 수 있다.
if
(
this
.options.hidden ){
this
.element.hide();
}
},
_doSomething:
function
(event) {
// 커스텀 위젯의 코드를 수행한 후 위젯에 정의된
// 이벤트를 퍼트리기 위해서 _trigger()를 사용할
// 수 있다.
this
._trigger(
"close"
, event, {item:closedItem});
},
// 위젯을 제거하기 위한 코드를 정의한다.
// ※ 위젯이 추가된 element가 삭제될 때도 호출
destroy:
function
() {
this
.element.removeAttr(
'some-...'
);
// $.Widget.prototype에 직접 접근하여서 오버라이딩된
// 메소드를 호출할 수도 있다.
// ※ $.Widget.prototype. methodToOverride
// .apply(this, arguments);
$.Widget.prototype.destroy.apply(
this
, arguments);
}
});
$.widget()으로 생성되는 위젯은 jquery.ui.widget.js에 정의되어 있는 $.Widget을 상속받게 되는데 $.Widgt에서 기본적으로 제공해주는 기능들은 다음과 같다.
- options: 기본 옵션으로 disabled 옵션을 제공하며 option(String key[, String value])를 사용하여 값을 설정하거나 얻어오는 기능을 제공한다.
- enable()/disable(): option의 disabled 값을 true/false로 설정한다. 값 변경에 따른 동작은 위젯에서 따로 구현해줘야 한다.
- _trigger(type, event, uiHash): 이벤트를 발생시켜주는 메소드로 options로 넘겨진 callback 함수를 호출해준다.
$.widget()의 코드는 다음과 같이 구성되어 있다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899/**
* 커스텀 위젯을 생성해주는 팩토리 메소드이다.
* ※ 쉬운 설명을 위해서 ui.progressbar 위젯을 예로 들겠다.
*
* @param {String} name 커스텀 위젯의 이름을 받는다.
* - 예) ui.progressbar
* @param {Object} base 위젯의 기본이 될 Object를 받는다.
* - 기존의 widget을 상속받아서 사용하기 위해서 사용된다.
* - 예) $.widget("ui.draggable", $.ui.mouse, {...});
* @param {Object} prototype 커스텀 위젯을 정의한 코드
*/
$.widget =
function
( name, base, prototype ) {
/*
* name에서 namespace를 분리한다.
* 예) name이 ui.progressbar 였다면
* - namespace: ui
* - name: progressbar
* - fullName: ui-progressbar
*/
var
namespace = name.split(
"."
)[ 0 ],
fullName;
name = name.split(
"."
)[ 1 ];
fullName = namespace +
"-"
+ name;
/*
* base가 따로 주어지지 않은 경우 $.Widget을 상속받게한다.
*/
if
( !prototype ) {
prototype = base;
base = $.Widget;
}
/*
* sizzle의 filters에 커스텀 위젯을 등록한다.
* - 예) $(":ui-progressbar")와 같은 코드가 호출되는 경우
* progressbar 위젯이 설치된 엘리먼트들을 리턴하게
* 된다.
* - jQuery에서 Sizzle 코드는 다음과 같이 사용된다.
* jQuery.find = Sizzle;
* jQuery.expr = Sizzle.selectors;
* jQuery.expr[":"] = jQuery.expr.filters;
* - Sizle의 filters 관련코드는 아래의 링크에서 확인
*/
$.expr[
":"
][ fullName ] =
function
( elem ) {
return
!!$.data( elem, name );
};
/*
* 위젯의 namespace가 없는 경우 namespace를 생성한다.
* - ui.progressbar라면 ui namespace
*/
$[ namespace ] = $[ namespace ] || {};
/*
* 위젯을 생성하기 위한 생성자를 만든다.
* - $.ui.progressbar를 생성한다.
*/
$[ namespace ][ name ] =
function
( options, element ) {
// 단순 상속을 위해서 호출되는 경우에는 초기화를
// 생략하기 위해서 체크된다.
if
( arguments.length ) {
this
._createWidget( options, element );
}
};
/*
* base에 정의되어 있는 객체(instance) 변경을 할
* 가능성이 있으므로 인스턴스화 시켜서 상속받는다.
*/
var
basePrototype =
new
base();
basePrototype.options = $.extend(
true
, {},
basePrototype.options );
/*
* basePrototype과 위젯의 정보들(namespace, name,
* prefix, baseclass)을 상속받는 커스텀 위젯을 생성한다.
*/
$[ namespace ][ name ].prototype = $.extend(
true
,
basePrototype,
{
namespace: namespace,
widgetName: name,
widgetEventPrefix: $[ namespace ][ name ].
prototype.widgetEventPrefix || name,
widgetBaseClass: fullName
}, prototype );
/*
* 위젯을 생성하거나 위젯의 함수를 호출할 수 있게
* 해준다. ui.progressbar를 기존으로 보면 다음과 같다.
*
* 1. $.progressbar()를 호출하여서 progressbar를
* 생성한다.
* 2. $.progressbar("value")와 같이 progressbar의
* public 메소드를 호출할 수 있게 해준다.
*/
$.widget.bridge( name, $[ namespace ][ name ] );
};
관련자료:
- jQuery UI developer guide
- Sizzle document
- jQuery’s Data method
- Sizzle의 pseudo selector를 사용한 jQuery hidden selector
- 설명을 위해 사용한 progressbar 위젯
'Developer > HTML+Script' 카테고리의 다른 글
[JSON] json2.js 그리고 tostring (0) 2013.09.10 [CSS] CSSPrefixer (0) 2013.09.04 [CSS] Public 선언 (0) 2013.08.20 [JQuery] Plugin 만들기 (0) 2013.08.20 [Android] Javascirpt에서 Android 함수 호출하기 (0) 2013.08.14