티스토리 뷰
+ 목표 :
---------------------------------------------
| ▶ {제목} |
---------------------------------------------
| {내용} |
---------------------------------------------
의 박스 컨텐트에서 내용줄은 처음에 숨겨져 있고
제목줄을 클릭하면 내용줄이 튀어나오는 토글 기능 구현.
을 하는데, 나같은 객체지향에 애로사항 많은 이들을 위해
함수를 클래스로 전환시켜 나가는 과정도 보여주기.
+ 구현 :
1. 기존에 하던대로 함수 제작
function wjToggle(curEl)
{
var cinEl = $(curEl).up('div', 1);
var contEl = $(cinEl).down('.content');
if ($(curEl).innerHTML.toLowerCase() == "▶")
{
contEl.show();
curEl.update('▼');
} else {
contEl.hide();
curEl.update('▶');
}
return false;
}
2. onClick 이벤트에 바로 적용해서 작동 확인
<div class="widjet"><div class="bar">
<div class="semo" onclick="wjToggle(this)">▶</div>
<div class="handle">{제목ddddddddddddddddddddddddddddddddddddddddddd}</div>
<div class="controls"><a href="javascript:void(0)" class="ctlEdit">+</a> <a href="javascript:void(0)" class="ctlDel">-</a></div>
</div>
<div class="content" style="display:none;">
내용
</div>
</div>
3. 이것을 여러 <div class="widjet"> 에 적용
$$('div.widjet').each(); 를 생각해 볼수 있다.
$$('div.semo').each(function(el) {
this.observe(''click', wjToggle); // 요기에서 2.와 다른점은 wjToggle 함수에 인자가 element 가 아닌 observe로 인해 event 가 간다는거다.
});
function wjToggle(event)
{
var curEl = Event.element(event); // event를 통한 element 구하기
var cinEl = $(curEl).up('div', 1);
var contEl = $(cinEl).down('.content');
if ($(curEl).innerHTML.toLowerCase() == "▶")
{
contEl.show();
curEl.update('▼');
} else {
contEl.hide();
curEl.update('▶');
}
return false;
}
이에, 한걸음 더 나아가 구현을 편하게 해주는 invoke 를 사용하여 내 머리가 스마트함을 보여주자.
$$('div.semo').invoke('observe', 'click', wjToggle);
4. 마우스를 올렸을때 손커서로 바꿔지도록 기능을 추가해본다.
$$('div.semo').invoke('setStyle', { cursor:'pointer' }).invoke('observe', 'click', wjToggle);
5. 이렇게 기능을 늘여나가려다보니 같은곳에 쓰이는 함수를 꾸러미로 묶고싶어졌다. 함수의 꾸러미를 만들수 있는것은 바로 Class !
그래서 wjToggle 함수를 클래스로 변형해보자.
var widjet = Class.create({
toggle: function() {
var cinEl = $(this).up('div', 1); // each() 의 인자에 해당되므로 this 사용가능.
var contEl = $(cinEl).down('.content');
if ($(this).innerHTML.toLowerCase() == "▶")
{
contEl.show();
$(this).update('▼');
} else {
contEl.hide();
$(this).update('▶');
}
return false;
}
});
var wj = new widjet();
$$('div.semo').invoke('setStyle', { cursor:'pointer' }).invoke('observe', 'click', wj.toggle);
6. 결과 전체 소스
<html>
<head>
<style type="text/css">
<!--
.widjet {
width: 450px;
border: 1px solid gray;
margin: 0 0 5px 0;
}
.bar {
height:22px;
background-color:lightblue;
}
.semo { float:left; width: 15px; }
.handle { float:left; margin-left:5px; width: 380px; height:22px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.controls { float:right; width: 30px; }
.content {
clear:both;
background-color:lightyellow;
}
-->
</style>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript" src="scriptaculous.js"></script>
<script language="javascript" type="text/javascript">
//<![CDATA
var widjet = Class.create({
toggle: function() {
var cinEl = $(this).up('div', 1);
var contEl = $(cinEl).down('.content');
if ($(this).innerHTML.toLowerCase() == "▶")
{
contEl.show();
$(this).update('▼');
} else {
contEl.hide();
$(this).update('▶');
}
return false;
}
});
document.observe('dom:loaded', function() {
var wj = new widjet();
$$('div.semo').invoke('setStyle', { cursor:'pointer' }).invoke('observe', 'click', wj.toggle);
});
//]]>
</script>
</head>
<body>
<div class="widjet">
<div class="bar">
<div class="semo">▶</div>
<div class="handle">{제목ddddddddddddddddddddddddddddddddddddddddddd}</div>
<div class="controls"><a href="javascript:void(0)" class="ctlEdit">+</a> <a href="javascript:void(0)" class="ctlDel">-</a></div>
</div>
<div class="content" style="display:none;">
내용
</div>
</div>
</body></html>
'웹프로그래밍 > js' 카테고리의 다른 글
| scriptaculous 웹문서 (0) | 2009.03.25 |
|---|---|
| Prototype.js 확장 컨트롤 LivePipe UI (0) | 2009.03.25 |
| Web 에서 Flash 이용한 Clipboard Copy (0) | 2009.03.24 |
| script.aculo.us 의 Sortable 사용 (1) | 2009.03.11 |
| Prototype responseJSON 사용 (0) | 2009.03.11 |
- Total
- Today
- Yesterday
- IOS
- Docker
- IE
- JQuery
- iphone
- Debug
- PHP
- javascript
- iis
- Android
- macos
- nodejs
- laravel
- JSON
- ASP
- mssql
- Mac
- sencha touch
- classic asp
- 안드로이드
- Linux
- API
- CSS
- Prototype
- 한글
- 워드프레스
- centos
- Wordpress
- git
- nginx
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 31 |