'03.HTML 4.X, HTML5, XML...'에 해당되는 글 234건

  1. 2009.01.23 parseXML (xml 파서) 1
  2. 2009.01.19 미디어 플레이어 제어
  3. 2009.01.19 자바스크립트 팝업창 관련
  4. 2008.12.24 스크롤바 색상
  5. 2008.11.28 웹에서 프린터 하기 scriptX
  6. 2008.11.28 동적 테이블 1
  7. 2008.11.28 html 에서 excel 바로 다운받기
  8. 2008.11.19 FusionCharts.js 자바스크립 파일과 그래프용 swf파일
  9. 2008.11.12 기존 웹 리소스 이용하기
  10. 2008.11.10 HTML 태그 제거 정규식
  11. 2008.11.10 작지만 강력한 HTML 파서, HtmlCleaner
  12. 2008.11.10 파싱된 소스코드 확인하기: 주소창에 다음 코드를 입력 후 Enter
  13. 2008.11.10 아래 코드는 현재 블로그에서 적용되고있는 스크립트입니다.
  14. 2008.11.04 input 입력모드시 한글,영문
  15. 2008.10.30 트리메뉴 음~ 괜찮다..(windows 탐색기 같은거)
  16. 2008.10.30 prototype.js 를 위한 개발자 노트
  17. 2008.10.30 테이블 안에 내용 넘는거 자동으로 줄바꿈
  18. 2008.10.30 ui 목록 샘플
  19. 2008.10.30 div 레이아웃과 table 레이아웃
  20. 2008.10.30 css 로 텝메뉴를 만들어 주는 프로그램
  21. 2008.10.30 CSS 개발툴
  22. 2008.10.28 모든 셀에 한꺼번에 바탕색 지정
  23. 2008.10.27 css로 만든 메뉴모음 사이트
  24. 2008.10.25 XML의 기본 구조와 문법
  25. 2008.10.25 XML JavaScript DOM (XML 정보 보기)
  26. 2008.10.25 JavaScript DOM을 이용한 Element 추가하기
  27. 2008.10.25 XML JavaScript DOM을 이용해 테이블 만들기
  28. 2008.10.25 JavaScript DOM을 이용해 이미지 동적 생성 하기
  29. 2008.10.25 JavaScript DOM을 이용한 XML 문서 만들기 1
  30. 2008.10.24 XML & JAVASCRIPT로 트리 메뉴(tree menu) 만들기
반응형

<html>
<head>
<script type="text/javascript">
function parseXML()
{
try //Internet Explorer
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  }
catch(e)
  {
  try //Firefox, Mozilla, Opera, etc.
    {
    xmlDoc=document.implementation.createDocument("","",null);
    }
  catch(e)
    {
    alert(e.message);
    return;
    }
  }
xmlDoc.async=false;
xmlDoc.load("note.xml");
document.getElementById("to").innerHTML=xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
document.getElementById("from").innerHTML=xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue;
document.getElementById("message").innerHTML=xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue;
}
</script>
</head>

<body onload="parseXML()">
<h1>W3Schools Internal Note</h1>
<p><b>To:</b> <span id="to"></span><br />
<b>From:</b> <span id="from"></span><br />
<b>Message:</b> <span id="message"></span>
</p>
</body>
</html>


Posted by 1010
반응형

<html>
<head>
<title> 미디어 플레이어 제어 </title>

</head>

<body>
<OBJECT ID="Player"
  CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6">
  <PARAM name="autoStart" value="True">
  <PARAM name="URL" value="mms://mmc.daumcast.net/mmc/1/500/0902600000101h.wmv ">
</OBJECT>

<SCRIPT FOR="Player" EVENT="buffering(Start)">
var idTimer;
if(Start == true)
{
 idTimer = setInterval("setStatus()", 1000);
}
else
{
 clearInterval(idTimer);
}
</SCRIPT>
<SCRIPT FOR="Player" EVENT="StatusChange()">
window.status = Player.status;

</SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
<!--
function setStatus()
{
 var bf = parseInt(Player.network.bufferingProgress);
 if(bf < 100)
 {
  window.status = "버퍼링 중 : " + bf + " %";
 }
 else
 {
  window.status = "버퍼링 완료";
 }
}

//-->
</SCRIPT>
</body>
</html>







<html>
<head>
<title> 미디어 플레이어 제어 </title>
</head>

<body>
<OBJECT ID="Player"
CLASSID="CLSID:6BF52A52-394A-11d3-B153-00C04F79FAA6">
<PARAM name="autoStart" value="True">
<PARAM name="URL" value="mms://mmc.daumcast.net/mmc/1/500/0902600000101h.wmv">
</OBJECT>
uiMode<select onchange="setUI(this.options[this.selectedIndex].value)">
<option value="invisible">invisible
<option value="none">none
<option value="mini">mini
<option value="full">full
</select>
<input type="button" value="volume +10" onclick="setVol('+')">
<input type="button" value="volume -10" onclick="setVol('-')">
mute <input type="checkbox" onclick="mute(this.checked)">
<input type="button" onclick="setPos(-10)" value="10초 전">
<input type="button" onclick="setPos(10)" value="10초 뒤">
<input type="button" onclick="Player.controls.play();" value="재생">
<input type="button" onclick="Player.controls.stop();" value="정지">
<input type="button" onclick="Player.controls.pause();" value="일시정지">

<SCRIPT LANGUAGE="JavaScript">
<!--
function setUI(str)
{
Player.uiMode = str;
}
function setPos(v)
{
Player.controls.currentPosition += v;
}
function setVol(flag)
{
if(flag == '+')
Player.settings.volume += 10;
else
Player.settings.volume -= 10;
}

function mute(stat)
{
if(stat)
Player.settings.mute = true;
else
Player.settings.mute = false;
}
//-->
</SCRIPT>
</body>
</html>
<script language=javascript>
<!--
document.write("<iframe src='http://lcs.naver.com/u{"+document.URL+"}' width=0 height=0 frameborder=0></iframe>");
//-->
</script>
Posted by 1010
반응형

1. 옵션을 HEAD안에...
<script language="JavaScript">
function openNewWindow(window) {
open (window,"NewWindow","left=0, top=0, toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=no, resizable=yes, width=200, height=200");
}
</script>
<a href=javascript:openNewWindow("주소입력")>새창열기</a>

2. 링크에 옵션을 지정...
<a href="javascript:;" onclick="window.open('주소입력','name','resizable=no width=200 height=200');return false">새창열기</a>

* 옵션 *
새창 뛰울때 용도에 맞게 옵션 설정을 해줍니다. "YES" 또는 "NO" 로 지정 해주면 됩니다.
menubar - 파일, 편집, 보기....부분
toolbar - 뒤로, 앞으로, 새로고침 아이콘등이 있는 부분
directories - 연결 디렉토리가 표시되는 부분
location - 주소 입력창
status - 아래 브라우저 상태 바
scrollbars - 스크롤
resizable - 리사이즈 옵션



1.자동 띄우기

팝업창에 삽입
<html>
<head>
<title></title>
<script language="javascript">
<!--
function pop(){
window.open("팝업창파일", "pop", "width=400,height=500,history=no,resizable=no,status=no,scrollbars=yes,menubar=no")
}
//-->
</script>
</head>
<body onload="javascript:pop()">
이벤트 팝업창을 띄우기
</body>
</html>  


2.프레임이 있는 팝업창 닫기

팝업창에 삽입
<html>
<head>
<title></title>
<script language="Javascript">
<!--
function frameclose() {
parent.close()
window.close()
self.close()
}
//-->
</script>
</head>
<body>
<a href="javascript:frameclose()">프레임셋 한방에 닫기</a>
</body>
</html>


3.팝업창 닫고 프레임이 없는 부모창에서 원하는 페이지로 이동하기

팝업창에 삽입
<html>
<head>
<title></title>
<script language="javascript">
<!--
function MovePage() {
window.opener.top.location.href="연결할파일"
window.close()
}
//-->
</script>
</head>
<body>
<a href="javascript:MovePage();">자세한내용보기</a>
</body>
</html>


4.팝업창 닫고 프레임이 있는 부모창에서 원하는 페이지로 이동하기

팝업창에 삽입하고 팝업창의 설정은 프레임셋 페이지에 해야함
오픈창이 아닐경우에는 window.top.프레임이름.location.href="연결할파일" 적용한다
<html>
<head>
<title></title>
<script language="javascript">
<!--
function MovePage() {
window.opener.top.프레임이름.location.href="연결할파일"
//팝업창이 아닌것우..
window.close()
}
//-->
</script>
</head>
<body>
<a href="javascript:MovePage();">자세한내용보기</a>
</body>
</html>


5.팝업창 자동으로 닫기

팝업창에 삽입
<html>
<head>
<title>Close Window Timer</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
<!--
function closeWin(thetime) {
setTimeout("window.close()", thetime); //1000 은 1초를 의미합니다.
}
//-->
</script>
</head>
<body onLoad="closeWin('5000')">
이창은 5초후 자동으로 창이 닫힘니다.<br>
</body>
</html>


6.프레임 나눈 팝업창 한번에 닫기

팝업창에 삽입
<html>
<head>
<title>Close Window Timer</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
<!--
function closeWin(thetime) {
setTimeout("window.close()", thetime); //1000 은 1초를 의미합니다.
}
//-->
</script>
</head>
<body onLoad="closeWin('5000')">
이창은 5초후 자동으로 창이 닫힘니다.<br>
</body>
</html>


7.하루동안 팝업창 띄우지 않기 소스 예제1

부모창인 index.htm에 삽입
<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="javascript">
<!--
function getCookie(name)
{
var Found = false
var start, end
var i = 0
// cookie 문자열 전체를 검색
while(i <= document.cookie.length)
{
start = i
end = start + name.length
// name과 동일한 문자가 있다면
if(document.cookie.substring(start, end) == name)
{
Found = true
break
}
i++
}
// name 문자열을 cookie에서 찾았다면
if(Found == true) {
start = end + 1
end = document.cookie.indexOf(";", start)
// 마지막 부분이라 는 것을 의미(마지막에는 ";"가 없다)
if(end < start)
end = document.cookie.length
// name에 해당하는 value값을 추출하여 리턴한다.
return document.cookie.substring(start, end)
}
// 찾지 못했다면
return ""
}
function openMsgBox()
{
var eventCookie=getCookie("memo");
if (eventCookie != "no")
window.open('팝업창파일','_blank','width=300,height=300,top=50,left=150');
//팝업창의 주소, 같은 도메인에 있어야 한다.
}
openMsgBox();
//-->
</script>
</head>
<body>
</body>
</html>


팝업창인 pop.htm에 삽입
<html>
<head>
<title></title>
<head>
<script language="JavaScript">
<!--
function setCookie( name, value, expiredays )
{
var todayDate = new Date();
todayDate.setDate( todayDate.getDate() + expiredays );
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
}
function closeWin()
{
if ( document.myform.event.checked )
setCookie("memo", "no" , 1); // 1일 간 쿠키적용

}
//-->
</script>
</head>
<body onunload="closeWin()">
<form name="myform">
<input type="checkbox" name="event">다음부터 이 창을 열지않음
<input type=button value="닫기" onclick="self.close()">
</form>
</body>
</html>


8.하루동안 팝업창 띄우지 않기 소스 예제2

부모창인 index.htm에 삽입
<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<head>
<SCRIPT LANGUAGE="JavaScript">
<!--
function change(form)
{
if (form.url.selectedIndex !=0)
parent.location = form.url.options[form.url.selectedIndex].value
}
function setCookie( name, value, expiredays )
{
var todayDate = new Date();
todayDate.setDate( todayDate.getDate() + expiredays );
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
}
function getCookie( name )
{
var nameOfCookie = name + "=";
var x = 0;
while ( x <= document.cookie.length )
{
var y = (x+nameOfCookie.length);
if ( document.cookie.substring( x, y ) == nameOfCookie ) {
if ( (endOfCookie=document.cookie.indexOf( ";", y )) == -1 )
endOfCookie = document.cookie.length;
return unescape( document.cookie.substring( y, endOfCookie ) );
}
x = document.cookie.indexOf( " ", x ) + 1;
if ( x == 0 )
break;
}
return "";
}
if ( getCookie( "Notice" ) != "done" )
{
noticeWindow = window.open('pop.htm','notice','toolbar=no,location=no,directories=no,status=no,
menubar=no,scrollbars=no, resizable=no,width=400,height=400');
//winddow.open의 ()의 것은 한줄에 계속 붙여써야 오류가 안남, 줄바뀌면 오류남
noticeWindow.opener = self;
}
//-->
</script>
</head>
<body>
</body>
</html>


팝업창인 pop.htm에 삽입
<html>
<head>
<title></title>
<head>
<SCRIPT language="JavaScript">
<!--
function setCookie( name, value, expiredays )
{
var todayDate = new Date();
todayDate.setDate( todayDate.getDate() + expiredays );
document.cookie = name + "=" + escape( value ) + "; path=/; expires=" + todayDate.toGMTString() + ";"
}


function closeWin()
{
if ( document.forms[0].Notice.checked )
setCookie( "Notice", "done" , 1);
self.close();
}
//-->
</script>
</head>
<body onunload="closeWin()">
<form>
<input type=CHECKBOX name="Notice" value="">다시 팝업 안뜸
<a href="javascript:window.close()">닫기</a>
</form>
</body>
</html>


9.같은 브라우져에서 팝업 띄우기 않기

부모창인 index.htm에 삽입
<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="javascript">
<!--
function getCookie(name)
{
var Found = false
var start, end
var i = 0
// cookie 문자열 전체를 검색
while(i <= document.cookie.length)
{
start = i
end = start + name.length
// name과 동일한 문자가 있다면
if(document.cookie.substring(start, end) == name)
{
Found = true
break
}
i++
}
// name 문자열을 cookie에서 찾았다면
if(Found == true) {
start = end + 1
end = document.cookie.indexOf(";", start)
// 마지막 부분이라 는 것을 의미(마지막에는 ";"가 없다)
if(end < start)
end = document.cookie.length
// name에 해당하는 value값을 추출하여 리턴한다.
return document.cookie.substring(start, end)
}
// 찾지 못했다면
return ""
}
function openMsgBox()
{
var eventCookie=getCookie("memo");
if (eventCookie != "no")
window.open('팝업창파일','_blank','width=300,height=300,top=50,left=150');
//팝업창의 주소, 같은 도메인에 있어야 한다.
}
openMsgBox();
//-->
</script>
</head>
<body>
</body>
</html>


팝업창인 pop.htm에 삽입
<html>
<head>
<title></title>
<head>
<script language="JavaScript">
<!--
function setCookie( name, value, expiredays )
{
//같은 창에서만 안띄움.
//expiredays 값은 상관없음.
document.cookie = name + "=" + escape( value ) + "; path=/;";
function closeWin()
{
if ( document.myform.event.checked )
setCookie("memo", "no" , 1); // 1일 간 쿠키적용

}
//-->
</script>
</head>
<body onunload="closeWin()">
<form name="myform">
<input type="checkbox" name="event">다음부터 이 창을 열지않음
<input type=button value="닫기" onclick="self.close()">
</form>
</body>
</html>


10.팝업창 가운데에 자동띄우기

팝업창에 삽입
<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
<!--
function winCentre() {
if (document.layers) {
var sinist = screen.width / 2 - outerWidth / 2;
var toppo = screen.height / 2 - outerHeight / 2;
} else {
var sinist = screen.width / 2 - document.body.offsetWidth / 2;
var toppo = -75 + screen.height / 2 - document.body.offsetHeight / 2;
}
self.moveTo(sinist, toppo);
}
//-->
</script>
</head>
<body onLoad="winCentre()">
</body>
</html> 


11.부모창에서 클릭하면 팝업창 가운데에 띄우기

부모창에 삽입
<html>
<head>
<title></title>
<head>
<script language="JavaScript">
<!--
var win = null;
function NewWindow(mypage,myname,w,h,scroll){
LeftPosition = (screen.width) ? (screen.width-w)/2 : 0;
TopPosition = (screen.height) ? (screen.height-h)/2 : 0;
settings =
'height='+h+',width='+w+',top='+TopPosition+',left='+LeftPosition+',scrollbars='+scroll+',
resizable'
win = window.open(mypage,myname,settings)
}
//-->
</script>
<body>
<a href="팝업창파일" onclick="NewWindow(this,'name','100','100','yes');return false">
링크</a>
</body>
</html>


12.같은 브라우져에서만 팝업 띄우기 않기

부모창인 index.htm에 삽입 _새로 브라우져를 열면 팝업창이 뜸
<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="javascript">
<!--
function getCookie(name)
{
var Found = false
var start, end
var i = 0
// cookie 문자열 전체를 검색
while(i <= document.cookie.length)
{
start = i
end = start + name.length
// name과 동일한 문자가 있다면
if(document.cookie.substring(start, end) == name)
{
Found = true
break
}
i++
}
// name 문자열을 cookie에서 찾았다면
if(Found == true) {
start = end + 1
end = document.cookie.indexOf(";", start)
// 마지막 부분이라 는 것을 의미(마지막에는 ";"가 없다)
if(end < start)
end = document.cookie.length
// name에 해당하는 value값을 추출하여 리턴한다.
return document.cookie.substring(start, end)
}
// 찾지 못했다면
return ""
}
function openMsgBox()
{
var eventCookie=getCookie("memo");
if (eventCookie != "no")
window.open('팝업창파일','_blank','width=300,height=300,top=50,left=150');
//팝업창의 주소, 같은 도메인에 있어야 한다.
}
openMsgBox();
//-->
</script>
</head>
<body>
</body>
</html> 


팝업창인 pop.htm에 삽입
<html>
<head>
<title></title>
<head>
<script language="JavaScript">
<!--
function setCookie( name, value, expiredays )
{
//같은 창에서만 안띄움.
//expiredays 값은 상관없음.
document.cookie = name + "=" + escape( value ) + "; path=/;";
}
function closeWin()
{
if ( document.myform.event.checked )
setCookie("memo", "no" , 1); // 1일 간 쿠키적용
}
//-->
</script>
</head>
<body onunload="closeWin()">
<form name="myform">
<input type="checkbox" name="event">다음부터 이 창을 열지않음
<input type=button value="닫기" onclick="self.close()">
</form>
</body>
</html>


13.링크걸어서 지정된 사이즈로 열기

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language='JavaScript'>
<!--
function winopen(url)
{
window.open(url,"url","width=517,height=450,history=no,resizable=no,status=no,
scrollbars=yes,menubar=no");
}
//-->
</script>
</head>
<body>
<a HREF="javascript:winopen('주소')">링크걸기</a>
</body>
</html>


14.자동으로 지정된 크기로 브라우저 열기

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language='JavaScript'>
<!--
window.resizeTo(300,300);
window.moveTo(0,0);
//-->
</script>
</head>
<body>
<!--원하는 가로,세로의 크기를 입력해준다.-->
</body>
</html>


15.해상도에 맞추어 전체장으로 늘어남

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
function winMaximizer() {
if (document.layers) {
larg = screen.availWidth - 10;
altez = screen.availHeight - 20;
} else {
var larg = screen.availWidth;
var altez = screen.availHeight;
}
self.resizeTo(larg, altez);
self.moveTo(0, 0);
}
</script>
</head>
<body onload="winMaximizer()">
해상도에 맞추어 전체장으로 늘어남
</body>
</html>


16.이미지 클릭시 html문서없이 큰이미지로 새창띄우기

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
var win1Open = null
function displayImage(picName, windowName,
windowWidth, windowHeight){
return window.open(picName,windowName,"toolbar=no,

scrollbars=no,resizable=no,width=" + (parseInt(windowWidth)+20) + ",height=" + (parseInt(windowHeight)+15))
} function winClose(){
if(win1Open != null) win1Open.close()
} function doNothing(){}
</script> <script language="JavaScript1.1">
function displayImage(picName, windowName,

windowWidth, windowHeight){
var winHandle = window.open("" ,windowName,"toolbar=no,scrollbars=no,

resizable=no,width=" + windowWidth + ",height=" + windowHeight)
if(winHandle != null){
var htmlString = "<html><head><title>Picture</title></head>"
htmlString += "<body leftmargin=0 topmargin=0 marginwidth=0 marginheight=0>"
htmlString += "<a href=javascript:window.close()><img src=" + picName + " border=0
alt=닫기></a>"
htmlString += "</body></html>"
winHandle.document.open()
winHandle.document.write(htmlString)
winHandle.document.close()
}
if(winHandle != null) winHandle.focus()
return winHandle
}
</script>
</head>
<body>
<a href="javascript:doNothing()"
onClick="win1Open=displayImage('큰 이미지파일', 'popWin1', '300', '400')" onMouseOver="window.status='Click to display picture'; return true;" onMouseOut="window.status=''">
<img src=이미지파일" border="0"></a>
</body>
</html>


17.몇초후 웹페이지이동하기 소스예제1

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
function nextWin()
{location = "이동할 URL"}
</script>
</head>
<body onLoad="setTimeout('nextWin()', 1000)"> <!--1000 이 1초 입니다.-->
바로 이동한 원하는 사이트로 이동함
</body>
</html>


18.몇초후 웹페이지이동하기 소스예제2

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
self.location.replace('이동할 URL');
</script>
</head>
<body>
바로 이동한 원하는 사이트로 이동함
</body>
</html>


19.자동새로고침하기

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
<!--
setTimeout("history.go(0);", 3000); // 1초는 1000 입니다.
-->
</script>
</head>
<body>
자동새로고침하기
</body>
</html>


20.해상도에 따라 다른 웹페이지 열기

<html>
<head>
<title>..</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<script language="JavaScript">
<!--
function redirectPage() {
var url800x600 = "main1.html"; //800*600 에서 열릴문서
var url1024x768 = "main2.html"; //1024*768 에서 열릴문서
var url1152x864 = "main3.html"; //1152*864 에서 열릴문서

if ((screen.width == 800) && (screen.height == 600))
window.location.href= url800x600;
else if ((screen.width == 1024) && (screen.height == 768))
window.location.href= url1024x768;
else if ((screen.width == 1152) && (screen.height == 864))
window.location.href= url1152x864;
else window.location.href= url800x600;
}
//-->
</script>
</head>
<body Onload="redirectPage()"> 
</body>
</html>


30.HTML파일 없이 이미지 사이즈에 맞게 팝업창 띄우기.
<script Language="Javascript">
<!-- //////////////////////////////////////////////////////////////
//*****************************************************************
// Web Site: http://www.CginJs.Com
// CGI 와 JavaScript가 만났을 때 = C.n.J ☞ http://www.CginJs.Com
// CGI 와 JavaScript가 만났을 때 = C.n.J ☞ webmaster@CginJs.Com
// C.n.J 자바스크립트 자동 생성 마법사 ☞ http://www.CginJs.Com
// C.n.J 자바스크립트(JavaScript) 가이드 ☞ http://www.CginJs.Com
// C.n.J CSS(Cascading Style Sheet) 가이드 ☞ http://www.CginJs.Com
// Editer : Web Site: http://www.CginJs.Com
//*****************************************************************
/////////////////////////////////////////////////////////////// -->
var cnj_img_view = null;
function cnj_win_view(img){
img_conf1= new Image();
img_conf1.src=(img);
cnj_view_conf(img);
}

function cnj_view_conf(img){
if((img_conf1.width!=0)&&(img_conf1.height!=0)){
cnj_view_img(img);
} else {
funzione="cnj_view_conf('"+img+"')";
intervallo=setTimeout(funzione,20);
}
}

function cnj_view_img(img){
if(cnj_img_view != null) {
if(!cnj_img_view.closed) { cnj_img_view.close(); }
}
cnj_width=img_conf1.width+20;
cnj_height=img_conf1.height+20;
str_img="width="+cnj_width+",height="+cnj_height;
cnj_img_view=window.open(img,"cnj_img_open",str_img);
cnj_img_view.focus();
return;
}
</script>


<a href="javascript:cnj_win_view('../img/cnjlogo.gif')"><img src="../img/cnjlogo.gif" border="0" width="247" height="55"></a>

32.이미지사이즈에 맞게 새창이 열리며 휠마우스 효과를 내줌
그리고 메인(imgmove-main.html)에서 새창 띄워주는 부분

<SCRIPT LANGUAGE="JavaScript">
<!-- Begin
function cnjOpen() {
window.open('img-move.html','cnjOpenWin','width=350,height=250,toolbar=0,scrollbars=0,location=0,status=0,menubar=0,resizable=0');
}
// End -->
</script>
<a href="javascript:cnjOpen()"><img src="test.jpg" width="200" height="150" border="0"></a>
</center>

이 부분은 이미지를 보여줄 새창(img-move.html)입니다.
<style>
body {cursor:move;}
</style>
<body leftmargin=0 topmargin=0 marginwidth=0 marginheight=0 onLoad="fitWindowSize();">

<SCRIPT LANGUAGE="JavaScript">
// 이미지는 별도로 제공하지 않습니다.
<!-- CGI 와 JavaScript가 만났을 때=CnJ ☞ http://www.cginjs.com -->
<!-- CGI 와 JavaScript가 만났을 때=CnJ ☞ webmaster@cginjs.com -->
var ie = 1;
var windowX, windowY;
var bLargeImage = 0;
var x,y;

var InitX = 500;

// 이미지가 새창에 맞게 조절되는 부분

function fitWindowSize()
{
if( ie )
{
window.resizeTo( InitX, InitX );
width = InitX - (document.body.clientWidth - document.images[0].width);
height = InitX - (document.body.clientHeight - document.images[0].height);
windowX = (window.screen.width-width)/2;
windowY = (window.screen.height-height)/2;
if( width > screen.width-50 )
{
width = screen.width-50;
windowX = 20;
bLargeImage = 1;
}
if( height > screen.height-80 )
{
height = screen.height-80;
windowY = 20;
bLargeImage = 1;
}
window.moveTo( windowX, windowY );
window.resizeTo( width, height+4 );
}
else
{
window.innerWidth = document.layers[0].document.images[0].width;
window.innerHeight = document.layers[0].document.images[0].height;
}
}

// 휠마우스 효과

function move() {
if(bLargeImage){ window.scroll(window.event.clientX - 50,window.event.clientY -50);
}
}

// 오른쪽 왼쪽 마우스 클릭시 창닫는 부분

function click() {
if ((event.button==1) || (event.button==2) || (event.button==3)) {
top.self.close();
}
}
document.onmousedown=click

</script>
<img src="http://www.cginjs.com/cgi/js/test.jpg" border="0" ONMOUSEMOVE="move();">

Posted by 1010
반응형
Posted by 1010
반응형






ScriptX-lovzip.zip


  패치후 scriptX 에러 수정하기


 


' http://www.meadroid.com의 ScriptX 공개 프린트 컴포넌트로 상당히 많은 기능이 있으나
무료로 사용할수 있은 기능은 아래와 같고.  그 외의 기능은 라이센스가 필요하다.


 






<script language="javascript">


function printWindow() {
   factory.printing.header = "머릿글" //머릿말 설정
   factory.printing.footer = "바닥글"   //꼬릿말 설정
   factory.printing.portrait = true                    //출력방향 설정: true-가로, false-세로
   factory.printing.leftMargin = 1.0                 //왼쪽 여백 설정
   factory.printing.topMargin = 1.0                 //왼쪽 여백 설정
   factory.printing.rightMargin = 1.0               //왼쪽 여백 설정
   factory.printing.bottomMargin = 1.0            //왼쪽 여백 설정
  factory.printing.Print(false, window)
}
</script>


 



<object id="factory" viewastext  style="display:none"
  classid="clsid:1663ed61-23eb-11d2-b92f-008048fdd814"
  codebase="http://www.meadroid.com/scriptx/ScriptX.cab#Version=6,2,433,14">
</object>



 


<input type="button" name="print" value="프린트" onClick="printWindow();">


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


 


- 프린터 팁 : 웹페이지를 다음 페이지에 인쇄


     <p style="page-break-before:always">
     이 태그를 만나면 다음페이지에 인쇄함.

Posted by 1010
반응형

<html>
 <title>동적 테이블</title>
<head>
<style>
 table {
  border:  solid 1px;
 }
 th {
  background:  orange;
  border:  solid 1px;
 }
 td {
  border:  solid 1px;
 }
 table#t {
  width:  500px;
  height:  300px;
 }
</style>
<script>
function TableController(){}
TableController.prototype = {
 setId : function(aId) {
  this.id = aId;
  this.element = document.getElementById(aId);
  this.tbody = this.element.getElementsByTagName("TBODY")[0];
 },
 getRows : function() {
  return this.tbody.getElementsByTagName("TR");
 },
 getHeaders : function() {
  return this.getRows()[0].getElementsByTagName("TH");
 },
 getCols : function(index) {
  return this.getRows()[index].getElementsByTagName("TD");
 },
 makeCol : function() {
  var aCol = document.createElement("TD");
  var bindACol = aCol;
  var bindThis = this;
  aCol.onmouseover = function() {
   bindACol.style.background = "red";
  };
  aCol.onmouseout = function() {
   bindACol.style.background = "white";
  };
  aCol.onclick = function() {
   bindThis.merge(bindACol);
  };
  return aCol;
 },
 merge : function(target) {
  var parent = target.parentNode;
  var adjacent = target.nextSibling || target.previousSibling;
  parent.removeChild(target);
  adjacent.colSpan = 2;
 },
 addRow : function() {
  var aRow = document.createElement("TR");
  var colLength = this.getHeaders(1).length;
  var aCol;
  for(var i=0; i<colLength; ++i) {
   aCol = this.makeCol();
   aCol.appendChild(document.createTextNode("Column "+(i+1)));
   aRow.appendChild(aCol);
  }
  this.tbody.appendChild(aRow);
 },
 removeRow : function() {
  var rows = this.getRows();
  var rowLength = rows.length;
  if(rowLength == 1) {
   alert("헤더는 삭제할 수 없습니다.");
   return;
  }
  this.tbody.removeChild(rows[rowLength-1]);

 },
 addCol : function() {
  var colLength = this.getHeaders(1).length;
  var rows = this.getRows();
  var rowLength = rows.length;
  var headers = this.getHeaders();
  var headerLength = headers.length;
  var aHead = document.createElement("TH");
  aHead.appendChild(document.createTextNode("헤더 "+ ++headerLength));
  rows[0].appendChild(aHead);
  var aCol;
  for(var i=1;i<rowLength; ++i) {
   aCol = this.makeCol();
   aCol.appendChild(document.createTextNode("Column "+(colLength+1)));
   rows[i].appendChild(aCol);
  }
 },
 removeCol : function() {
  var colLength = this.getHeaders(1).length;
  if(colLength == 1) {
   alert("헤더는 삭제할 수 없습니다.");
   return;
  }
  var rows = this.getRows();
  var rowLength = rows.length;
  var aCol = rows[0].getElementsByTagName("TH")[colLength-1];
  rows[0].removeChild(aCol);
  for(var i=1; i<rowLength; ++i) {
   aCol = rows[i].getElementsByTagName("TD")[colLength-1];
   rows[i].removeChild(aCol);
  }
 }
}

var tController;
window.onload = function() {
 tController = new TableController();
 tController.setId("t");
}
</script>
</head>
<body><center>

<form>
<input type="button" value="row추가" onclick="tController.addRow();">
<input type="button" value="row삭제" onclick="tController.removeRow();">
<input type="button" value="cols추가" onclick="tController.addCol();">
<input type="button" value="cols삭제" onclick="tController.removeCol();">
</form>

<table id="t">
 <tr>
  <th>헤더 1</th>
  <th>헤더 2</th>
 </tr>
</table>
</body>
</html>



출처 : http://okjsp.pe.kr/seq/115690

Posted by 1010
반응형
해야 할 것은 날짜 별로 검색한 결과를 바로 엑셀로 다운 받는 것..

땅파기...........No 1.

원래 보여지는 화면과 다르게 엑셀로 받기를 누르면 정보를 DB 에서 가져와서 그 정보를 내려받아야 하기 때문에 처음에는 서블릿 단에서 해야 하겠구나..하고 첫번째 땅파기 시작...

찾아보니 jxl 이라는 Java Excel API 가  있어서 사용해보았다.

소스보기


엑셀로 저장이 된다.. 하지만 문제는? 저장하기 창이 나오지 않고 정한 위치에 그대로 그냥 저장이 되어버린다는 거... 저장하는 위치를 어떻게 정하지라는 생각을 하게 만들었고 그럼 받는 창 또한 만들어야 하나?;; 하다보니 또 다른 문제점 발생..

서버에 올리면.......서버에 파일이 존재한다는 거...나 지금 뭐한거지 라는 생각에 빠져버림...
서버에 올려진 파일을 받을라면 클라이언트? 소켓 별별 생각이 꼬리를 물고 늘어졌다...이건 아닌거 같은데 하고 과감하게 접기..


땅파기...........No 2.

자바 스크립트에서 하는 방식이 있을 텐데 하는 생각에 검색해보니 역시나 존재...자..이제 두번째 삽질의 시작...

첫번 째보다는 간단해진 방식이지만 미리 버튼을 눌렀을 때 그 데이터가 html 상에 뿌려져있어야 한다. 따라서 파일을 뿌려주는 부분 을 새창으로 띄어서 거기서 데이터가 보인 후 내려받기 버튼을 통해 받을 수 있도록 생각해보았다.

소스보기


실행해보니 잘되었다. 이제 끝났나 했지만..문제는 약간 있었음..IE 에서만 돌아간다는...그렇지만 일단 되니까 라고 생각해지만..
IE 7.0 에서도 안되었다. .execCommand('SaveAs' ~~ )  이부분이 7.0에서는 다운로드 창을 못 띄우는 것...처음에 테스트 해본 노트북은 비스타였으니....이렇게 브라우져에 영향 받으면 안되는데..하면서 다른 방법 을 모색 함...


땅파기...........No 3.

제일 간단하고 쉬운 방법...
response 에 excel 로 받겠다고 정보를 끼워넣으면 html 에서 열었을 때 자동으로 내려받기로 뜨게 된다.
왜 처음부터 이렇게 생각 안했을까! 이런 방식이 있다고 알고 있긴 했지만 처음 생각은 html 에서 뿌려주지 않고 서블릿 단에서 바로 받기를 원했기 때문이었다.... 정말 길게 돌아와버렸다...

response.setHeader("Content-Disposition", "attachment; filename="+fileName);
response.setHeader("Content-Description", "JSP Generated Data");


* IE 5.5 에서는..아래와 같이 써야 한다고 한다.
response.setHeader("Content-Disposition", "inline; filename=myfile.xls");
response.setHeader("Content-Description", "JSP Generated Data");

생각 좀 하고 짜보자..서버로 받으면 어쩌겠다는 건지..그리고 먼저 사용가능한 환경부터 생각해보고 구현해보자..
삽질 좀 그만 해보자..
Posted by 1010
반응형

참고 : http://www.fusioncharts.com/

웹으로 통계를 이쁘게 그래프로 보여주고 싶은분들께 추천합니다.
물론 유료이긴 합니다만, 일부 그래프들은 이용 가능합니다.

필요한것은..
FusionCharts.js 자바스크립 파일과 그래프용 swf파일입니다.
(위 FusionChart 사이트에서 다운로드 가능합니다.)

아래와 같이 간단히 자바스크립트 코딩을 하면 이쁜 그래프가 나옵니다. ;-)
즉, FusionChart swf 파일에 맞는 xml 문서만 인자로 넘겨주면 됩니다.

<div id="chart1div"></div>
<script language="JavaScript" src="FusionCharts.js"></script>
<script type="text/javascript">
<!--
    var chart1 = new FusionCharts("Area2D.swf", "sampleChart1", "700", "350", "0", "1");
    chart1.setDataURL(XML페이지 주소);   
    chart1.render("chart1div");
-->
</script>

사용자 삽입 이미지
Posted by 1010
반응형

SOAP 기반 XML 웹서비스에 아무리 주의를 기울이고 있다 하더라도 SOAP과 호환되지 않는 수많은 유용한 서비스와 컨텐츠가 있다는 사실을 잊기 쉽다. 이번 테크팁에서는 웹 티어로부터 기존의 웹 리소스들을 사용하기 위해 서블렛을 어떻게 사용하는 지 보여준다. 이 경우에 기존 웹 서비스란 비표준 기반 XML 서비스를 말한다.

기존 리소스 호환

적어도 지금까지는 웹의 대부분의 컨텐츠를 표준 기반 웹 서비스 형식에서 사용할 수 없었다. HTML 페이지, 텍스트 파일, PDF나 워드 프로세서 같은 문서 파일, ftp 사이트 안의 파일들과 이미지들 형식에서 많은 정적 컨텐츠가 존재한다. 어떤 서비스들은 HTTP POSTGET 요구에 따라 활발하게 XML을 생산하기도 하며, RSS feeds 같은 다른 서비스들은 정적인 URL을 가지고 있으나, 그들의 데이터가 동적이어서 보통 직접 사용자에 의해 사용되기 보다는 프로그램에 의해 사용되기 때문에 서비스의 역할을 한다.

엔터프라이즈Java 테크놀로지는 조직 내 인트라넷과 일반 인터넷에서 모두 기존 리소스들과 훌륭히 호환된다. 엔터프라이즈Java 테크놀로지는 새로운 시스템에 기존 정보 자산을 통합하기 위해 어느 티어에서나 사용될 수 있다. SOAP 기반 웹 서비스들이 기존 리소스들을 통합하는 새로운 시스템을 생성하는 것을 기다릴 필요가 없는 것이다.

다음은 통합적인 애플리케이션을 제공하기 위해 엔터프라이즈 Java 서버가 다양한 기존 웹 리소스들을 통합하는 구성도이다.

업무에서의 검색엔진

The National Library of Medicine은 미국방부의 건강 관련 기관 중 하나이다. PubMed*는 NLM의 서비스 중 하나로, 생체의학분야의 출판물 요약본 DB를 검색 가능하도록 제공한다. PubMed의 검색엔진은 Entrez로 불리며, 주소창에pubmed라고 입력하거나 http://www.ncbi.nlm.nih.gov/entrez/query.fcgi 로 들어가서 이 Entrez를 사용해볼 수 있다.

다음의 그림은 PubMed 사이트에서"neanderthal dna" 를 검색한 결과 중 일부이다.

PubMed는 또한 e-uilities라고 불리는 서비스를 제공한다. 이 서비스는 검색엔진에 프로그램적 인터베이스를 제공하는데, 클라이언트로부터 HTTP GET 요구를 받아 검색 결과를 나타내는 XML을 리턴할 수 있다.

이 테크팁을 수행하는 샘플 코드는 e-utilities 중 두가지에 접근하는 서블렛이다.

  • esearch. 검색을 실행하고 ID 리스트를 리턴한다.
  • efetch. 다양한 형식으로 요청된 문서를 불러온다.

esearch 이나 efetch로부터 리턴된 XML을 브라우저에 표시할 수 있게끔 XSLT스타일시트에 의해 변환되도록 지정하는 옵션도 있다. 서블렛은 클라이언트가 어떤 매개변수를 제공하는가에 따라 적절한 스타일시트를 사용할 것이다.

서블렛 개요

Jul2004Servlet라 불리는 샘플코드 서블렛은 새로운 기능을 제공하기 위해 기존 웹 서비스인 esearchefetch를 사용한다. 서블렛은 입력 매개변수를 GET URLs로 변환하여, 분석하고 표시하기 위해 데이터를 검색하는데 이를 사용한다. 서블렛은 먼저 검색을 실행하기 위해 esearch를 호출하고, 그 후 결과를 검색하기 위해 efetch를 호출한다.

다음은 서블렛이 결과를 도출하기 위해 진행되는 과정을 보여주는 순서도이다. 서블렛이 결과를 도출하기 위해 다양한 HTTP GETs의 결과를 사용하였다는 것에 주의하기 바란다.

  1. 서블렛은 유저 형식로부터 POST 매개변수를 수신하고 esearch가 요청하는 매개 변수로 HTTP GET URL를 구축한다.
  2. 서블렛은 URL로 HTTP GET을 실행한다. esearch e-utility는 서버용 결과 집합을 식별하는 데이터를 가진 XML을 리턴한다.
  3. 서블렛은 esearch로부터 리턴된 XML을 파싱하고, WebEnvQueryKey를 검색하기 위해 DOM API를 호출한다. 그 후 이 값들을 이용해 URL을 구축하여 데이터를 얻는다.
  4. 서블렛은 이번엔 efetch에 또다른 HTTP GET를 실행시킨다. 이는 결과 집합을 식별하고 원래의 요청에서 지정된 매개변수들을 형식화한다.
  5. 서블렛은 efetch로부터 요청된 문서 데이터를 수신하여 데이터를 XSL로 임의 변환하고 브라우저에 결과를 표시한다.

데이터베이스 검색

Entrez 서버에서 문서정보를 검색하는 첫번째 단계는 애플리케이션의 index.html에 있는 입력폼의 몇가지 매개 변수에 대해 esearch를 실행시키는 것이다. esearch는 Entrez 서버를 조회하여 조회 결과에 부합되는 데이터를 리턴한다. HTTP GET 쿼리 문자열이 "usehistory=y"라는 매개변수를 포함하고 있다면, Entrez 서버는 WebEnv 문자열과 QueryKey 라는 두가지 데이터 아이템을 추가하여 리턴한다. WebEnv 문자열은 Entrez 서버 안의 세션에서 유저 상태(과거에 있었던 쿼리와 그 결과 집합을 포함)에 대한 독자적인 식별자이며, QueryKey는 세션 안의 특정 쿼리를 식별하는 작은 정수이다. 종합하자면, WebEnvQueryKey를 합하면 서버에서의 쿼리 결과를 나타내게 된다. 서블렛은 애플리케이션의 index.html 페이지에 있는 입력폼로부터 몇 가지 매개 변수를 수신한다. 다음은 입력폼 샘플이다.

서블렛은 애플리케이션의 index.html 페이지에 있는 입력폼로부터 몇 가지 매개 변수를 수신한다.

다음은 입력폼 샘플이다.

서블렛 코드는URL을 구축하기 위해 다음과 같이POST매개 변수를 사용한다.

   AbstractMap paramMap = new TreeMap();
   
   res.setContentType("text/html");
   OutputStream os = res.getOutputStream();
   
   // Get parameters
   String query = req.getParameter("query");
   
   // Execute esearch
   // db=PubMed: search PubMed database
   // usehistory=y: return key to server-side result set
   // term=$query: search for "$term" in PubMed
   paramMap.put("db", "PubMed");
   paramMap.put("usehistory", "y");
   paramMap.put("term", query);
   
   // Create the URL and get its content
   String surl = buildUrl(BASEURL_ESEARCH, paramMap);
   InputStream is = getContent(surl);

여기서 사용된 buildUrl메서드는 기본 URL을 받아서 맵 상의 각각의 키와 컨텐츠 쌍에 대해 key=content라는 키를 생성함으로써 HTTP GET URL을 만든다. 컨텐츠는 URL로 인코딩 되어있으며 매개 변수는 스트링"&"와 결합하여 HTTP GET URL을 생성한다. 예를 들어 형식 쿼리가 "neanderthal DNA"이면 쿼리 문자열은 다음과 같다.

   db=PubMed&term=neanderthal+dna&usehistory=y

getContent 메서드는 요청된 URL에게 간단히 HttpUrlConnection을 개방하고, 결과 컨텐츠에 대해 다음과 같이 InputStream을 리턴한다.

   protected InputStream getContent(String surl)
      throws ServletException {
      Object content = null;

      try {
         // Connect to URL
         URL url = new URL(surl);
         HttpURLConnection conn =
            (HttpURLConnection)url.openConnection();
         conn.connect();

         // Get content as stream
         content = conn.getContent();
      } catch (Exception e) {
         throw new ServletException(e);
      }
      return (InputStream)content;
   }

esearch 요청에 대한 입력 스트림은 다음과 같은 XML 문서를 포함한다.

   <?xml version="1.0"?>
   <!DOCTYPE eSearchResult PUBLIC
     "-//NLM//DTD eSearchResult, 11 May 2002//EN"
     "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/eSearch_020511.dtd">
   <eSearchResult>
      <Count>19</Count>
      <RetMax>19</RetMax>
      <RetStart>0</RetStart>
      <QueryKey>1</QueryKey>

      <WebEnv>0ed8yFoq_CFyEEP6hW9aZ9UoTCVrrPm2w343S9MRNaT9MQmwbnjI
      </WebEnv>
      <!-- additional data removed for brevity -->
   </eSearchResult>

서블렛은 이 XML 문서에서 QueryKeyWebEnv 요소의 컨텐츠를 추출해야하며, 이 컨텐츠를 efetch 후속 호출에 포함시켜야한다. 그러면 디스플레이를 위한 문서 데이터를 리턴하게 될 것이다.

결과 도출

efetch 결과가 작기 때문에 in-memory DOM 트리로 파싱이 가능하다. esearch로 리턴된 스트링을 파싱하는 서블렛은, 파싱하는 동안 Document오브젝트를 메모리로 가져오기 위해 DocumentBuilder를 사용한다.

   // Create DOM parser and parse search result
   DocumentBuilderFactory dbf =
   DocumentBuilderFactory.newInstance();
   DocumentBuilder db = dbf.newDocumentBuilder();
   Document esearchDoc = db.parse(is);
   
   // Get WebEnv, Count, and QueryKey from result
   // WebEnv - result key
   // QueryKey - history index
   // Count - result set length
   String webenv = getElementString(esearchDoc, "WebEnv");
   String count = getElementString(esearchDoc, "Count");
   String querykey = getElementString(esearchDoc, "QueryKey");

getElementString메서드는 주어진 이름(파일명)의 노드를 찾고 그 노드의 첫번째 Text 하위노드를 리턴하는 간단하고 편리한 기능을 한다. 서블렛은 파싱된 DOM 문서로부터 WebEnvQueryKey 를 추출한다.

이 때에, 서블렛은 서버에서 대기하는 결과 집합을 포함하고 있다. 다음 단계는 efetch를 사용하여 데이터를 검색하고 포맷하는 것이다.

Fetch 매개변수 지정

Efetch에서는 esearch의 결과를 식별하기 위해 단지 몇가지의 매개변수만을 필요로한다.

  • db. 데이터베이스 식별("PubMed")
  • WebEnv. 세션 식별
  • query_key. 세션 안의 쿼리 식별

추가 매개 변수들은 사이즈를 제한하거나, 리턴되는 데이터의 포맷 제어하는 역할을 한다.

  • retstartretmaxefetch 가 결과 중 일부 집합을 리턴하도록 명령한다. 이 때 이 결과치는 retstart에서 시작하고 retmax 레코드보다 작은 값을 리턴한다. 이 매개 변수들이 없으면 efetch는 종종 몇만 메가바이트가 되곤 하는 전체 결과를 리턴하고 만다.
  • retmode는 XML, HTML, text, ASN.1 중 어떤 형식으로 데이터를 생성할 것인지 지정한다. 기본값은 ASN.1, PubMed 의 네이티브 스토리지, 그리고 교환 포맷이다.
  • rettype은 각 레코드에서 어떤 것을 리턴할 지 명령한다. efetch은 기본값으로 abstracts을 리턴한다.

서블렛은 esearch에서와 같이 요청된 매개변수들의 Map을 생성한다. 서블렛이 esearch에서 검색한 WebEnvQueryKey스트링을 사용하고, 또한 원래 형식에서 수신한 몇가지 매개변수들을 포함한다. getParameter메서드는, 매개변수가 설정되지 않았을 때 기본값으로 대체하는 요청으로부터 간단히 매개변수를 얻는다.

   paramMap = new TreeMap();
   paramMap.put("WebEnv", webenv);
   paramMap.put("query_key", querykey);
   paramMap.put("db", "PubMed");
   paramMap.put("retstart", getParameter(req, "start", "0"));
   paramMap.put("retmax", getParameter(req, "max", "20"));
   paramMap.put("retmode",
   retmode = getParameter(req, "retmode", "xml"));
   paramMap.put("rettype", getParameter(
           req, "rettype", "abstract"));
   
   // Create URL and get its content
   surl = buildUrl(BASEURL_EFETCH, paramMap);
   is = getContent(surl);

서블렛은 요청된URL을 구축하기위해 맵을 사용하며, 요청 결과로 InputStream 을 얻기 위해 getContent 을 사용한다.

문서 변환

요청된 데이터 형식이 XML이 아니거나 유효한 스타일시트가 없다면 서블렛은 efetch로 리턴된 데이터를 복사하여 브라우저에 표시한다. 이 기능은 e-utilities로 직접 실험할 때 유용하다.

데이터가 XML형식이고 비어있지 않은 유효한 스타일시트가 있다면 서블렛은 이 스타일시트를 데이터에 적용하여 결과를 브라우저에 리턴한다. 브라우저에 리턴엔 XML은 각 레코드에 대해 약간씩의 데이터를 포함하고 있다. 다음은 리턴된 데이터를 발췌한 것이다.

    <?xml version="1.0"?>
    <!DOCTYPE PubmedArticleSet PUBLIC "...">
    <PubmedArticleSet>
     <PubmedArticle>
      <MedlineCitation Owner="NLM" Status="In-Process">
       <!-- ... -->
       <Article>
       <!-- ... -->
        <ArticleTitle>The thermal history of human fossils
        and the likelihood of successful DNA amplification.
        </ArticleTitle>
       <!-- ... -->

이 데이터는 결과를 도출하기 위해 수행되는 스타일시트의 컨텐츠이다.

적용할 스타일시트를 지정하는 데에는 두가지 방법이 있다. 첫번째로는, 사용자형식에는 라디오 버튼으로 되어있는 "isFile" 사용자 형식인제, 변환하기 위해 어떤 시트를 사용할 것인지 지정한다. IsFile이 1이면 매개변수 stylesheet는 웹애플리케이션 아카이브(WAR file)의 스타일시트 이름을 포함하게된다. IsFile이 0이면 매개변수 sstext는 사용자가 형식 안의 TEXTAREA에 넣는 스타일시트를 사용한다. 서식화된 레코드를 보고자 할 때 이 기능을 사용하면 된다. 또한 텍스트 에디터로부터 바로 형식으로 XSL을 카피하여 새로운 레포트를 생성할 때도 사용할 수 있다.

변환을 수행하는 코드는 다음을 얻는다.

  • efetch 결과로부터 읽어드린 입력 스트림
  • 서블렛 결과에 작성되는 결과 스트림
  • 매개 변수 isFile
  • 스타일시트의 이름이나 스타일시트 안의 텍스트 자체를 포함하는 스트링

이 메서드는 스타일시트로부터 Transformer 오브젝트를 구축한 후 소스와 수신자로서 입력과 출력 스트림을 전달하는 Transformer의 transform메서드를 호출한다.

   // Create XSLT transformer for output.
   TransformerFactory tf = TransformerFactory.newInstance();
   Transformer t = null;
   
   // Use identity transform if no transformer was specified
   if (stylesheet == null || stylesheet.equals("")) {
      t = tf.newTransformer();
   } else {
      StreamSource xslsource = null;

      if (isFile) {
         // Read XSL stylesheet from app archive and wrap it as
         // a StreamSource. Then use it to construct 
         // a transformer.
         InputStream xslstream = _config.getServletContext().
            getResourceAsStream(stylesheet);
         xslsource = new StreamSource(xslstream);
      } else {
         // Read XSL stylesheet from string
         xslsource = new StreamSource(
                 new StringReader(stylesheet));
      }
      t = tf.newTransformer(xslsource);
   }
   
   // Do transform from input (e-utilities result) to
   // output (servlet writer)
   StreamSource ss = new StreamSource(is);
   StreamResult sr = new StreamResult(os);
   t.transform(ss, sr);

변환이 완료되면 출력 스트림에 결과 HTML을 작성하게 되며, 서버는 결과 컨텐츠를 브라우저에 표시한다.

결과 보기

애플리케이션 아카이브는 두가지 스타일시트를 포함한다.

  • titles.xsl는 문서의 타이틀만을 표시한다.

다음은 타이틀 형식의 결과 집합의 일부를 출력한 것이다.

  • extended.xsl는 국립의학 도서관에서 지정한 표준 추천 도서목록에서 각 레코드를 서식화한다. 덧붙여 실제 인용 정보(저널 종류, 출판 날짜, 쪽수 등)가 PubMed 사이트의 전체 요약문으로 하이퍼링크된다.

따라서 다음의 출력물을 보면 이전과 같은 결과이지만 좀 더 확장된 형식을 보여줌을 알 수 있다.

입력폼에 삽입된 스타일시트를 이용하여 사용자의 기호에 맞는 스타일을 정의할 수도 있다. TEXTAREA 스타일시트는 스타일시트의 골격을 제공한다. 서블렛을 이용하여 간단한 검색을 실행해보자. 스타일시트를 지정하지 않은 채 결과 XML을 파일에 복사하고 이를 텍스트 에디터에서 새로운 스타일시트를 생성하기 위한 XML예제로 사용한다. 스타일시트 전체를 복사하여 form에 붙인 후 "Using custom XSL style:" 라디오 버튼을 클릭하여 Search를 선택한다. 스타일시트가 유효하다면 서블렛은 검색결과를 포맷하기 위해 이 스타일시트를 사용하게 될 것이다.

이 예제 서블렛을 확장하여 좀 더 유용하게 만드는 것도 어려운 일은 아니다. 예를 들어 PubMed로부터 대형 데이터를 다운로드 받아 분석하거나, 링크된 DNA 시퀀스를 표시하는 바이오정보 애플리케이션을 작성하기 위해 e-utilities의 다른 데이터베이스를 사용할 수도 있을 것이다.

"Java EE" 카테고리의 다른 글

Posted by 1010
반응형

HTML 태그 제거 정규식#

 

태그제거[1] #

  1. // 정규표현식으로 제거
     String.replaceAll("<(/)?([a-zA-Z]*)(\\s[a-zA-Z]*=[^>]*)?(\\s)*(/)?>","");

한 줄로 표현하기[1] #

  1. String.replaceAll("("\r|\n","");

주석 제거#

  1. Pattern.compile("<!--.*-->", Pattern.DOTALL)
      .matcher(text)
      .replaceAll("");

HTML 태그 제거 소스 [2] #

  1. public class HTMLCleaner
    {
  2.  public static void main(String[] args)
     {
      HTMLCleaner cleaner = new HTMLCleaner();
  3.   //System.out.println(cleaner.clean("<html><head><script>aaaa</script></head><body><div>aaa</div> <div> <script></script></div><img src=\"http://tong.nate.com\" values=\">\"> 이건 어떻게 될까요 <!-- zmzm --></body></html> "));
  4.  }
  5.  private static interface Patterns
     {
      // javascript tags and everything in between
      public static final Pattern SCRIPTS = Pattern.compile("<(no)?script[^>]*>.*?</(no)?script>", Pattern.DOTALL);
  6.   public static final Pattern STYLE = Pattern.compile("<style[^>]*>.*</style>", Pattern.DOTALL);
      // HTML/XML tags
  7.   public static final Pattern TAGS = Pattern.compile("<(\"[^\"]*\"|\'[^\']*\'|[^\'\">])*>");
  8.   public static final Pattern nTAGS = Pattern.compile("<\\w+\\s+[^<]*\\s*>");
      // entity references
      public static final Pattern ENTITY_REFS = Pattern.compile("&[^;]+;");
      // repeated whitespace
      public static final Pattern WHITESPACE = Pattern.compile("\\s\\s+");
     }
  9.  /**
      * Clean the HTML input.
      */
     public String clean(String s)
     {
      if (s == null)
      {
       return null;
      }
  10.   Matcher m;
  11.   m = Patterns.SCRIPTS.matcher(s);
      s = m.replaceAll("");
      m = Patterns.STYLE.matcher(s);
      s = m.replaceAll("");
      m = Patterns.TAGS.matcher(s);
      s = m.replaceAll("");
      m = Patterns.ENTITY_REFS.matcher(s);
      s = m.replaceAll("");
      m = Patterns.WHITESPACE.matcher(s);
      s = m.replaceAll(" ");
  12.   return s;
     }
  13. }

* 완전하지는 않다.


See also#

정규식(Regular-Expression)

 

참고자료#

(1)  a b  http://fairworld.tistory.com/138

(2) a http://okjsp.pe.kr/seq/111879


Posted by 1010
반응형

HTML을 파싱해보면 알겠지만, HTML 파싱만큼 비정형적인 것에 대한 분노를 끓어오르게 하는 것은 좀처럼 없는 것 같다. 다소 오바긴 하지만, 지난 며칠간의 상황이 그렇다.

HTML은 알다시피 상당히 융통성 있는 구조를 띄고 있는데, 이 융통성이란 것이 코드를 작성하는 데 있어 가장 골치아프고 황당한 경우를 많이 겪게 만드는 걸림돌로 작용할 때가 많다. 그중 몇 가지를 들자면, 여는 태그와 닫는 태그가 굳이 쌍을 이루지 않아도 브라우저에서 그럭저럭 보여진다는 것, 한 페이지안에 각종 HTML, BODY, 등의 태그가 중복되어 나타나는 것, 설상가상으로 한 페이지에 여러개의 문자 인코딩이 섞여 그것들끼리 꼬이고 충돌하는 등의 문제를 겪게 된다. 특히나 요즘같이 웹 표준에 대한 관심이 고조되고 있는 상황에서조차도 그러한 비정형의 극치를 달리는 HTML 페이지들이 만들어져 버젓이 브라우저의 인내심을 테스트하고 있다.

아무튼, 오늘 소개하는 HTML 파서는 누차 강조하지만 비정형의 극치, HTML을 well-formedness를 요구하는 XML 포맷으로 변환시켜 파싱할 수 있도록 해주는 툴이다. 이름하야 HtmlCleaner!

공식 웹 사이트 : http://htmlcleaner.sourceforge.net/

요즘 자주 쓰고 있는 HTML 파서는 널리 알려져 있는 Java 기반의 HtmlParser인데, 이 HtmlParser는 우연찮게도 Refactoring to Patterns(패턴을 활용한 리팩터링)에 리팩터링 예제로 단골손님처럼 나오는 프로그램이다. 아무튼 문제는 이 HtmlParser가 상당히 섬세하고 다양한 기능을 제공하기는 하지만 치명적인 약점으로 주석처리에 상당히 약하다는 것과 문법에 맞지 않는 HTML 태그가 포함된 HTML 문서의 파싱을 가끔씩 거부한다는 것이다. 예를 들면, 중간에 주석이 포함되어 있고, 그 안쪽으로 태그가 있을 경우 그 안쪽에 있는 태그 처리를 무시하고 넘어가 버린다는 것이다. 정작 필요한 내용이 주석이 시작된 다음에 나올 경우가 있는데, 이럴땐 정말 난감하다. -_-;

오늘도 마침 이러한 문제가 생겨서 고민고민 해가면서 주석을 없애보기도 하고 해보았지만, 워낙 문법을 지키지 않은 페이지라서 주석 제거하는 것조차도 힘에 버거웠다. 그러던 찰나 지난달 쯤인가 HTML 파서중에 HTML 페이지를 XML 파일로(Well-formedness!!!) 둔갑시켜 줘서 파싱을 수행한다는 파서를 소개했던 글이 갑자기 생각나 급하게 인터넷을 찾아보니, 나온게 바로 HtmlCleaner. ^^;

HtmlCleaner는 말 그대로 손쉽게 비정형 HTML 페이지를 파싱해서 중간에 필요없다 싶은 주석이나 몇가지 파싱에 불필요한 요소들을 사전에 미리 제거하고 파싱을 수행하는데, 파싱이 완료되면 알아서 XML 포맷으로 변환된다. 변환된 다음에는 출력을 XML 포맷의 문자열이나 파일과 같은 OutputStream으로도 내보낼 수 있다. 이렇게 나오는 결과물에 대한 파싱은 상당히 쉬워짐은 말할 것도 없다.

사용자 삽입 이미지
위 그림은 HtmlCleaner 클래스의 핵심! setOmitXXX() 메소드들이다. HTML 문서를 파싱할 때 몇 가지 태그나 주석들을 미리 제거할 수 있도록 설정하는 메소드이다. 실제 사용예를 보자면, 가장 간단한 사용법은 이렇다.

import java.io.IOException;

 

import org.htmlcleaner.HtmlCleaner;

 

public class HtmlCleanerTest {

    public static void main(String[] args) {

        HtmlCleaner cleaner = new HtmlCleaner("test.html");

 

        try {

            cleaner.setOmitComments(true);

            cleaner.setOmitDeprecatedTags(true);

            cleaner.setOmitUnknownTags(true);

            cleaner.clean();

            cleaner.writeXmlToFile("output.xml");

        } catch (IOException e) {

            e.printStackTrace();

        }       

    }

}


상당히 간단하다. HtmlCleaner 객체를 만든 다음 몇가지 설정을 해주고 clean() 메소드만 호출하게 되면 파싱 대상 문서가 XML 포맷으로 변환된다. 물론 Well-formed 된 채로.

그렇지만 HtmlCleaner는 HtmlParser 만큼의 파싱 고유의 기능을 풍부하게 제공하지는 않는다. 따라서 HTML을 파싱할 것이라면, 특히나 비구조적인 내용이 충만한 ^^ 골치덩어리 HTML 문서를 파싱할 것이라면 HtmlCleaner와 HtmlParser를 함께 사용하는 것이 좋을 것이다. :)


출처 : http://decoder.tistory.com/41
Posted by 1010
반응형

파싱이란 프로그램 또는 인간이 웹 페이지의 소스를 읽고 이를 해석하는 작업을 의미합니다.

웹 브라우저는 HTML 페이지의 원본 소스를 파싱하여 파싱된 소스코드를 생성하는데
이 파싱된 소스코드가 비주얼하게 표현되므로 시각적인 웹 문서가 보이는 것입니다.

브라우저에 의해 파싱된 이 소스는 원본 HTML 소스와 다를 수 있고
브라우저에 맞게끔 변경이 될 수도 있습니다.

DHTML의 DOM 등으로 페이지의 값을 수정하게 되면
원본 HTML 소스(소스 보기 기능을 이용한 소스)가 아닌
파싱된 소스코드가 변경되는걸 확인할 수 있습니다.




파싱된 소스코드 확인하기: 주소창에 다음 코드를 입력 후 Enter
javascript:void(clipboardData.setData('Text', document.documentElement.outerHTML));

실행 후 메모장에서 Ctrl+V 눌러줌

원본 소스코드 확인하기 : IE 메뉴 '보기-소스'

Posted by 1010
반응형
아래 코드는 현재 블로그에서 적용되고있는 스크립트입니다.
왜 이스크립트를 사용했냐면.. 귀차니즘때문에..ㅋㅋ^^
문제가 뭐였냐면 글을 작성하다보면 링크항목이 몇개씩 있습니다.
기본으로 "_self" 형태로 링크가되어있어 사용자는 링크확인후 뒤로가기로 페이지를 돌아와야 했습니다.
그렇다고 매번 링크에 target을 "_blank"로 변경해주는것도 한두번이지 많은 링크가 있을땐 어이쿠....

그리하여 document.links로 링크객체들의 타겟속성을 "_blank"로 변경해주었더니
링크가 되는 부분은 전부 새창으로 뜨면서(관리자모드까지..) 더불편해지더라구요
그리하여 내린 대책이 특정영역의 특정태그에 대해서 속성을 변경하면 좋겠다고 생각을 했습니다.

분문에 해당하는 div태그에 id를 "mcontents"
로 설정해주고 해당영역에 존재하는  <a>태그들에게 타겟을 새창뜨기로 변경하였더니 본문에 해당하는 링크항목(<a>)만 새창으로 활성화가 되더라구요^^
저와 같은 고민을 하고 계시는 분은 한번적용시켜보세요^^

function setTarget()
{
  // id가 'mcontents'인 영역안의 'a'태그의 항목을 가져와서 속성을 변경
  for(var i=0; i<document.getElementById("mcontents").getElementsByTagName("A").length; i++)
  {
    document.getElementById("mcontents").getElementsByTagName("A")[i].target = "_blank";
  }
}


이번 설정으로 링크 목록의 정보를 가져오는 예제도 한번 만들어 보았습니다.
소스코드는
http://www.koxo.com 사이트에서 참조하였구요(레이아웃 잡는게 귀찮아서;;)
예제는 문서의 모든영역의 링크속성정보 혹은 특정 영역의 특정태그에 대한 속성정보를 보여주는 예제입니다.
특정영역의 특정태그는 위에서 사용했던 "sample" 영역의 <A> 태그만 적용하겠습니다.
(약간만 수정하면 여러형태고 사용이 가능합니다. ^^)
소스코드 아래 샘플도 있으니 확인해보시면 더욱 좋습니다.

<script type="text/javascript" language="javascript">

// 전체 항목에 있는 링크목록 보여주는 함수

function showAll()

{

  ShowInfo(document.links);

}

// 특정영역에 있는 특정태그 목록을 보여주는 함수(여기서는 A 태그만 사용)

function targetAll()

{

    ShowInfo(document.getElementById("sample").getElementsByTagName("A"));

}

// 특정 오브젝트를 받아서 해당 오브젝트의 정보를 보여주는 함수

function ShowInfo(obj)

{

  // 창단기 문자열을 변수로 만든다.

  closeStr='<SPAN style="border:solid 1 gray;padding:3;background:ffa;float:right;cursor:hand" ';

  closeStr+='onClick=self.close()>창닫기</SPAN>';

  // 테이블을 시작한다.

  str=closeStr+'<TABLE border=1 cellpadding=1 cellspacing=0 width=100% align=center>';

  // 테이블 제목을 넣는다.

  str+='<TR bgcolor=eeeeee><TH>#</TH><TH>protocol</TH><TH>href</TH>';

  str+='<TH>hash</TH><TH>target</TH><TH>host</TH></TR>';

 

  // 출력할 윈도우를 열고 이름(newWin)을 부여한다.

  newWin=window.open('','newWin','width=900,height=500,top=100,left=50,toolbars=no,scrollbars=yes');

 

  // 연결 배열변수 길이만큼 반복하는 루프를 시작한다.

  for (numb=0;numb<obj.length;numb++){

    // 번호를 넣는다.

    str+='<TR><TD>links['+numb+']</TD>';

    // 프로토콜을 넣는다.

    str+='<TD>'+(obj[numb].protocol?obj[numb].protocol:'&nbsp;')+'</TD>';

    // 각각 삼항식으로 빈칸이면 공백문자(&nbsp;)를 넣는다.

   

    // 연결주소를 넣는다.

    str+='<TD>'+(obj[numb].href?obj[numb].href:'&nbsp;')+'</TD>';

    // 부위지정자를 넣는다.

    str+='<TD>'+(obj[numb].hash?obj[numb].hash:'&nbsp;')+'</TD>';

    // 중복성이므로 생략한다.

//    str+='<TD>'+(obj[numb].search?obj[numb].search:' ')+'</TD>';

    // 목표 프레임을 넣는다.

    str+='<TD>'+(obj[numb].target?obj[numb].target:'&nbsp;')+'</TD>';

    // 호스트를 넣는다.

    str+='<TD>'+(obj[numb].host?obj[numb].host:'&nbsp;')+'</TD>';

    // 중복성이므로 생략한다.

//    str+='<TD>'+(obj[numb].pathname?obj[numb].pathname:' ')+'</TD>';

    str+='</TR>'; // 테이블 한줄을 닫는다.

  } // 루프를 종료한다.

 

 

  str+='</TABLE>'+closeStr; // 테이블을 닫는다.

  newWin.document.write(str); // 결과를 보조창에 출력한다.

}

</script>


 

<div class="show" title="결과">

<input type="button" value="문서내 모든 링크정보 보기" onclick="showAll()" />

<input type="button" value="특정 영역 링크정보 보기" onclick="targetAll()" />

</div>

<div id="sample">

<a href="http://www.naver.com" target="_blank">네이버</a>

</div>

<div>

<a href="http://www.daum.net" target="_top">다음</a>

</div>



다음

━━━━━━━━━━━━━━━
by 한상국(han3925)
MAIL  han3925@gmail.com
         han3925@hotmail.com
BLOG pointnet.tistory.com
━━━━━━━━━━━━━━━

Posted by 1010
반응형
한글입력 : <input type=text style='IME-MODE: active'><br>
<br>

자동 (위의 속성을 이어받습니다) : <input type=text style='IME-MODE: auto'><br>
<br>

영문입력 : <input type=text style='IME-MODE: inactive'><br>
<br>

입력모드 해제 : <input type=text style='IME-MODE: deactivated'><br>
<br>
Posted by 1010
반응형
Posted by 1010
반응형

prototype.js 를 위한 개발자 노트

1.4.0 버전을 다룸

Sergio PereiraSergio Pereira에 의해 작성됨
최근 업데이트: 2006년 4월 13일

Table of Contents

Prototype은 무엇인가.?

prototype.jsSam Stephenson에 의해 작성된 자바스크립트 라이브러리이다. 이 놀랍도록 멋진 생각과 표준에 의해 잘 작성된 코드의 일부는 웹2.0의 특성을 나타내는 풍부하고 상호작용하는 웹페이지와 많은 연관을 가진다.

만약 당신이 최근 이 라이브러리를 사용하기 시작했다면, 당신은 아마도 이 문서가 가장 좋은 지시사항중에 하나는 아니라는것을 알아차렸을것이다. 나 이전에 다른 많은 개발자들처럼, 나는 소스코드와 이것을 사용한 경험에서 prototype.js에 대한 지식을 가지게 되었다. 나는 모든 이가 배우고 공유하는 동안 좀더 많은 정보를 얻게 되는게 가장 좋은 것이라고 생각한다.

나는 objects, classes, functions, 그리고 이 라이브러리에 의해 제공되는 확장을 위한 비공식적인 참조문서 또한 제공한다.

당신이 예제와 참조문서를 읽었을때, Ruby프로그래밍 언어에 친숙한 개발자는 Ruby의 내장 클래스와 이 라이브러리에 의해 구현된 많은 확장 사이의 의도적인 유사성을 알아차리게 될것이다.

toc

관련글

고급 자바스크립트 가이드문서.

toc

유틸리티 함수들(utility functions)

라이브러리는 미리 정의된 많은 수의 객체와 유틸리티 함수를 가진다. 이 알기쉬운 함수들의 목적은 반복적인 타이핑과 어구를 많이 줄이는데 있다.

toc

$() 함수 사용하기

$()함수는 가장 많이 사용되는 DOM의 document.getElementById()함수에 대한 편리한 단축키이다. DOM함수처럼, 이것은 인자로 던져진 id를 가진 요소를 하나 반환한다.

하지만 DOM함수와는 달리, 이것은 여러개의 id를 사용할수 있고 $()는 요청된 요소를 가진 Array객체를 반환할것이다. 예제는 아래와 같다.

<HTML>
<HEAD>
<TITLE> Test Page </TITLE>
<script src="prototype-1.4.0.js"></script>

<script>
	function test1()
	{
		var d = $('myDiv');
		alert(d.innerHTML);
	}

	function test2()
	{
		var divs = $('myDiv','myOtherDiv');
		for(i=0; i<divs.length; i++)
		{
			alert(divs[i].innerHTML);
		}
	}
</script>
</HEAD>

<BODY>
	<div id="myDiv">
		<p>This is a paragraph</p>
	</div>
	<div id="myOtherDiv">
		<p>This is another paragraph</p>
	</div>

	<input type="button" value=Test1 onclick="test1();"><br> 
	<input type="button" value=Test2 onclick="test2();"><br> 

</BODY>
</HTML>

이 함수의 다른 좋은 점은 이것은 인자형태를 가질수 있는 다른 함수를 생성할때 매우 유용하도록 만들어주는 id문자열이나 요소객체 자체를 던질수 있다는 것이다.

toc

$F() 함수 사용하기

$F() 함수는 다른 단축키이다. 이것은 text박스나 드랍다운 list와 같은 어떤 필드의 입력 컨트롤의 값을 반환한다. 이 함수는 요소 id나 요소객체 자체를 인자로 가질수 있다.

<script>
	function test3()
	{
		alert(  $F('userName')  );
	}
</script>

<input type="text" id="userName" value="Joe Doe"><br> 
<input type="button" value=Test3 onclick="test3();"><br> 
			

toc

$A() 함수 사용하기

$A() 함수는 이것을 받아들이는 하나의 인자를 Array객체로 변환한다.

Array 클래스를 위한 확장과 조합된 이 함수는 이것을 더욱 쉽게 만든다. 예를 들면, 작성한 함수는 인자의 수를 유연하게 받아들인다.

<script>

	function showOptions(){
		var someNodeList = $('lstEmployees').getElementsByTagName('option');
		var nodes = $A(someNodeList);

		nodes.each(function(node){
				alert(node.nodeName + ': ' + node.innerHTML);
			});
	}
</script>

<select id="lstEmployees" size="10" >
	<option value="5">Buchanan, Steven</option>
	<option value="8">Callahan, Laura</option>
	<option value="1">Davolio, Nancy</option>
</select>

<input type="button" value="Show the options" onclick="showOptions();" > 
			

toc

$H() 함수 사용하기

$H() 함수는 결합된 배열을 열거할수 있는 Hash객체로 변환한다.

<script>
	function testHash()
	{
		//let's create the object
		var a = {
			first: 10,
			second: 20,
			third: 30
			};

		//now transform it into a hash
		var h = $H(a);
		alert(h.toQueryString()); //displays: first=10&second=20&third=30
	}

</script>
			

toc

$R() 함수 사용하기

$R() 함수는 new ObjectRange(lowerBound, upperBound, excludeBounds)를 작성하기 위한 짧은 형태이다.

이 클래스의 완전한 설명을 보기 위해 ObjectRange 클래스 문서를 보라. each 메소드를 통해 반복(iterators)의 사용법을 보여주는 간단한 예제를 보자. 더 많은 메소드는 Enumerable 클래스 문서에서 볼수 있을것이다.

<script>
	function demoDollar_R(){
		var range = $R(10, 20, false);
		range.each(function(value, index){
			alert(value);
		});
	}

</script>

<input type="button" value="Sample Count" onclick="demoDollar_R();" > 
			

toc

Try.these() 함수 사용하기

이것은 인자처럼 많은 수의 함수를 가지고 그것들을 순서대로 차례차례 호출하도록 해준다. 이것은 함수중에 하나씩 수행하고 성공적인 함수호출의 결과를 반환할때까지 순차적으로 수행된다.

예제는 아래와 같다. xmlNode.text는 몇몇 브라우저에서 작동하고 xmlNode.textContent는 다른 브라우저에서 작동한다. Try.these()함수를 사용하면 당신은 작동하는 것중 하나를 반환할수 있다.

<script>
function getXmlNodeValue(xmlNode){
	return Try.these(
		function() {return xmlNode.text;},
		function() {return xmlNode.textContent;}
		);
}
</script>
			

toc

Ajax 객체

위에서 언급된 유틸리티 함수들은 좋다. 하지만 다시 보자. 그것들은 대부분 고급(advanced) 형태는 아니다. 당신은 스스로 이것들을 만들수 있고 당신 자신만의 스크립트에 유사한 함수를 이미 가지고 있을수도 있다. 하지만 이러한 함수들은 단지 일부분에 해당되는 팁일뿐이다.

나는 prototype.js에 대한 당신의 관심이 대부분의 AJAX기능을 다룰수 있다는 것이라고 확신한다. 그래서 당신이 AJAX로직을 수행할 필요가 있을때 좀더 쉽게 사용하도록 도와주는 라이브러리를 사용하는 방법을 살펴보자.

AJAX객체는 AJAX함수를 작성할 때 포함되는 트릭성격의 코드를 포장하고 단순화하기 위한 라이브러리에 의해 생성된 미리-정의된 객체이다. 이 객체는 캡슐화된 AJAX로직을 제공하는 많은 수의 클래스를 포함한다. 그 클래스중에 몇개를 살펴보자.

toc

Ajax.Request 클래스 사용하기

만약 당신이 어떠한 헬퍼(helper) 라이브러리도 사용하지 않는다면, 당신은 XMLHttpRequest객체를 생성하기 위한 많은 코드를 작성할 것이고 단계를 비동기적으로 수행할것이다. 그리고나서 응답을 뽑아내고 이것을 처리한다. 그리고나서는 한가지 이상의 브라우저를 지원하지 않는다면 스스로 행운이라고 생각할 것이다.

AJAX기능을 지원하기 위해, 라이브러리는 Ajax.Request클래스를 정의한다.

당신이 다음처럼 XML응답을 반환하는 http://yoursever/app/get_sales?empID=1234&year=1998 url을 통해 서버와 통신할수 있는 애플리케이션을 가지고 있다고 해보자.

<?xml version="1.0" encoding="utf-8" ?> 
<ajax-response>
	<response type="object" id="productDetails">
		<monthly-sales>
			<employee-sales>
				<employee-id>1234</employee-id> 
				<year-month>1998-01</year-month> 
				<sales>$8,115.36</sales> 
			</employee-sales>
			<employee-sales>
				<employee-id>1234</employee-id> 
				<year-month>1998-02</year-month> 
				<sales>$11,147.51</sales> 
			</employee-sales>
		</monthly-sales>
	</response>
</ajax-response>			
			

XML을 가져오기 위해 서버와 통신하는 것은 Ajax.Request객체를 사용하면 매우 간단하다. 아래의 샘플은 이것을 수행하는 방법을 보여준다.

<script>
	function searchSales()
	{
		var empID = $F('lstEmployees');
		var y = $F('lstYears');
		var url = 'http://yourserver/app/get_sales';
		var pars = 'empID=' + empID + '&year=' + y;
		
var myAjax = new Ajax.Request( url, { method: 'get', parameters: pars, onComplete: showResponse });
} function showResponse(originalRequest) { //put returned XML in the textarea $('result').value = originalRequest.responseText; } </script> <select id="lstEmployees" size="10" onchange="searchSales()"> <option value="5">Buchanan, Steven</option> <option value="8">Callahan, Laura</option> <option value="1">Davolio, Nancy</option> </select> <select id="lstYears" size="3" onchange="searchSales()"> <option selected="selected" value="1996">1996</option> <option value="1997">1997</option> <option value="1998">1998</option> </select> <br><textarea id=result cols=60 rows=10 ></textarea>

Ajax.Request객체의 생성자의 두번째 파라미터를 알아보겠는가.? {method: 'get', parameters: pars, onComplete: showResponse} 파라미터는 문자적 표기법으로 익명 객체를 나타낸다. 이것이 의미하는 것은 'get' 문자열을 포함하는 명명된 메소드(method)의 프라퍼티, HTTP요청 문자열을 포함하는 명명된 파라미터(parameter)의 프라퍼티, 그리고 함수 showResponse를 포함하는 onComplete 프라퍼티/메소드를 가지는 객체를 전달한다는 것이다.

당신이 AJAX를 비동기적으로(asynchronous) 서버에 호출할지를 결정하고 truefalse값으로 셋팅할수 있는 asynchronous(디폴트 값은 true이다.)와 같은 이 객체내 정의하고 활성화시킬수 있는 다른 프라퍼티가 몇개 있다.

이 파라미터는 AJAX호출을 위한 옵션을 정의한다. 샘플에서, 우리는 HTTP GET명령을 통해 첫번째 인자에서 url을 호출한다. 변수 pars내 포함된 조회문자열(querystring)을 전달하고 Ajax.Request객체는 응답을 받아들이는 작업을 마칠때 showResponse함수를 호출할 것이다.

당신이 아는것처럼, XMLHttpRequest는 HTTP호출을 하는 동안 진행과정을 보고한다. 이 진행과정은 4가지의 단계(Loading, Loaded, Interactive, 또는 Complete)를 알릴수 있다. 당신은 이러한 단계중에서 Ajax.Request객체 호출을 사용자정의 함수로 만들수 있다. Complete는 가장 공통적인 단계이다. 함수를 객체에게 알리기 위해, 우리 예제의 onComplete처럼 요청옵션내 onXXXXX로 명명된 프라퍼티/메소드를 간단히 제공하라. 당신이 전달하는 이 함수는 XMLHttpRequest객체 자체가 될 하나의 인자를 가진 객체에 의해 호출될것이다. 당신은 반환 데이터를 얻기 위해 이 객체를 사용할수 있고 아마도 호출의 HTTP결과 코드를 포함할 상태(status) 프라퍼티를 체크할것이다.

두개의 다른 흥미로운 옵션은 결과를 처리하기 위해 사용될수 있다. 우리는 AJAX호출이 에러없이 수행될때 호출될 함수처럼 onSuccess옵션을 명시할수 있다. onFailure옵션은 서버에러가 발생할때 호출될 함수가 될수 있다. onXXXXX의 선택적인 함수처럼, 이 두가지는 AJAX호출이 옮기는 XMLHttpRequest객체를 전달하도록 호출될수 있을것이다.

1.4.0 버전에서, 이벤트 콜랙 핸들링의 새로운 형태가 소개되었다. 만약 당신이 AJAX호출이 발생하는데도 불구하고 특정 이벤트를 위해 수행되어야 하는 코드를 가지고 있다면, 당신은 새로운 Ajax.Responders 객체를 사용할수 있다.

당신이 AJAX호출이 진행중이라는 시각적 표시를 보여주길 원한다고 해보자. 당신은 두개의 전역 이벤트 핸들러를 사용할수 있다. 하나는 첫번째 호출이 시작되었을때 아이콘을 보여주는것이고 다른 하나는 적어도 하나가 끝났을때 아이콘을 숨기는 것이다. 아래의 예제를 보자.

<script>
	var myGlobalHandlers = {
		onCreate: function(){
			Element.show('systemWorking');
		},

		onComplete: function() {
			if(Ajax.activeRequestCount == 0){
				Element.hide('systemWorking');
			}
		}
	};

	Ajax.Responders.register(myGlobalHandlers);
</script>

<div id='systemWorking'><img src='spinner.gif'>Loading...</div>
	

우리의 샘플은 흥미로운 방법으로 XML응답을 처리하지는 않았다. 우리는 textarea내 XML을 집어넣었다. 응답의 전형적인 사용법은 XML내부에서 바라는 정보를 찾고자 할것이고 몇몇 페이지 요소나 페이지내 HTML을 만드는 몇가지의 XSLT변형을 업데이트할것이다.

좀더 완전한 설명을 보기 위해서, Ajax.Request 참조options 참조를 보라..

toc

Ajax.Updater 클래스 사용하기

만약 당신이 HTML로 이미 포맷팅된 정보를 반환할수 있는 서버 종료점(endpoint)을 가진다면, 라이브러리는 당신이 Ajax.Updater클래스를 사용하는것을 좀더 쉽게 만들어준다. 이것으로 당신은 어느 요소가 AJAX호출로부터 반환된 HTML을 채우는지 알리게 된다. 예제는 내가 글로 표현하는 것보다 당신을 좀더 쉽게 이해하도록 도와줄것이다.

<script>
	function getHTML()
	{
		var url = 'http://yourserver/app/getSomeHTML';
		var pars = 'someParameter=ABC';
		
var myAjax = new Ajax.Updater( 'placeholder', url, { method: 'get', parameters: pars });
} </script> <input type=button value=GetHtml onclick="getHTML()"> <div id="placeholder"></div>

당신이 보는것처럼, 코드는 onComplete함수와 생성자에 전달된 요소 id를 제외하고 이전예제에 비해서 매우 간단하다. 클라이언트에서 서버 에러들을 다루는 것이 어떻게 가능한지 보기 위해 코드를 조금 변경해 보자.

우리는 호출을 위해 더 많은 옵션을 추가하고 에러 상황을 뽑아내기 위해 함수를 명시한다. 이것은 onFailure옵션을 사용하여 수행한다. 우리는 성공적인 작동의 경우에만 활성화될 묶음자(placeholder)를 명시할것이다. 이것을 달성하기 위해, 우리는 간단한 요소 id에서 두개의 프라퍼티(success-모든것이 정상적일때 사용되는, failure-어떤것이 실패일때 사용되는)를 가지는 객체로 첫번째 파라미터를 변경할 것이다. 우리는 예제에서 failure 프라퍼티를 사용하지 않을것이고, onFailure옵션에서 reportError함수를 사용할것이다.

<script>
	function getHTML()
	{
		var url = 'http://yourserver/app/getSomeHTML';
		var pars = 'someParameter=ABC';
		
var myAjax = new Ajax.Updater( {success: 'placeholder'}, url, { method: 'get', parameters: pars, onFailure: reportError });
} function reportError(request) { alert('Sorry. There was an error.'); } </script> <input type=button value=GetHtml onclick="getHTML()"> <div id="placeholder"></div>

만약 당신의 서버 로직이 HTML마크업 대신에 자바스크립트 코드를 반환한다면, Ajax.Updater객체는 자바스크립트 코드가 될수 있다. 자바스크립트로 응답을 처리하기 위한 객체를 얻기 위해, 당신은 객체 생성자의 마지막 인자로 프라퍼티들의 목록에 evalScripts: true;를 간단히 추가한다. 하지만 여기엔 문제가 있다. 이러한 스크립트 블럭은 페이지의 스크립트에 추가되지 않을것이다. 옵션이름인 evalScripts이 제시하는것처럼, 스크립트는 평가될것이다. 차이점이 무엇일까.? 요청된 URL이 반환하는 것이 무엇인지 추측해보자.

<script language="javascript" type="text/javascript">
	function sayHi(){
		alert('Hi');
	}
</script>

<input type=button value="Click Me" onclick="sayHi()">
			

이 경우 당신이 이전에 이것을 시도했다면 이것이 작동하지 않는것을 알고 있을것이다. 이유는 스크립트 블럭은 평가될것이고 평가된 스크립트는 sayHi 라는 이름의 함수를 생성하지 않을것이다. 이것은 아무것도 하지 않을것이다. 이 함수를 생성하기 위해, 우리는 함수를 생성하기 위해 변경할 필요가 있다. 아래를 보라.

<script language="javascript" type="text/javascript">
	
sayHi = function(){ alert('Hi'); };
</script> <input type=button value="Click Me" onclick="sayHi()">

이전 예제에서, 우리는 변수를 선언하기 위해 var 키워드를 사용하지 않았다. 그렇게 하는 것은 스크립트 블럭에 지역화될 함수 객체를 생성할것이다. var 키워드 없이 함수 객체는 window범위에서 작동한다.

좀더 상세한 complete설명을 위해서는, Ajax.Request 참조문서Ajax.options 참조문서를 보라.

toc

열거(Enumerating)...

우리는 루프(loop)에 친숙하다. 당신이 알다시피, 배열 자체를 생성하고 같은 종류의 요소로 채운다. 루프 제어구조(이를 테면, foreach, while, repeat 등등)을 생성하고 숫자로 된 인덱스를 통해 순차적으로 각각의 요소에 접근하고 그 요소로 작업을 수행한다.

당신이 이것에 대해 생각할때, 언제나 당신은 코드에 배열을 가지고 루프내 배열을 사용할것이라는것을 의미한다. 이러한 반복을 다루기 위해 좀더 많은 기능을 가진 배열 객체가 있다면 좋지 않겠는가.? 그렇다. 많은 프로그래밍 언어는 배열이나 유사한 구조(collection과 list와 같은)에서 이러한 기능을 제공한다.

prototype.js는 우리에게 반복가능한 데이터를 다룰때 사용하도록 구현된 Enumerable 객체를 제공한다. prototype.js 라이브러리는 더 나아가 Enumerable의 모든 메소드로 Array 클래스를 확장한다

toc

루프, 루비-스타일

표준 자바스크립트에서, 당신이 배열의 요소를 순차적으로 표시하길 원한다면, 당신은 다음처럼 작성할수 있다.

<script>
	function showList(){
		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Meg'];
for(i=0;i<simpsons.length;i++){ alert(simpsons[i]); }
} </script> <input type="button" value="Show List" onclick="showList();" >

prototype.js를 사용하면, 다음과 같이 다시 작성할수 있다.

	function showList(){
		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Meg'];
simpsons.each( function(familyMember){ alert(familyMember); });
}

당신은 특이한 문법으로 별로 좋지않다고 생각할지도 모른다. 위 예제에서, 엉망으로 만드는 것은 아무것도 없다.

each 메소드에 대한 인자처럼 전달되는 이 함수는 보았는가.? iterator 함수처럼 이것을 참조해보자.

toc

스테로이드(steroids)에서 당신의 배열

위에서 언급된것처럼, 이것은 같은 프라퍼티와 메소드를 가지는 배열내 모든 요소를 위해 공통이다. 우리의 새로운 배열을 가지고 iterator함수의 장점을 가질수 있는 방법을 보자.

문법에 따르는 요소를 찾아라.

<script>
	function findEmployeeById(emp_id){
		var listBox = $('lstEmployees')
		var options = listBox.getElementsByTagName('option');
		options = $A(options);
		var opt = options.find( function(employee){
			return (employee.value == emp_id);
		});
		alert(opt.innerHTML); //displays the employee name
	}
</script>

<select id="lstEmployees" size="10" >
	<option value="5">Buchanan, Steven</option>
	<option value="8">Callahan, Laura</option>
	<option value="1">Davolio, Nancy</option>
</select>

<input type="button" value="Find Laura" onclick="findEmployeeById(8);" > 
			

배열에서 항목을 걸러내는 방법을 보자. 그리고나서 각각의 요소로부터 맴버를 가져온다.

<script>
	function showLocalLinks(paragraph){
		paragraph = $(paragraph);
		var links = $A(paragraph.getElementsByTagName('a'));
		//find links that do not start with 'http'
		var localLinks = links.findAll( function(link){
			var start = link.href.substring(0,4);
			return start !='http';
		});
		//now the link texts
		var texts = localLinks.pluck('innerHTML');
		//get them in a single string
		var result = texts.inspect();
		alert(result);
	}

</script>
<p id="someText">
	This <a href="http://othersite.com/page.html">text</a> has 
	a <a href="#localAnchor">lot</a> of 
	<a href="#otherAnchor">links</a>. Some are 
	<a href="http://wherever.com/page.html">external</a>
	and some are <a href="#someAnchor">local</a>
</p>
<input type=button value="Find Local Links" onclick="showLocalLinks('someText')">
			

이것은 이 문법에 완전히 빠지도록 하기 위한 몇가지 예제를 가진다. 사용가능한 모든 함수를 위해 Enumerable and Array 참조문서를 보라.

toc

내가 강력하게 추천하는 책들.

다음의 책들은 AJAX애플리케이션을 만들기 위해 요구되는 새로운 스킬을 배우는데 많은 도움을 주었고 이미 알고 있던 스킬을 좀더 탄탄하게 만들어주었다. 나는 좋은 책이 충분히 금적적인 가치를 하고 오랜시간동안 가치를 이어간다고 생각한다.

toc


prototype.js 참조

JavaScript 클래스에 대한 확장

prototype.js라이브러리에 기능을 추가하기 위한 방법중 하나는 현재 존재하는 JavaScript클래스를 확장하는 것이다.

toc

Object 클래스를 위한 확장

메소드 종류 인자 상세설명
extend(destination, source) static destination: 객체, source: 객체 source에서 destination으로 모든 프라퍼티와 메소드를 복사하여 상속을 구현하기 위한 방법을 제공
inspect(targetObj) static targetObj: 객체 targetObj의 사람이 읽을수 있는 문자열 표현으로 반환. 주어진 객체가 inspect 인스턴스 메소드를 정의하지 않는다면, toString 의 값을 반환

toc

Number 클래스를 위한 확장

메소드 종류 인자 상세설명
toColorPart() instance (none) 숫자의 16진법 표현을 반환. 색상의 RGB컴포넌트를 HTML표현으로 변환할때 유용
succ() instance (none) 다음 숫자를 반환. 이 함수는 반복을 포함하는 시나리오에서 사용된다.
times(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 인자 valueindex를 반복적으로 전달하는 iterator 함수를 호출하는 것은 iteration과 현재 index내 현재 값을 각각 포함한다.

다음의 예제는 0에서 9까지의 메시지 박스를 표시할것이다.

<script>
	function demoTimes(){
		var n = 10;
		n.times(function(index){
			alert(index);
		});
		/***************************
		 * you could have also used: 
		 *           (10).times( .... ); 
		 ***************************/
	}

</script>

<input type=button value="Test Number.times()" onclick="demoTimes()">
			

toc

Function 클래스를 위한 확장

메소드 종류 인자 상세설명
bind(object) instance object: 메소드를 소유하는 객체 함수(=메소드) 소유자 객체로 미리 묶는 함수의 인스턴스를 반환. 반환된 함수는 원래의 것과 같은 인자를 가질것이다.
bindAsEventListener(object) instance object: 메소드를 소유하는 객체 유하는 객체 함수(=메소드) 소유자 객체로 미리 묶는 함수의 인스턴스를 반환. 반환된 함수는 이것의 인자로 현재 이벤트 객체를 가질것이다.

실제로 이 확장중 하나를 보자.

<input type=checkbox id=myChk value=1> Test?
<script>
	//declaring the class
	var CheckboxWatcher = Class.create();

	//defining the rest of the class implementation
	CheckboxWatcher.prototype = {

	   initialize: function(chkBox, message) {
			this.chkBox = $(chkBox);
			this.message = message;
			//assigning our method to the event
			
this.chkBox.onclick = this.showMessage.bindAsEventListener(this);
}, showMessage: function(evt) { alert(this.message + ' (' + evt.type + ')'); } }; var watcher = new CheckboxWatcher('myChk', 'Changed'); </script>

toc

String 클래스를 위한 확장

메소드 종류 인자 상세설명
stripTags() instance (none) HTML이나 XML태그가 삭제된 문자열을 반환
stripScripts() instance (none) 삭제된 <script /> 블럭을 가진 문자열을 반환
escapeHTML() instance (none) HTML마크업 문자들이 escaped된 문자열 반환
unescapeHTML() instance (none) escapeHTML()의 반대
extractScripts() instance (none) 문자열내에서 발견되는 모든 <script />블럭을 포함하는 Array객체 반환
evalScripts() instance (none) 문자열내에서 발견되는 각각의 <script />블럭을 평가하기
toQueryParams() instance (none) 쿼리문자열(querystring)을 파라미터 이름에 의해 인덱스화되는 결합된 Array로 쪼개기
parseQuery() instance (none) toQueryParams()와 같음.
toArray() instance (none) 문자열을 이것의 문자들의 Array로 쪼개기
camelize() instance (none) -(하이픈)으로 분리된 문자열을 camelCaseString으로 변환하기. 이 함수는 예를 들면, 프라퍼티 스타일을 다루는 코드를 작성할때 유용하다.

toc

Array 클래스를 위한 확장

시작하기 위해, ArrayEnumerable를 확장한다. 그래서 Enumerable객체내에 정의되는 모든 편리한 메소드는 사용가능하다. 이것외에도, 아래의 메소드들이 구현되었다.

메소드 종류 인자 상세설명
clear() instance (none) 배열을 비우고 자체를 반환한다.
compact() instance (none) null 이거나 undefined인 요소를 제외하고 배열을 반환한다. 이 메소드는 배열자체를 변경하지 않는다.
first() instance (none) 배열의 첫번째 요소를 반환한다.
flatten() instance (none) 기복이 없고, 1차원의 배열을 반환한다. 이 함수는 배열이고 반환된 배열내 요소를 포함하는 배열의 각 요소를 찾음으로써 수행된다.
indexOf(value) instance value: 당신이 찾는 것 배열에서 찾아진다면 주어진 value의 0부터 시작하는 인덱스의 위치를 반환. value이 없다면 -1을 반환
inspect() instance (none) 요소를 가진 배열의 잘 포맷팅된 문자열 표시를 반환하기 위해 변경
last() instance (none) 배열의 마지막 요소를 반환한다.
reverse([applyToSelf]) instance applyToSelf: 배열 자체가 반전되는지 표시 역순서로 배열을 반환. 인자가 주어지지 않거나 인자가 true라면, 배열자체는 반전될것이다. 그렇지 않으면 변경되지 않고 남는다.
shift() instance (none) 첫번째 요소를 반환하고 배열로부터 이것을 제거한다. 배열의 길이는 1 감소한다.
without(value1 [, value2 [, .. valueN]]) instance value1 ... valueN: 배열내 존재한다면 제외될 값 인자로 주어진 요소를 제외한 배열을 반환

toc

document DOM 객체를 위한 확장

메소드 종류 인자 상세설명
getElementsByClassName(className [, parentElement]) instance className: 요소와 연관된 CSS클래스 이름, parentElement: 객체 또는 가져올 요소를 포함하는 요소의 id. 주어진 CSS클래스명과 연관된 모든 요소를 반환. parentElement id가 주어졌다면, 전체 문서가 검색될것이다.

toc

Event 객체를 위한 확장

프라퍼티 타입 상세설명
KEY_BACKSPACE Number 8: 되돌리기(<-) 키를 위한 상수 코드.
KEY_TAB Number 9: 탭키를 위한 상수코드
KEY_RETURN Number 13: 리턴키를 위한 상수코드
KEY_ESC Number 27: Esc키를 위한 상수코드
KEY_LEFT Number 37: 왼쪽 화살표 키를 위한 상수코드
KEY_UP Number 38: 위쪽 화살표 키를 위한 상수코드
KEY_RIGHT Number 39: 오른쪽 화살표 키를 위한 상수코드
KEY_DOWN Number 40: 아래쪽 화살표 키를 위한 상수코드
KEY_DELETE Number 46: Delete키를 위한 상수코드
observers: Array 캐시된 관찰자(observers)의 목록. 상세한 객체의 내부구현의 일부

메소드 종류 인자 상세설명
element(event) static event: 이벤트 객체 이벤트를 일으키는 요소를 반환
isLeftClick(event) static event: 이벤트 객체 마우스 왼쪽 버튼을 클릭시 true값 반환
pointerX(event) static event: 이벤트 객체 페이지에서 마우스 포인터의 x측 좌표값 반환
pointerY(event) static event: 이벤트 객체 페이지에서 마우스 포인터의 y측 좌표값 반환
stop(event) static event: 이벤트 객체 이벤트의 디폴트 행위를 취소하고 위임을 연기하기 위해 이 함수를 사용
findElement(event, tagName) static event: 이벤트 객체, tagName: 원하는 태그명 DOM트리 위쪽으로 가로지른다. 주어진 태그명을 가진 첫번째 요소를 검색한다. 이벤트를 발생시키는 요소로부터 시작한다.
observe(element, name, observer, useCapture) static element: 객체 또는 아이디, name: 이벤트 명 (like 'click', 'load', etc), observer: 이벤트를 다루는 함수, useCapture: true라면, capture내 이벤트를 다루고 false라면 bubbling 내 이벤트를 다룬다. 이벤트를 위한 이벤트 핸들러 함수를 추가
stopObserving(element, name, observer, useCapture) static element: 객체 또는 아이디, name: 이벤트 명 ('click' 처럼), observer: 이벤트를 다루는 함수, useCapture: true라면 capture내 이벤트를 다루고, false라면 bubbling내에서 다룬다. 이벤트로부터 이벤트 핸들러를 제거
_observeAndCache(element, name, observer, useCapture) static   private메소드, 이것에 대해 걱정하지말라.
unloadCache() static (none) private메소드, 이것에 대해 걱정하지말라. 메모리로부터 캐시된 모든 관찰자(observer)를 지운다.

window객체의 이벤트를 로그하기 위한 이벤트 핸들러를 추가하는 객체를 사용하는 방법을 보자.

<script>
	Event.observe(window, 'load', showMessage, false);

	function showMessage() {
	  alert('Page loaded.');
	}
</script>			
			

toc

prototype.js에 새롭게 정의된 객체와 클래스

라이브러리가 당신을 돕는 다른 방법은 객체지향 디자인과 공통적인 기능을 위한 지원 모두를 구현하는 많은 객체를 제공하는 것이다.

toc

PeriodicalExecuter 객체

이 객체는 주어진 함수를 주어진 시간간격으로 반복적으로 호출하기 위한 로직을 제공한다.

메소드 종류 인자 상세설명
[ctor](callback, interval) constructor callback: 파라미터 성격이 아닌 함수, interval: 초단위 시간간격 함수를 반복적으로 호출할 이 객체의 하나의 인스턴스를 생성

프라퍼티 타입 상세설명
callback Function() 호출되기 위한 함수. 이 함수로 전달될 파라미터는 없다.
frequency Number 이것은 수초내 간격으로 실질적으로 작용
currentlyExecuting Boolean 만약 함수 호출이 진행중이라면 표시

toc

Prototype 객체

Prototype 객체는 사용되는 라이브러리의 버전을 명시하는 것보다 중요한 역활을 가지지 않는다.

프라퍼티 타입 상세설명
Version String 라이브러리의 버전
emptyFunction Function() 비어있는(empty) 함수 객체
K Function(obj) 주어진 파라미터를 되돌리는 함수 객체
ScriptFragment String 스크립트를 확인하는 정규식 표현

toc

Enumerable 객체

Enumerable 객체는 list형태의 구조내에서 항목을 반복하기 위한 좀더 멋진 코드를 작성하는 것을 허용한다.

많은 객체들은 유용한 인터페이스에 영향을 끼치기 위해 Enumerable 을 확장한다.

프라퍼티 타입 상세설명
Version String 라이브러리의 버전

메소드 종류 인자 상세설명
each(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 주어진 iterator함수를 호출하는 것은 첫번째 인자내 목록으로 각각의 요소와 두번째 인자내 요소의 인덱스 전달한다.
all([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체 이 함수는 주어진 함수를 사용하여 값들의 전체 집합을 테스트하기 위한 방법이다. iterator 함수가 어떤 요소를 위해 falsenull을 반환한다면, all은 false를 반환할것이다. 그렇지 않다면 true를 반환할것이다. iterator가 주어지지 않는다면, 요소 자체가 falsenull이 아닌지 테스트할것이다. 당신은 "모든 요소가 false가 아닌지 체크한다"와 같이 이것을 읽을수 있다.
any(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체(선택사항) 이 함수는 주어진 함수를 사용하여 값들의 전체 집합을 테스트하기 위한 방법이다. iterator함수가 어떤 요소를 위해 falsenull을 반환하지 않는다면 anytrue를 반환할것이다. 그렇지 않다면 false를 반환할것이다. iterator가 주어지지 않는다면, 요소 자체가 falsenull이 아닌지 테스트할것이다. 당신은 "어느 요소가 false가 아닌지 체크한다"와 같이 이것을 읽을수 있다.
collect(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 Array로 각각의 결과를 반환한다. 집합내 각각의 요소를 위한 하나의 결과 요소는 같은 순서이다.
detect(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 true를 반환하는 iterator함수를 야기하는 첫번째 요소를 반환한다. true를 반환하는 요소가 없다면, detect는 null을 반환한다.
entries() instance (none) toArray()와 같다.
find(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 detect()와 같다.
findAll(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 true로 해석되는 값을 반환하는 iterator함수를 야기하는 모든 요소를 가진 Array을 반환한다. 이 함수는 reject()와는 반대의 함수이다.
grep(pattern [, iterator]) instance pattern: 요소를 일치시키기 위해 사용되는 RegExp객체, iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소의 문자열 값을 pattern 정규표현식에 대해 테스트한다. 함수는 정규표현식에 대응되는 모든 요소를 포함하는 Array 를 반환할것이다. iterator함수가 주어진다면, Array는 대응되는 각각의 요소를 가진 iterator를 호출한 결과를 포함할것이다.
include(obj) instance obj: 객체 집합내 주어진 객체를 찾도록 시도한다. 객체가 찾아진다면, true를 반환하고 찾지 못한다면 false를 반환한다.
inject(initialValue, iterator) instance initialValue: 초기화 값처럼 사용되는 객체, iterator: Function(accumulator, value, index)를 충족하는 함수 객체 iterator함수를 사용하여 집합의 모든 요소를 조합한다. 호출된 iterator는 accumulator인자에서 이전 반복의 결과를 전달한다. 첫번째 반복은 accumulator인자내 initialValue를 가진다. 마지막 결과는 마지막 반환값이다.
invoke(methodName [, arg1 [, arg2 [...]]]) instance methodName: 각각의 요소내에서 호출될 메소드의 이름, arg1..argN: 메소드 호출로 전달될 인자. 집합의 각각의 요소내 methodName에 의해 명시되는 메소드를 호출하는 것은 주어진 인자(arg1에서 argN) 전달하고 Array객체로 결과를 반환한다.
map(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 collect()과 같다.
max([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 가장 큰 값이나 iterator가 주어진다면 집합내 각각의 요소를 위한 iterator호출의 가장 큰 결과를 반환한다.
include(obj) instance obj: 객체 include()과 같다.
min([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 가장 작은 값을 가진 요소나 iterator가 주어진다면 집합내 각각의 요소를 위한 iterator호출의 가장 작은 결과를 가진 요소를 반환한다.
partition([iterator]) instance iterator: Function(value, index)를 충족하는 함수 객체 두개의 다른 배열을 포함하는 Array를 반환한다. 첫번째 배열은 true를 반환하는 iterator함수를 야기하는 모든 요소를 포함할것이고 두번째 배열은 남아있는 요소를 포함할것이다. 만약 iterator가 주어지지 않는다면, 첫번째 배열은 true로 해석하는 요소를 포함할것이고 다른 배열은 남아있는 요소를 포함할것이다.
pluck(propertyName) instance propertyName : 각각의 요소로부터 읽어들이는 프라퍼티의 이름. 이것은 요소의 인덱스를 포함할수 있다. 집합의 각각의 요소내 propertyName에 의해 명시된 프라퍼티에 값을 가져가고 Array객체로 결과를 반환한다.
reject(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 집합내 각각의 요소를 위한 iterator함수를 호출하고 false로 해석하는 값을 반환하는 iterator함수를 야기하는 모든 요소를 가진 Array를 반환한다. 이 함수는 findAll()과는 반대되는 함수이다..
select(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 findAll()과 같다.
sortBy(iterator) instance iterator: Function(value, index)를 충족하는 함수 객체 iterator함수 호출결과를 따르는 정렬된 모든 요소를 가진 Array을 반환.
toArray() instance (none) 집합의 모든 요소를 가지는 Array를 반환.
zip(collection1[, collection2 [, ... collectionN [,transform]]]) instance collection1 .. collectionN: 병합될 목록, transform: Function(value, index)를 충족하는 함수 객체 현재의 집합으로 각각의 주어진 집합을 병합한다. 이 병합 작업은 같은 수의 요소를 가진 새로운 배열을 반환한다. 현재 집합과 각각의 요소가 각각의 병합된 집합으로부터 같은 인덱스를 가진 요소의 배열(이것을 하위 배열이라고 부르자.)이다. transform함수가 주어진다면, 각각의 하위 배열은 반환되기 전에 이 함수에 의해 변형딜것이다. 빠른 예제 : [1,2,3].zip([4,5,6], [7,8,9]).inspect() 는 "[[1,4,7],[2,5,8],[3,6,9] ]" 를 반환한다.

toc

Hash 객체

Hash 객체는 hash구조를 구현한다. 이를테면, Key:Value쌍의 집합.

Hash객체내 각각의 항목은 두개의 요소(첫번째는 key, 두번째는 value)를 가진 배열이다. 각각의 항목은 두개의 프라퍼티(keyvalue)를 가진다.

메소드 종류 인자 상세설명
keys() instance (none) 모든 항목의 key를 가진 Array을 반환
values() instance (none) 모든 항목의 value를 가진 Array을 반환
merge(otherHash) instance otherHash: Hash 객체 hash와 전달된 다른 hash를 조합하고 새로운 결과 hash를 반환
toQueryString() instance (none) 쿼리 문자열처럼 포맷팅된 문자열로 hash의 모든 항목을 반환. 이를테면 'key1=value1&key2=value2&key3=value3'
inspect() instance (none) key:value쌍을 가진 hash의 포맷팅된 문자열 표현을 반환하기 위해 변경(오버라이드)

toc

ObjectRange 클래스

Enumerable으로부터 상속

상위 경계나 하위 경계로 값들의 범위를 표시

프라퍼티 타입 종류 상세설명
start (any) instance 범위의 시작값
end (any) instance 범위의 마지막값
exclusive Boolean instance 경계자체가 범위의 일부인지 판단

메소드 종류 인자 상세설명
[ctor](start, end, exclusive) constructor start: 시작값, end: 마지막값, exclusive: 경계가 범위내 포함되는가.? 하나의 range객체를 생성한다. start 에서 end로 범위를 지정한다. startend가 같은 타입의 객체이고 succ()메소드를 가져야만 한다.
include(searchedValue) instance searchedValue: 검색할 값 주어진 값이 범위내 값인지 체크. truefalse값을 반환한다.

toc

Class 객체

Class 객체는 라이브러리에서 다른 클래스를 선언할때 사용된다. 클래스를 선언할때 이 객체를 사용하는 것은 생성자로 제공되는 initialize()메소드를 지원하기 위한 새로운 클래스를 발생시킨다.

아래의 샘플을 보라.

//declaring the class
var MySampleClass = Class.create();

//defining the rest of the class implmentation
MySampleClass.prototype = {

   initialize: function(message) {
		this.message = message;
   },

   showMessage: function(ajaxResponse) {
      alert(this.message);
   }
};	

//now, let's instantiate and use one object
var myTalker = new MySampleClass('hi there.');
myTalker.showMessage(); //displays alert

			

메소드 종류 인자 상세설명
create(*) instance (any) 새로운 클래스를 위한 생성자를 정의

toc

Ajax 객체

이 객체는 AJAX기능을 제공하는 많은 다른 클래스를 위한 root와 명명공간(namespace)처럼 제공한다.

프라퍼티 타입 종류 상세설명
activeRequestCount Number instance 진행중인 AJAX요청의 수.

메소드 종류 인자 상세설명
getTransport() instance (none) 새로운 XMLHttpRequest 객체를 반환

toc

Ajax.Responders 객체

Enumerable로 부터 상속되었다

이 객체는 Ajax관련 이벤트가 발생할때 호출될 객체의 목록을 보존한다. 예를 들어, 당신이 AJAX작업을 위한 전역 예외 핸들러를 연결하길 원한다면 이 객체를 사용할수 있다.

프라퍼티 타입 종류 상세설명
responders Array instance 객체의 목록은 AJAX이벤트 알림(notifications)을 위해 등록되었다..

메소드 종류 인자 상세설명
register(responderToAdd) instance responderToAdd: 호출될 메소드를 가진 객체 responderToAdd인자를 전달하는 객체는 AJAX이벤트(이를테면, onCreate, onComplete, onException 등등)처럼 명명된 메소드를 포함해야만 한다. 유사한 이벤트가 발생하면, 적절한 이름을 가진 메소드를 포함하는 모든 등록된 객체가 호출되는 메소드를 가질것이다.
unregister(responderToRemove) instance responderToRemove: list로부터 제거될 객체 responderToRemove 인자로 전달되는 객체는 등록된 객체의 list로부터 제거될것이다.
dispatch(callback, request, transport, json) instance callback: 보고되는 AJAX이벤트 이름, request: 이벤트를 책임지는 the Ajax.Request 객체, transport: AJAX호출을 가지는 XMLHttpRequest 객체, json: 응답의 X-JSON 헤더(존재할때만) 등록된 객체의 목록을 통해 실행하는 것은 callback 인자내 결정된 메소드를 가지는 것을 찾는다. 호출되는 각각의 메소드는 다른 3개의 인자를 전달한다. AJAX응답이 몇몇 JSON컨텐츠를 가지는 X-JSON HTTP 헤더를 포함한다면, 이것은 평가되고 json인자로 전달될것이다. 만약 이벤트가 onException라면, transport인자는 대신에 예외를 가질것이고 json은 전달되지 않을것이다.

toc

Ajax.Base 클래스

이 클래스는 Ajax객체내 정의된 다른 대부분의 클래스를 위한 기본(base)클래스처럼 사용된다.

메소드 종류 인자 상세설명
setOptions(options) instance options: AJAX 옵션 AJAX작업을 위해 필요한 옵션 셋팅
responseIsSuccess() instance (none) 만약 AJAX작업이 성공한다면 true를 반환하고, 실패한다면 false를 반환
responseIsFailure() instance (none) responseIsSuccess()와는 반대.

toc

Ajax.Request 클래스

Ajax.Base로 부터 상속

AJAX 작업을 캡슐화

프라퍼티 타입 종류 상세설명
Events Array static AJAX작업중 보고되는 가능한 이벤트/상태의 목록. 목록은 'Uninitialized', 'Loading', 'Loaded', 'Interactive', 그리고 'Complete.'를 포함한다.
transport XMLHttpRequest instance AJAX작업을 가지는 XMLHttpRequest 객체
url String instance 요청에 의해 대상이 되는 URL

메소드 종류 인자 상세설명
[ctor](url, options) constructor url: 꺼내기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성. 중요사항: 선택된 url은 브라우저의 보안 셋팅을 위한 대상이 될 가치가 없다. 많은 경우 브라우저는 현재 페이지처럼 같은 호스트로부터가 아니라면 url을 가져오지 않을것이다. 당신은 설정을 피하거나 사용자의 브라우저를 제한하기 위한 로컬 url만을 사용할 것이다.
evalJSON() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX응답내 존재하는 X-JSON HTTP헤더의 컨텐츠를 평가하기 위해 내부적으로 호출된다.
evalReponse() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. AJAX응답이 text/javascriptContent-type헤더를 가진다면, 응답 몸체는 평가되고 이 메소드는 사용될것이다.
header(name) instance name: HTTP 헤더명 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX응답의 HTTP헤더의 컨텐츠를 가져오기 위해 내부적으로 호출된다.
onStateChange() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX호출 상태 변경시 객체 자체에 의해 호출된다.
request(url) instance url: AJAX호출을 위한 url 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 생성자를 호출하는 동안 벌써 호출되었다.
respondToReadyState(readyState) instance readyState: 상태 숫자값(1 에서 4) 이 메소드는 대개 외부에서 호출되지 않는다. 이것은 AJAX호출 상태가 변경될때 객체 자체에 의해 호출된다.
setRequestHeaders() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 HTTP요청을 하는 동안 보내어질 HTTP헤더를 조합하기 위한 객체 스스로에 의해 호출된다.

toc

options 인자 객체

AJAX작업의 중요한 부분은 options 인자이다. 이것은 기대되는 프라퍼티를 가지는 동안 어떠한 객체도 전달될수 있다. 이것은 AJAX호출을 위해 익명 객체를 생성하는 것이 공통적이다.

프라퍼티 타입 디폴트 상세설명
method String 'post' HTTP요청의 메소드
parameters String '' 요청에 전달한 값들의 url형태의 목록
asynchronous Boolean true AJAX호출이 비동기적으로 만들어지는지 표시
postBody String undefined HTTP POST의 경우 요청의 몸체내 전달되는 내용
requestHeaders Array undefined 요청과 함께 전달되기 위한 HTTP헤더의 목록. 이 목록은 많은 수의 항목을 가져야 한다. 나머지 항목은 사용자 정의 헤더의 이름이다. 그리고 다음의 항목은 헤더의 문자열 값이다. 예제 : ['my-header1', 'this is the value', 'my-other-header', 'another value']
onXXXXXXXX Function(XMLHttpRequest) undefined 각각의 이벤트/상태가 AJAX호출이 발생하는 동안 도착할때 호출될 사용자정의 함수. 예제 var myOpts = {onComplete: showResponse, onLoaded: registerLoaded};. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
onSuccess Function(XMLHttpRequest) undefined AJAX호출이 성공적으로 완성될때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
onFailure Function(XMLHttpRequest) undefined AJAX호출이 에러를 가진채 끝날때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
insertion Function(Object, String) null 삽입하기 위해 호출되는 함수는 텍스트를 요소로 반환한다. 함수는 수정되기 위한 요소객체와 Ajax.Updater객체에만 적용되는 응답 텍스트의 두개의 인자를 가지고 호출된다.
evalScripts Boolean undefined, false 스크립트 블럭이 응답이 도착했을때 평가할지를 판단. Ajax.Updater객체에만 적용.
decay Number undefined, 1 Ajax.PeriodicalUpdater 객체는 받은 응답이 마지막 것과 같을때 비율을 새롭게 하여 연속적인 후퇴를 결정. 예를 들어, 당신이 2를 사용한다면, 새롭게 된것중에 하나가 이전것과 같은 결과를 만든후에, 객체는 다음 refresh를 위한 시간의 두배를 기다릴것이다. 이것은 다시 반복한다면, 객체는 4배를 기다릴것이다. 이것을 후퇴를 피하기 위해 정의되지 않거나 1을 사용하도록 남겨두라.
frequency Number undefined, 2 초단위의 갱신간격(횟수가 아닌), Ajax.PeriodicalUpdater객체에만 적용.

toc

Ajax.Updater 클래스

Ajax.Request로 부터 상속

요청된 url이 당신 페이지의 특정 요소내 직접적으로 삽입하길 원하는 HTML을 반환할때 사용된다. 당신은 url이 도착을 평가할 <script>블럭을 반환할때 이 객체를 사용할수 있다. 스크립트로 작업하기 위해 evalScripts 옵션을 사용하라.

프라퍼티 타입 종류 상세설명
containers Object instance 이 객체는 두개의 프라퍼티(containers.success 는 AJAX호출이 성공할때 사용될것이다. 그리고 AJAX호출이 실패한다면 containers.failure가 사용될것이다.)를 포함한다.

메소드 종류 인자 상세설명
[ctor](container, url, options) constructor container: 이것은 요소의 id, 요소객체 자체, 또는 두개의 프라퍼티(AJAX호출이 성공했을때 사용될 object.success 요소(또는 id), 그리고 AJAX호출이 실패했을때 사용될 object.failure요소(또는 id))를 가지는 객체가 될수 있다. url: 가져오기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성.
updateContent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 응답을 받았을때 객체 자체에 의해 호출된다. 이것은 HTML로 적절한 요소를 수정하거나 insertion옵션내 전달되는 함수를 호출할것이다. 이 함수는 두개의 인자(수정되기 위한 요소와 응답 텍스트)를 가지고 호출될것이다.

toc

Ajax.PeriodicalUpdater 클래스

Ajax.Base로 부터 상속

이 클래스는 반복적으로 인스턴스화하고 페이지에서 요소를 새롭게 하거나 Ajax.Updater가 수행할수 있는 다른 작업중 어느것을 수행하기 위한 Ajax.Updater객체를 사용한다. 좀더 많은 정보를 위해 Ajax.Updater 참조를 체크하라.

프라퍼티 타입 종류 상세설명
container Object instance 이 값은 Ajax.Updater생성자에 일관적으로 전달될것이다.
url String instance 이 값은 Ajax.Updater의 생성자에 일관적으로 전달될것이다.
frequency Number instance 초단위의 refresh간격. 디폴트는 2초. 이 숫자는 Ajax.Updater 객체를 호출할때 현재 축소(decay)에 의해 곱해질것이다.
decay Number instance 작업을 재-수행할때 적용될 축소(decay)레벨을 유지
updater Ajax.Updater instance 가장 최신에 사용된 Ajax.Updater 객체
timer Object instance 다른 refresh를 위한 시각일때 객체를 알리기 위해 사용되는 자바스크립트 타이머

메소드 종류 인자 상세설명
[ctor](container, url, options) constructor or container:이것은 요소의 id, 요소객체 자체, 또는 두개의 프라퍼티(AJAX호출이 성공할때 사용될 object.success 요소(나 id), AJAX호출이 실패할때 사용할 object.failure 요소(나 id))를 가지는 객체가 될수 있다. url: 가져오기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성
start() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것의 정기적인 작업 수행을 시작하기 위해 객체 자체에 의해 호출된다.
stop() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것의 정기적인 작업 수행을 시작하기 위해 객체 자체에 의해 호출된다.
updateComplete() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 요청을 완성한 후에 사용되는 Ajax.Updater에 의해 호출된다. 이것은 다음 refresh스케줄링 하기 위해 사용된다.
onTimerEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 다음 수정을 위한 시각일때 내부적으로 호출된다.

toc

Element 객체

이 객체는 DOM내 요소를 변경하기 위해 몇몇 유틸리티성 함수들을 제공한다.

메소드 종류 인자 상세설명
addClassName(element, className) instance element: element 객체 또는 아이디, className: CSS 클래스명 주어진 class명을 요소의 class명으로 추가
classNames(element) instance element: element 객체 또는 아이디 주어진 element와 관련된 CSS class명을 표시하는 Element.ClassNames 객체를 반환
cleanWhitespace(element) instance element: element 객체 또는 아이디 요소의 자식노드에서 공백을 제거
empty(element) instance element: element 객체 또는 아이디 element태그가 비어있는지(또는 공백만을 가지고 있는지) 표시하는 Boolean값을 반환
getDimensions(element) instance element: element 객체 또는 아이디 element의 면적(dimensions)을 반환. 반환된 값은 두개의 프라퍼티(heightwidth)를 가지는 객체이다.
getHeight(element) instance element: element 객체 또는 아이디 요소의 offsetHeight값을 반환
getStyle(element, cssProperty) instance element: element 객체 또는 아이디, cssProperty : CSS프라퍼티('prop-name' 또는 'propName' 가 작동하는 형태)의 이름 주어진 element내 CSS프라퍼티의 값을 반환하거나 존재하지 않는다면 null 을 반환
hasClassName(element, className) instance element: element 객체 또는 아이디, className: CSS class명 요소가 class명중에 하나로 주어진 class명을 가진다면 true를 반환
hide(elem1 [, elem2 [, elem3 [...]]]) instance elemN: element 객체 또는 아이디 style.display'none'로 셋팅하여 각각의 요소를 숨긴다.
makeClipping(element) instance element: element 객체나 아이디
makePositioned(element) instance element: element 객체나 아이디 element의 style.position'relative'로 변경
remove(element) instance element: element 객체 또는 아이디 문서로 부터 요소를 제거한다.
removeClassName(element, className) instance element: element 객체 또는 아이디, className: CSS 클래스명 요소의 class명으로 부터 주어진 class명을 제거
scrollTo(element) instance element: element 객체나 아이디 창을 element위치로 스크롤
setStyle(element, cssPropertyHash) instance element: element 객체나 아이디, cssPropertyHash : 적용되기 위한 스타일을 가지는 Hash객체 cssPropertyHash 인자내 값에 따라, 주어진 element내 CSS프라퍼티의 값을 셋팅.
show(elem1 [, elem2 [, elem3 [...]]]) instance elemN: element 객체 또는 아이디 style.display''로 다시 셋팅하여 각각의 요소를 보여준다.
toggle(elem1 [, elem2 [, elem3 [...]]]) instance elemN: element 객체 또는 아이디 각각의 전달된 요소의 가시성(visibility)을 토글(toggle)한다.
undoClipping(element) instance element: element 객체 또는 아이디
undoPositioned(element) instance element: element 객체 또는 아이디 element의 style.position''으로 초기화
update(element, html) instance element: element 객체 또는 아이디, html: html 컨텐츠 주어진 html인자를 가지는 요소의 내부 html을 대체. 주어진 html이 <script>블럭을 포함한다면, 그것들은 포함되지는 않지만 평가될것이다.
visible(element) instance element: element 객체 또는 아이디 요소가 눈에 보이는지 표시하는 Boolean값을 반환

toc

Element.ClassNames class

Enumerable로부터 상속

element에 관련된 CSS class명의 collection을 표시

메소드 종류 인자 상세설명
[ctor](element) constructor element: DOM element 객체또는 아이디 주어진 element의 CSS class명을 표시하는 Element.ClassNames 객체를 생성
add(className) instance className: CSS class 명 element에 관련된 class명의 리스트에 주어진 CSS class명을 추가
remove(className) instance className: CSS class 명 element에 관련된 class명의 리스트로부터 주어진 CSS class명을 제거
set(className) instance className: CSS class 명 주어진 CSS class명을 가진 element을 결합, element로부터 다른 class명을 제거.

toc

The Abstract 객체

이 객체는 라이브러리내 다른 클래스를 위한 root처럼 제공한다. 이것은 어떤 프라퍼티나 메소드도 가지지 않는다. 이 객체에 정의된 클래스는 전통적인 추상 클래스처럼 처리된다.

toc

Abstract.Insertion 클래스

이 클래스는 동적으로 내용물을 추가할 다른 클래스를 위한 기본 클래스처럼 사용된다. 이 클래스는 추상 클래스처럼 사용된다.

메소드 종류 인자 상세설명
[ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML 동적 내용물 삽입을 도울 객체를 생성
contentFromAnonymousTable() instance (none)

프라퍼티 타입 종류 상세설명
adjacency String static, parameter 내용물이 주어진 요소에 대해 상대적으로 위치할 지점을 명시하는 파라미터. 가능한 값은 'beforeBegin', 'afterBegin', 'beforeEnd', 그리고 'afterEnd'.
element Object instance 삽입이 상대적으로 만들어질 요소객체
content String instance 삽입될 HTML.

toc

Insertion 객체

이 객체는 라이브러리내 다른 클래스를 위한 root처럼 제공한다. 이것은 어떠한 프라퍼티나 메소드를 가지지 않는다. 이 객체에 정의된 클래스는 전통적인 추상 클래스처럼 처리된다.

toc

Insertion.Before 클래스

Abstract.Insertion로 부터 상속

요소 앞에 HTML삽입

메소드 종류 인자 상세설명
[ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML Abstract.Insertion으로 부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체를 생성

다음의 코드는

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.Before('person', 'Chief '); </script>
			

다음처럼 HTML이 변경될것이다.

<br>Hello, Chief <span id="person" style="color:red;">Wiggum. How's it going?</span>	
			

toc

Insertion.Top 클래스

Abstract.Insertion로 부터 상속

요소아래의 첫번째 자식으로 HTML을 삽입. 이 내용물은 요소의 열기 태그뒤에 위치할것이다.

메소드 종류 인자 상세설명
[ctor](element, content) constructor element: element 객체 또는 아이디, content: 삽입되는 HTML Abstract.Insertion으로부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체 생성

다음의 코드는

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.Top('person', 'Mr. '); </script>
			

다음처럼 HTML이 변경될것이다.

<br>Hello, <span id="person" style="color:red;">Mr. Wiggum. How's it going?</span>	
			

toc

Insertion.Bottom 클래스

Abstract.Insertion로 부터 상속

요소아래의 마지막 자식으로 HTML삽입. 내용물은 요소의 닫기 태그앞에 위치할것이다.

메소드 종류 인자 상세설명
[ctor](element, content) constructor element: element 객체 또는 아이디, content: HTML to be inserted Abstract.Insertion로 부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체 생성

다음의 코드는

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.Bottom('person', " What's up?"); </script>
			

다음처럼 HTML이 변경될것이다.

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going? What's up?</span>	
			

toc

Insertion.After 클래스

Abstract.Insertion로 부터 상속

요소의 닫기 태그뒤 HTML삽입

메소드 종류 인자 상세설명
[ctor](element, content) constructor element: element 객체 또는 아이디, content: HTML to be inserted Abstract.Insertion으로부터 상속. 동적으로 내용물을 삽입하는 것을 돕는 객체 생성

다음의 코드는

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span>

<script> new Insertion.After('person', ' Are you there?'); </script>
			

다음처럼 HTML이 변경될것이다.

<br>Hello, <span id="person" style="color:red;">Wiggum. How's it going?</span> Are you there?	
			

toc

Field 객체

이 객체는 폼내 input필드와 작동하기 위한 몇가지 유틸리티성 함수를 제공한다.

메소드 종류 인자 상세설명
clear(field1 [, field2 [, field3 [...]]]) instance fieldN: field element 객체 또는 아이디 field요소로부터 각각 전달된 값을 지움(clear)
present(field1 [, field2 [, field3 [...]]]) instance fieldN: field element 객체 또는 아이디 모든 폼 field가 빈값이 아니라면 true를 반환
focus(field) instance field: field element 객체 또는 아이디 주어진 폼 field로 입력 포커스 이동
select(field) instance field: field element 객체 또는 아이디 텍스트 선택을 지원하는 field내 값을 선택
activate(field) instance field: field element 객체 또는 아이디 포커스를 이동하고 텍스트 선택을 지원하는 field내 값을 선택

toc

Form 객체

이 객체는 데이터 항목 폼과 그것들의 입력 field와 작동하기 위한 몇몇 유틸리티성 함수를 제공한다.

메소드 종류 인자 상세설명
serialize(form) instance form: form element 객체 또는 아이디 'field1=value1&field2=value2&field3=value3'처럼 field명과 값의 url형태의 목록을 반환
findFirstElement(form) instance form: form element 객체 또는 아이디 form에서 첫번째로 사용가능한 필드 element를 반환
getElements(form) instance form: form element 객체 또는 아이디 폼내 모든 입력 field를 포함하는 Array 반환
getInputs(form [, typeName [, name]]) instance form: form element 객체 또는 아이디, typeName: input요소의 타입, name: input요소명. 폼내 모든 <input>요소를 포함하는 Array 반환. 선택적으로 목록은 요소의 타입이나 name속성에 의해 필터링 될수 있다.
disable(form) instance form: form element 객체 또는 아이디 폼내 모든 입력 field를 사용불가상태로 만들기
enable(form) instance form: form element 객체 또는 아이디 폼내 모든 입력 field를 사용가능하게 만들기
focusFirstElement(form) instance form: form element 객체 또는 아이디 첫번째 가시성을 활성화하고, 폼내 입력 field를 가능하게 하기
reset(form) instance form: form element 객체 또는 아이디 폼을 리셋하기. form객체의 reset()메소드와 같다.

toc

Form.Element 객체

이 객체는 폼요소와 작동하기 위한 몇몇 유틸리티성 함수를 제공한다.

메소드 종류 인자 상세설명
serialize(element) instance element: element 객체 또는 아이디 'elementName=elementValue'처럼 요소의 name=value 짝을 반환
getValue(element) instance element: element 객체 또는 아이디 요소의 값을 반환

toc

Form.Element.Serializers 객체

이 객체는 폼요소의 현재 값을 가져오기 위해 라이브러리 내부적으로 사용되는 몇몇 유틸리티성 함수를 제공한다.

메소드 종류 인자 상세설명
inputSelector(element) instance element: radio 버튼이나 checkbox처럼 checked프라퍼티를 가지는 form요소의 객체 또는 아이디 ['elementName', 'elementValue']처럼 요소의 이름과 값을 가지는 Array을 반환
textarea(element) instance element: textbox, button 또는 password필드처럼 value프라퍼티를 가지는 form요소의 객체 또는 아이디. ['elementName', 'elementValue']처럼 요소의 이름과 값을 가지는 Array를 반환
select(element) instance element: <select> 요소의 객체 또는 아이디 ['elementName', 'selOpt1 selOpt4 selOpt9']처럼 요소의 이름과 모든 선택된 옵션의 값이나 텍스트를 가지는 Array를 반환

toc

Abstract.TimedObserver 클래스

이 클래스는 값이 변경(또는 프라퍼티가 클래스정의를 얻어내는)될때까지 하나의 요소를 모니터링할 다른 클래스를 위한 기본클래스처럼 사용된다. 이 클래스는 추상클래스처럼 사용된다.

하위클래스는 요소의 입력값, style프라퍼티중 하나, 또는 테이블내 row의 수, 또는 당신이 추적하고자 하는 모든것을 모니터링하기 위해 생성될수 있다.

얻어낸 클래스는 요소내 모니터링되는 현재 값을 무엇인지 판단하기 위한 메소드를 구현하는 것이다.

메소드 종류 인자 상세설명
[ctor](element, frequency, callback) constructor element: element 객체 또는 아이디, frequency: 초단위 간격, callback: 요소가 변경될때 호출되는 함수 요소를 모니터링할 객체 생성
registerCallback() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소 모니터링릉 시작하기 위한 객체 자체에 의해 호출된다.
onTimerEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소를 체크하기 위해 정기적으로 객체 자체에 의해 호출된다.

프라퍼티 타입 상세설명
element Object 모니터링되는 요소객체
frequency Number 이것은 체크사이에 초단위 간격으로 이루어진다.
callback Function(Object, String) 요소가 변경될때마다 호출되기 위한 함수. 이것은 요소객체와 새로운 값을 받을것이다.
lastValue String 요소내 확인되는 마지막 값

toc

Form.Element.Observer 클래스

Abstract.TimedObserver로 부터 상속

폼 입력 요소의 값을 모니터링하는 Abstract.TimedObserver의 구현물. 값 변경을 보고하는 이벤트를 드러내지 않는 요소를 모니터링하고자 할때 이 클래스를 사용하라. 이 경우 당신은 Form.Element.EventObserver 클래스를 대신 사용할수 있다.

메소드 종류 인자 상세설명
[ctor](element, frequency, callback) constructor element: element 객체 또는 아이디, frequency: interval in seconds, callback: function to be called when the element changes Abstract.TimedObserver으로부터 상속. 요소의 value프라퍼티를 모니터링할 객체를 생성.
getValue() instance (none) 요소의 값을 반환

toc

Form.Observer 클래스

Abstract.TimedObserver로 부터 상속

폼내 데이터 항목 요소의 값이 변경하는지를 모니터링하는 Abstract.TimedObserver의 구현물. 당신이 값 변경을 보고하는 이벤트를 드러내지 않는 요소를 포함하는 폼을 모니터링하고자 할때 이 클래스를 사용하라. 이 경우 당신은 Form.EventObserver 클래스를 대신 사용할수 있다.

메소드 종류 인자 상세설명
[ctor](form, frequency, callback) constructor form: form 객체 또는 아이디, frequency: 초단위 간격, callback: form내 데이터 항목 요소가 변경될때 호출되는 함수 Abstract.TimedObserver로부터 상속. 변경하기 위한 폼을 모니터링할 객체 생성.
getValue() instance (none) 모든 폼의 데이터의 직렬화를 반환

toc

Abstract.EventObserver 클래스

이 클래스는 요소를 위해 값-변경 이벤트가 발생할때마다 콜백함수를 수행하는 다른 클래스를 위한 기본 클래스처럼 사용된다.

Abstract.EventObserver 타입의 다중 객체는 다른것을 지우지 않고 같은 요소로 묶일수 있다. 콜백은 요소에 할당되는 순서대로 수행될것이다.

트리거 형태의 이벤트는 radio버튼과 checkbox를 위해서는 onclick이고 대개의 textbox와 리스트박스/드랍다운을 위해서는 onchange이다.

얻어낸 클래스는 요소내 모니터링되는 현재 값을 무엇인지 판단하기 위한 메소드를 구현하는 것이다.

메소드 종류 인자 상세설명
[ctor](element, callback) constructor element: element 객체 또는 아이디, callback: 이벤트가 발생할때 호출되는 함수 요소를 모니터링할 객체 생성.
registerCallback() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소의 이벤트를 자체적으로 묶는 객체에 의해 호출된다.
registerFormCallbacks() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 폼내 각각의 데이터 항목 요소의 이벤트로 자체적으로 묶기 위한 객체에 의해 호출된다.
onElementEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소의 이벤트로 묶일것이다.

프라퍼티 타입 상세설명
element Object 모니터링되는 요소객체
callback Function(Object, String) 요소가 변경될때마다 호출되기 위한 함수. 이것은 요소객체와 새로운 값을 받을것이다.
lastValue String 요소내 확인되는 마지막 값

toc

Form.Element.EventObserver 클래스

Abstract.EventObserver로 부터 상속

요소내 값 변경을 감지하기 위한 폼 데이터 항목 요소의 적절한 이벤트를 위한 콜백 함수를 수행하는 Abstract.EventObserver의 구현물. 만약 요소가 변경을 보고하는 이벤트를 드러내지 않는다면, 당신은 Form.Element.Observer 클래스를 대신 사용할수 있다.

메소드 종류 인자 상세설명
[ctor](element, callback) constructor element: element 객체 또는 아이디, callback: function to be called when the event happens Abstract.EventObserver로 부터 상속. 요소의 value프라퍼티를 모니터링할 객체 생성.
getValue() instance (none) 요소의 값 반환.

toc

Form.EventObserver 클래스

Abstract.EventObserver로 부터 상속

값이 변결될때 감지하기 위한 요소의 이벤트를 사용하여 폼내 포함되는 어느 데이터 항목 요소에 변경을 모니터링하는 Abstract.EventObserver의 구현물. 만약 폼이 변경을 보고하는 이벤트를 드러내지 않는 요소를 포함한다면, 당신은 Form.Observer 클래스를 대신 사용할수 있다.

메소드 종류 인자 상세설명
[ctor](form, callback) constructor form: form 객체 또는 아이디, callback: form내 데이터 항목 요소가 변경될때 호출되는 함수 Abstract.EventObserver로부터 상속. 변경을 위해 폼을 모니터링할 객체 생성.
getValue() instance (none) 모든 폼의 데이터 직렬화를 반환

toc

Position 객체 (예비 문서)

이 객체는 요소 위치할당을 작업할때 돕는 수많은 함수를 제공한다.

메소드 종류 인자 상세설명
prepare() instance (none) 스크롤 위치내 변경을 수용하기 위한 deltaXdeltaY 프라퍼티 조정. 페이지 스크롤후 withinIncludingScrolloffset를 호출하기 전에 이 메소드를 호출하는 것을 기억하라.
realOffset(element) instance element: object 요소에 영향을 끼치는 어느 스크롤 offset를 포함하는 요소의 정확한 스크롤 offset를 가진 Array을 반환. 이 결과 배열은 [total_scroll_left, total_scroll_top]과 유사하다.
cumulativeOffset(element) instance element: object 위치가 할당된 부모 요소에 의해 부과된 어느 offset를 포함하는 요소의 정확한 위치가 할당된 offset를 가진 Array을 반환. 결과 배열은 [total_offset_left, total_offset_top]과 유사하다.
within(element, x, y) instance element: object, x 와 y: 위치 조정 만약 주어진 지점이 주어진 요소의 직사각형내 조정이 되는지 테스트.
withinIncludingScrolloffsets(element, x, y) instance element: object, x and y: coordinates of a point  
overlap(mode, element) instance mode: 'vertical' 나 'horizontal', element: object within()은 이 메소드가 호출되기 전에 호출될 필요가 있다. 이 메소드는 요소에서 겹치는 것을 조정하는 세분화정도를 표현하는 0.0과 1.0사이의 10진수를 반환할것이다. 예를 들면, 만약 요소가 100px를 가지는 정사각형 DIV이고 (300,300)에 위치한다면, within(divSquare, 330, 330); overlap('vertical', divSquare);은 DIV의 top border로부터 10%(30px)를 가리키는 것을 의미하는 0.10을 반환할것이다.
clone(source, target) instance source: element 객체 또는 아이디, target: element 객체 또는 아이디 source요소에 대해 똑같이 target요소의 크기를 다시 조정하고 다시 위치를 지정


1.4.0을 위한 이 문서는 여전히 작업중입니다. 이 문서의 업데이트를 계속 지켜봐주십시오.
만약 에러를 발견한다면, let me know나에게 알려주십시오. 그러면 가능한한 빨리 그것을 수정할것입니다.
한글 번역에 관련된 부분은 한국어 번역자으로 알려주십시오.

Posted by 1010
반응형
style="word-break:break-all;" wrap="hard"

<table border="1" width="500">
<tr>
        <td style="word-break:break-all;" wrap="hard">efssssssssssssssssseffffffffsefsafefsaefsaefaseaesssssssssdrgsssssssssssssssssssssssssssssssssssssssss</td>
</tr>
</table>
Posted by 1010
반응형
사용자 삽입 이미지
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> New Document </TITLE>
<style type="text/css">
        #con{
                border:1px solid #c0c0c0;
        }
        ul#nav{
                margin:0; padding:0; list-style:none;
        }
        #nav li{
                margin:8px 0;
                padding-top: 1px;
                font: 11pt 굴림;
                color: #777;
                text-transform:uppercase;
                letter-spacing: 1px;
                background:url(bg_dotted.gif) repeat-x 0 77% !important;
                background-position:0 61%;
        }
        #nav li a{
                float: left;
                padding:1px 3px;
                background: #FFF;
                color:#777;
                text-decoration:none;
        }
        ul#nav li span{
                float:right;
                padding:1px 3px;
                background: #FFF;
        }
        ul#nav li br{
                clear:both;
        }
        #menu legend{
                font-size:11pt;
                font-weight:bold;
                color:#777;
                background-color:#EEEEEE;
                padding:2px 2px 2px 2px;
                border:1px solid #c0c0c0;
        }

</style>
</HEAD>

<BODY
>

<fieldset id="menu">
        <legend>Menu List</legend>
        <ul id="nav">
                <li><span>1</span><a href="#">Mome</a><BR /></li>
                <li><span>2</span><a href="#">My my my</a><BR /></li>
                <li><span>3</span><a href="#">Gallery</a><BR /></li>
                <li><span>4</span><a href="#">Programming</a><BR /></li>
                <li><span>5</span><a href="#">FreeBoard</a><BR /></li>
                <li><span>6</span><a href="#">Contact us</a><BR /></li>
        </ul>
</fieldset>


</BODY>
</HTML>
Posted by 1010
반응형
사용자 삽입 이미지

두 소스다 위 그럼처럼 같은 결과를 보여주긴 하지만..

1. 테이블인 경우

<TABLE
 width="400" border="0" cellpadding="0" cellspacing="0">
<TR>
        <TD colspan="2" width="400" height="50" bgcolor="#EEEEEE"></TD>
</TR>
<TR>
        <TD width="100" height="200" bgcolor="#C9C9C9"></TD>
        <TD width="300" height="200" bgcolor="#c0c0c0"></TD>
</TR>
<TR>
        <TD colspan="2" width="400" height="50" bgcolor="#9A9A9A"></TD>
</TR>
</TABLE>



2. div 와 css 를 이용한 경우

<style
 type="text/css">
#top{
        width:400px;height:50px;background-color:#EEEEEE;
}
#main_left{
        background-color:#C9C9C9;width:100px;height:200px;float:left;}
#main_right{
        width:300px;height:200px;background-color:#c0c0c0;float:left;
}
#bottom{
        width:400px;height:50px;background-color:#9A9A9A;clear:both;
}
</style>
<div id="top"></div>
<div id="main_left"></div>
<div id="main_right"></div>
<div id="bottom"></div>



div 인 경우 태그가 간결해지고 역활 분담이 확실해 져 있다.
그러나 습관은 무서운것..ㅡ,ㅡ;;;;
아직 테이블이..ㅋ.ㅋ


출처 : http://harogipro.tistory.com/110
Posted by 1010
반응형

css 로 텝메뉴를 만들어 주는 프로그램 입니다.
이건 뭐...ㅡ,ㅡ;;;




우선 위 파일을 다운받습니다. 혹은 아래 주소에서 다운받으시면 되고...
http://www.highdots.com/css-tab-designer/


압축을 풀고 프로그램을 실행해 보면 아래와 같은 화면이 나오네요. (크게보세요.)
사용자 삽입 이미지


마음에 드는 텝메뉴를 선택한 후에 아래 그림처럼 generate & HTML 을 누르면....
사용자 삽입 이미지



저장하라고 묻네요. 일단 저장을 하면...탭용 배경이미지와 html 파일이 하나 저장됩니다.
사용자 삽입 이미지


html 파일을 소스보기 해볼까요..
대략 이런 형태로 소스들이 만들어지네요.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
        <html xmlns="http://www.w3.org/1999/xhtml">
                <head>
                        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
                        <title>Free CSS Navigation Menu Designs 1 at exploding-boy.com</title>
                        <style type="text/css">
<!--
    body {
        margin:0;
        padding:0;
        font: bold 11px/1.5em Verdana;
}

h2 {
        font: bold 14px Verdana, Arial, Helvetica, sans-serif;
        color: #000;
        margin: 0px;
        padding: 0px 0px 0px 15px;
}

/*- Menu Tabs B--------------------------- */

    #tabsB {
      float:left;
      width:100%;
      background:#F4F4F4;
      font-size:93%;
      line-height:normal;
      }
    #tabsB ul {
        margin:0;
        padding:10px 10px 0 50px;
        list-style:none;
      }
    #tabsB li {
      display:inline;
      margin:0;
      padding:0;
      }
    #tabsB a {
      float:left;
      background:url("tableftB.gif") no-repeat left top;
      margin:0;
      padding:0 0 0 4px;
      text-decoration:none;
      }
    #tabsB a span {
      float:left;
      display:block;
      background:url("tabrightB.gif") no-repeat right top;
      padding:5px 15px 4px 6px;
      color:#666;
      }
    /* Commented Backslash Hack hides rule from IE5-Mac \*/
    #tabsB a span {float:none;}
    /* End IE5-Mac hack */
    #tabsB a:hover span {
      color:#000;
      }
    #tabsB a:hover {
      background-position:0% -42px;
      }
    #tabsB a:hover span {
      background-position:100% -42px;
      }

        #tabsB #current a {
                background-position:0% -42px;
        }
        #tabsB #current a span {
                background-position:100% -42px;
        }
-->
</style>
                </head>

                <body>
                        <h2>Tab Menu B</h2>
                        <div id="tabsB">
                                <ul>
                                        <!-- CSS Tabs -->
<li><a href="Home.html"><span>Home</span></a></li>
<li><a href="Products.html"><span>Products</span></a></li>
<li><a href="Services.html"><span>Services</span></a></li>
<li><a href="Support.html"><span>Support</span></a></li>
<li id="current"><a href="Order.html"><span>Order</span></a></li>
<li><a href="News.html"><span>News</span></a></li>
<li><a href="About.html"><span>About</span></a></li>

                                </ul>
                        </div>
                        <br /><br />
                </body>
</html>


간단히 텝디자인 만들때 쓸모있을 듯 합니다.

*  만드는 방법 *

파일 -> New Project  선택한후 마음에 드는 디자인 선택

사용자 삽입 이미지



+ 버튼을 눌러서 메뉴 추가

사용자 삽입 이미지


아래그림처럼 메뉴가 생겨납니다.
사용자 삽입 이미지



계속 메뉴를 만든후...

사용자 삽입 이미지



태그로 generate 하고 소스 직접 수정하면 됩니다. (주: 문자셋이 utf-8)










[공대여자는 이쁩니다. -_-b]
출처 : 공대여자님 홈페이지.
http://www.mins01.com/20070305/m_board/tech.php?b_id=tech&type=read&b_idx=306&page=10&period=730

출처 : http://www.highdots.com/css-tab-designer/
Posted by 1010
반응형
css 개발을 할 수 있는 프로그램입니다. 속성을 한눈에 볼 수 있어 좋네요. ^_^
아직 이것저것 만져보진 못했습니다만...-_-;;;





다운로드주소 : http://www.newsgator.com/Individuals/TopStyle/Default.aspx
Posted by 1010
반응형

모든 셀에 한꺼번에 바탕색 지정


원래는 <td> 태그마다, 즉 각 칸(셀)마다 스타일을 지정해 주어야 하더군요. 그러나 이러면 너무 번거로웠습니다.

또는
td { background-color:#FFDDDD; padding:10px; border:1px solid #ACB4F2; }

이렇게 하면 한꺼번에 셀의 스타일을 지정할 수 있긴 하지만, 이러면 그 페이지에 있는 모든 테이블의 셀이 획일적으로 지정되어 버리기에 문제가 있습니다. 특히 페이지에 광고가 있다면, 그 광고의 테이블 셀도 여기서 지정한 대로 변하기 때문에, 광고의 레이아웃이 이상하게 됩니다.


id 를 이용하면, 그 id에 해당되는 범위 내에서만, 셀의 배경색을 일괄적으로 지정할 수 있습니다.

우선 테이블 태그에 <table id="foo"> 이렇게 적당한 아이디(id)를 부여합니다. 단 아이디가 숫자로 시작하면 안되고, 한글이나 특수 기호가 포함되면 안되고, 중복되어서도 안됩니다. 한 HTML 페이지에 그 아이디는 단 하나뿐이어야 합니다. 즉 id="foo" 라는 아이디 정의가 다른 태그에도 있으면 안 됩니다. 무슨 아이디든 아이디는 고유해야 합니다.

#foo td { background-color:#FFDDDD; padding:10px; border:1px solid #ACB4F2; }


이 스타일 정의는, foo 라는 아이디를 가진 태그의 범위 내에 있는 모든 td 태그에 색을 지정하는 것입니다.




테이블 태그의 테두리 빈틈 없애기


<table> 태그에 style="border-collapse:collapse" 를 지정해 주면, td(셀)들 사이의 빈틈이 말끔히 없어집니다.




예제 코드:

<html>
<head>
<style type="text/css">

#foo td { background-color:#FFDDDD; padding:10px; border:1px solid #ACB4F2; }

</style>
</head>


<body>

<table id="foo" style="border-collapse:collapse">
  <tr><td>1번째 행의 1번째 칸</td> <td>1번째 행의 2번째 칸</td></tr>
  <tr><td>2번째 행의 1번째 칸</td> <td>2번째 행의 2번째 칸</td></tr>
  <tr><td>3번째 행의 1번째 칸</td> <td>3번째 행의 2번째 칸</td></tr>
</table>

</body>
</html>





위의 코드의 결과:

1번째 행의 1번째 칸 1번째 행의 2번째 칸
2번째 행의 1번째 칸 2번째 행의 2번째 칸
3번째 행의 1번째 칸 3번째 행의 2번째 칸


출처 : http://mwultong.blogspot.com/2006/06/html-css-td.html
Posted by 1010
반응형
Posted by 1010
반응형
XML 문서의 기본 구조

<?xml version="1.0" encoding="EUC-KR"?>

 

루트 엘리먼트로써 문서내에서 유일해야 하며, 나머지 구성요소는 루트 엘리먼트내에 위치해야 합니다.

<root></root>


루트 엘리먼트 자식 수준의 데이터를 xml문서라고 합니다.
        <name>홍길동</name>
        <age>30</age>
        <address>서울시 영등포구</address>

 


XML문서의 종료
    1. Well-Formed XML Document : XML 1.0 문법 준수
    2. Valid XML Document : DTD, Schema 문법 준수


 

인코딩
     1. ASCII : 7bit
     2. ISO Latin-1 : 8bit, 서유럽 문자코드 포함
     3. KS C5601 : 한국 공업표준, 2바이트 사용 -> 완성형 한글 표현
     4. EUC-KR : 영어(KS C5636) + 한글(KC C5601)
     5. Unicode
         1) UTF-8 : ASCII 문자(1바이트), 다른 문자(2바이트 이상), 한글 3바이트
         2) UTF-16 : 모든 문자 2바이트

 


엘리먼트 (Element)
   1. 시작태그와 끝태그는 항상 쌍을 이룹니다.
   2. 단독(빈)태그는 끝에 "/" 를 표시합니다.
   3. "<" 는 태그명으로 사용 불가능 합니다.
   4. "<" 와 ">" 사이에 공백사용이 불가능 합니다.
   5. 태그 중첩 사용이 불가능 합니다.
   6. 태그는 모든 문자로 시작 가능하지만, 숫자나 "." 사용 불가능 합니다.
   7. ":" 는 태그명으로 사용을 자제하는게 좋습니다.
   8. 대소문자를 구별합니다.

 


엘리먼트 (Element) 종류
   1. 내용을 가지는 Element (시작태그&끝태그)
       - <title>제목</title>
       - <head>
             <meta />
      </head>

   2. 내용을 가지지 않는 Element (시작태그) : 단독태그, 빈태그
       - <br />
       - <img />

   

 

엘리먼트 (Element)의 내용으로 올 수 있는 종류
    1. 문자 데이터
    2. 자식 엘리먼트
    3. 엔티티 & 문자참조 : <name>&nbsp;</name>

        ※ 문자 데이터와 엔티티는 전혀 틀리며, 이 때 name은 엔티티를 가진다고 합니다.
    4. CDATA Section : 해석되지 말아야 하는 데이터 집합으로 이 안에 태그등이 와도 태그로 인식하지 않습니다.
    5. 주석
    6. 공백 문자열 : 일반 문자 데이터와 틀립니다. (스페이스, 탭, 엔터 등)

 


속성 (Attribute)
   - 시작 엘리먼트에 포함되어야 합니다.
   - 속성명="속성값" or 속성명='속성값',
속성값은 " 나 ' 로 감싸줘야 합니다.
   - 속성명 명명법 : 엘리먼트명과 동일합니다

Posted by 1010
반응형

지각조퇴결석사유서.xml 문서 만들기

<?xml version="1.0" encoding="EUC-KR"?>
<?xml-stylesheet type="text/xsl" href="지각조퇴결석사유서.xsl"?>
<지각조퇴결석사유서>

 <과정>ASP.NET</과정>

 <기간>30일 완성</기간>
 <사유정보 번호="1">
  <성명>홍길동</성명>
  <주민번호>111111-1111111</주민번호>
  <구분 종류="지각"/>
  <날짜>2006.03.11</날짜>
  <사유>감기몸살로 -_-;;</사유>
 </사유정보>
 <사유정보 번호="2">
  <성명>아무게</성명>
  <주민번호>222222-2222222</주민번호 >
  <구분 종류="결석"/>
  <날짜>2006.04.15</날짜>
  <사유>
   <![CDATA[
   <strong>2007-06-28 12:30, coex megabox</strong><BR>
<BR>트렌스포머를 보러갔다.<BR>
<BR>처음부터 많은 기대를 하고 있었고 개방일만을 눈빠지게 기다리고 있던터라<BR>
<BR>개봉을 하자마자 달려가서 보았다.<BR>
<BR>아무튼 진부한 스토리라도 비주얼에 너무 정신을 빼앗기다 보니<BR>
<BR>스토리가 부실해도 상당히 재미있었다.<BR>
<BR>가장 기억에 남는 대사는 샘의 해피타임정도?<BR>]]>
  </사유>
 </사유정보>
 <사유정보 번호="3">
  <성명>테스트</성명>
  <주민번호>111111-1111111</주민번호>
  <구분 종류="지각"/>
  <날짜>2006.05.24</날짜>
  <사유>개인 사정</사유>
 </사유정보>
</지각조퇴결석사유서>


지각조퇴결석사유서.html 파일 만들기

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
  <script language="javascript">
   var xmlDoc;
   function startXml()
   {
    xmlDoc=new ActiveXObject("microsoft.XMLDOM");    
    xmlDoc.async=false;    
    xmlDoc.load("지각조퇴결석사유서.xml");
    document.getElementById("txtOutput").value=xmlDoc.xml;
   }
   
   function XmlInfo()
   {
    var result="";
    //루트 엘리먼트
    result += "Root Element : " + xmlDoc.documentElement.nodeName+"\n\n";
    //루트 엘리먼트의 첫번째 자식 엘리먼트
    result+="첫번째 자식 : "+xmlDoc.documentElement.firstChild.nodeName+"\n\n";
    //루트 엘리먼트의 마지막 자식 엘리먼트
    result+="마지막 자식 : "+xmlDoc.documentElement.lastChild.nodeName+"\n\n";
    //루트 엘리먼트의 두번째 자식 엘리먼트 (첫번째 방식)
    result+="두번째 자식 : "+xmlDoc.documentElement.childNodes.item(1).nodeName+"\n\n";
    //루트 엘리먼트의 두번째 자식 엘리먼트 (두번째 방식)
    result+="두번째 자식 : "+xmlDoc.selectNodes("//기간").item(0).nodeName+"\n\n";
    //사유정보 3번째의 이름 (첫번째 방식)
    result+="3번째 이름 : "+xmlDoc.documentElement.lastChild.firstChild.text+"\n\n";
    //사유정보 3번째의 이름 (두번째 방식)
    result+="3번째 이름 : "+xmlDoc.documentElement.childNodes(4).firstChild.text+"\n\n";
    //사유정보 3번째의 이름 (세번째 방식)
    result+="3번째 이름 : "+xmlDoc.selectNodes("//사유정보").item(2).firstChild.text+"\n\n";
    //사유 갯수
    result+="사유 갯수 : "+xmlDoc.selectNodes("//사유정보[구분 and @번호]").length+"개\n\n";
    //지각 갯수
    result+="사유 갯수 : "+xmlDoc.selectNodes("//구분[@종류='지각']").length+"개\n\n";
    //속성접근
    result+="2번째 종류 : "+xmlDoc.selectNodes("//사유정보").item(1).childNodes(2).attributes(0).value+"\n\n";

    alert(result);
   }  
  </script>
 </head>
 <body onload="startXml();">
  <h3>지각조퇴결석 사유서</h3>
  <textarea cols="120" rows="15" id="txtOutput"></textarea>
  <p></p>
  <button onclick="XmlInfo()" ID="Button1">XML 정보 보기</button>
 </body>
</html>

Posted by 1010
반응형

createElement.html 파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title></title>
  <script language="javascript">
   function Add()
   {
    var table1=document.getElementById("table1");
    var tr=document.createElement("tr");
    var td1=document.createElement("td");
    td1.innerText=document.all.txtName.value;
    var td2=document.createElement("td");
    td2.innerText=document.all.txtAddress.value;
   
    tr.appendChild(td1);
    tr.appendChild(td2);
    alert(table1.innerHTML);//테이블의 시작과 끝까지의 모든것.
    if(table1.firstChild.lastChild.childNodes.length==1)
    table1.firstChild.removeChild(table1.firstChild.lastChild);
    table1.firstChild.appendChild(tr);
   }
  </script>
 </head>
 <body>
  <h3>주소록</h3>
  <table border="1" width="300" id="table1">
   <tr>
    <th>이름</th>
    <th>주소</th>
   </tr>
   <tr>
    <td align="center" colspan="2">등록된 회원이 없습니다.</td>
   </tr>
  </table>
  <br />
  이름 : <input type="text" size="10" name="txtName" />
  주소 : <input type="text" size="10" name="txtAddress" />
  &nbsp;<button onclick="Add()">추가하기</button>
 </body>
</html>

Posted by 1010
반응형

cd.xml 파일 만들기

<?xml version="1.0" encoding="EUC-KR"?>
<compactdiscs>
 <compactdisc>
  <artist type="individual">OST</artist>
  <title numberoftracks="3">연애시대 OST</title>
  <tracks>
   <track>1. 첫번째 노래</track>
   <track>2. 두번째 노래</track>
   <track>3. 세번째 노래</track>
  </tracks>
  <price>9000</price>
 </compactdisc>
 <compactdisc>
  <artist type="band">코요테</artist>
  <title numberoftracks="5">코요테5집</title>
  <tracks>
   <track>1. 첫번째 노래</track>
   <track>2. 두번째 노래</track>
   <track>3. 세번째 노래</track>
   <track>4. 네번째 노래</track>
   <track>5. 다섯번째 노래</track>
  </tracks>
  <price>8000</price>
 </compactdisc>
 <compactdisc>
  <artist type="band">SeeYa</artist>
  <title numberoftracks="4">SeeYa2집</title>
  <tracks>
   <track>1. 첫번째 노래</track>
   <track>2. 두번째 노래</track>
   <track>3. 세번째 노래</track>
   <track>4. 네번째 노래</track>
  </tracks>
  <price>8500</price>
 </compactdisc>
</compactdiscs>


cdList.html 파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>  
  <title></title>
  <script language="javascript">
  function XmlInfo()
  {
   //XML로드
   var xmlDoc=new ActiveXObject("microsoft.XMLDOM");
   xmlDoc.async=false;
   xmlDoc.load("cd.xml");
   
   //원본 출력
   document.all.txtOut.value=xmlDoc.xml;
   
   //결과 출력(테이블)
   var result="";
   result+="<h3>CD List</h3>";
   result+="<table border='1'><tr><th>artist</th><th>title</th><th>tracks</th><th>price</th></tr>";
   
   //최상위 루트엘리먼트
   var root=xmlDoc.documentElement;
   
   for(i=0; i<root.childNodes.length; i++)
   {
    //artist
    result+="<tr><td>";
    result+=root.childNodes(i).childNodes(0).text+"<br/>";
    result+="("+root.childNodes(i).firstChild.attributes(0).value+")</td>";
   
    //title
    result+="<td>";
    result+=root.childNodes(i).childNodes(1).text+"<br/>";
    result+="("+root.childNodes(i).childNodes(1).attributes(0).value+")</td>";
   
    //tracks
    result+="<td>";
    var tracks=root.childNodes(i).childNodes(2);
    for(j=0; j<tracks.childNodes.length; j++)
    {
     result+=tracks.childNodes(j).text+"<br/>";//track    
    }
    result+="</td>";
   
    //price
    result+="<td>";
    result+=root.childNodes(i).lastChild.text;
    result+="</td>";
    result+="</tr>";
   }
   result+="</table>";
   iFrameDoc.document.write(result)
  }
  </script>
 </head>
 <body>
  <h3>CD.xml</h3>
  <textarea cols="80" rows="15" name="txtOut"></textarea>
  <p></p>
  <button onclick="XmlInfo()">DOM 표현 확인</button>
  <p></p>
  <iframe id="iFrameDoc" width="600" height="350"></iframe>

 </body>
</html>

Posted by 1010
반응형

imgDOM.html파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title></title>
  <script language="javascript">
   var num=1;
   var index=1;
     
   function Init()
   {
    document.onmousedown=Create;
    document.oncontextmenu=function(){return false;}
   }
   
   function Create()
   {
    if(event.button==1)
    {
     /*
     //1. CSS 이용
     document.getElementById("layer1").style.left=event.x - 25;
     document.getElementById("layer1").style.top=event.y - 25;
     document.getElementById("layer1").style.display="block";
     */

     
     //2. DOM 이미지 동적 생성 및 Body 추가
     var img=document.createElement("img");
     img.setAttribute("src","images/img"+num+".gif");//(속성명, 속성값)
     num++;
     if(num>7)num=1;
     img.style.position="absolute";
     img.style.left=event.x - 25;
     img.style.top=event.y - 25;
     document.body.appendChild(img);
    }
    else if(event.button==2)
    {
     if(document.body.childNodes.length>2)
      document.body.removeChild(event.srcElement);      
    }
    else if(event.button==4)
    {
     event.srcElement.style.zIndex=index;
     index++;
    }
   }

  </script>

 </head>
 <body onload="Init();">
  <div id="layer1" style="display:none;"><img src="images/img1.gif" /></div>
 </body>
</html>

Posted by 1010
반응형

createXML.html 파일 만들기

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title></title>
  <script language="javascript">
   function XMLCreate()
   {
    var xmlDoc=new ActiveXObject("microsoft.XMLDOM");
   
    //1. 선언문 <?xml version='1.0' encoding='euc-kr'?>
    var PInode=xmlDoc.createProcessingInstruction("xml", "version='1.0' encoding='euc-kr'");
   
    //2. 루트엘리먼트 <compactdiscs></compactdiscs>
    var rootNode=xmlDoc.createElement("compactdiscs");
   
    //3. 엘리먼트
    var compactdiscNode=xmlDoc.createElement("compactdisc");
    var titleNode=xmlDoc.createElement("title");
    var priceNode=xmlDoc.createElement("price");
   
    //4. 텍스트 노드
    var titleTextNode=xmlDoc.createTextNode("연애시대OST");
   
    var priceTextNode=xmlDoc.createTextNode("8000");
   
    //5. 구조화(트리구조)
    xmlDoc.appendChild(PInode);
    xmlDoc.appendChild(rootNode);
   
    rootNode.appendChild(compactdiscNode);
   
    compactdiscNode.appendChild(titleNode);
    compactdiscNode.appendChild(priceNode);
   
    titleNode.appendChild(titleTextNode);
    priceNode.appendChild(priceTextNode);
   
    //속성
    titleNode.setAttribute("numberoftracks", "3");
   
    //출력
    document.all.txtResult.value=xmlDoc.xml;
   
   }
  </script>
 </head>
 <body>
  <h3>XML 만들기</h3>
  <button onclick="XMLCreate()">만들기</button>
  <br/>
  <textarea cols="80" rows="20" name="txtResult"></textarea>
 </body>
</html>


Posted by 1010
반응형
2006/12/19 02:37
<!doctype html public "-//w3c//dtd xhtml 1.0 strict//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
<html>
<head>
<title> javascript와 xml을 이용한 트리만들기 </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script language="javascript">
<!--
   var XMLConst =
   {
       ELEMENT_NODE                    :1,
       ATTRIBUTE_NODE                    :2,
       TEXT_NODE                        :3,
       CDATA_SECTION_NODE                :4,
       ENTITY_REFERENCE_NODE            :5,
       ENTITY_NODE                        :6,
       PROCESSING_INSTRUCTION_NODE        :7,
       COMMENT_NODE                    :8,
       DOCUMENT_NODE                    :9,
       DOCUMENT_TYPE_NODE                :10,
       DOCUMENT_FRAGMENT_NODE            :11,
       NOTATION_NODE                    :12
   }
   var favoriteGen =
   {
       xmlDoc            : null,
       Tree    : null,

       importXML     : function()
       {
           
           if (document.implementation && document.implementation.createDocument)
           {
               xmlDoc = document.implementation.createDocument("", "", null);
               xmlDoc.onload = favoriteGen.generateXML;
           }
           else if (window.ActiveXObject)
           {
               xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
               xmlDoc.onreadystatechange = function () {
                   if (xmlDoc.readyState == 4) favoriteGen.generateXML()
               };
           }
           else
           {
               alert('브라우저가 스크립트를 지원하지 않습니다.');
           }
           
           xmlDoc.load("tree.xml");        
       },
       generateXML : function()
       {
           if(xmlDoc != null)
           {
               if(xmlDoc.hasChildNodes())
               {
                   var xChildNodes = "";
                   
                   // 이크.. 참.. 별게 다 틀리네.
                   if(document.all)
                       xChildNodes = xmlDoc.childNodes[1].childNodes;
                   else
                       xChildNodes = xmlDoc.childNodes[0].childNodes;

                   for(var i=0 ; i < xChildNodes.length ; i++)
                   {
                       var node = xChildNodes[i];
                       
                       if(node.nodeType == XMLConst.ELEMENT_NODE)
                       {
                           var title = getAttribute(node,"title");
                           
                           if(node.nodeName == "folder")
                           {
                               // recursive
                               var folderNode = getFolder("true",title);
                               favoriteGen.Tree.appendChild(folderNode);

                               favoriteGen.generateXML_R(node,folderNode);
                           }
                           else
                           {
                               var url = getAttribute(node,"url");
                               var docNode = getDoc(title,url);
                               favoriteGen.Tree.appendChild(docNode);
                           }
                       }
                   }
               }
           }
       },
       generateXML_R : function(pNode,pAppendNode)
       {
           if(pNode.hasChildNodes())
           {
               var xChildNodes = pNode.childNodes;

               for(var i=0 ; i < xChildNodes.length ; i++)
               {
                   var node = xChildNodes[i];
                   
                   if(node.nodeType == XMLConst.ELEMENT_NODE)
                   {
                       var title = getAttribute(node,"title");
                       
                       if(node.nodeName == "folder")
                       {
                           // recursive
                           var folderNode = getFolder("true",title);
                           pAppendNode.appendChild(folderNode);

                           favoriteGen.generateXML_R(node,folderNode);
                       }
                       else
                       {
                           var url = getAttribute(node,"url");
                           var docNode = getDoc(title,url);
                           pAppendNode.appendChild(docNode);
                       }
                   }
               }
           }
       }
   };
   function getFolder(pIsOpen,pText)
   {
       var div                 = document.createElement("div");
       
       var isOpenAtt            = document.createAttribute("isOpen");
       isOpenAtt.value            = "true";
       
       var classNameAtt        = document.createAttribute("class");
       classNameAtt.value        = "folder_node_visible";

       div.setAttributeNode(isOpenAtt);
       div.setAttributeNode(classNameAtt);
       
       /* IE 이상하네... attribute 등록으로 onClick event가 안먹네 */
       var spanHTML            = "<span class=\"folder_open\" onClick=\"setOpen(this);\">[폴더]" + pText + "</span>";
       
       div.innerHTML = spanHTML;

       return div;
   }
   function getDoc(pText,pUrl)
   {
       var div                 = document.createElement("div");
       
       var classNameAtt        = document.createAttribute("class");
       classNameAtt.value        = "doc_node_visible";
       
       div.setAttributeNode(classNameAtt);
       div.innerHTML            = "[문서]<a href=\"" + pUrl + "\">" + pText + "</a>";
       
       return div;
   }
   function setOpen(pObj)
   {
       var folderNode = pObj.parentNode;
       var isOpen = getAttribute(folderNode,"isOpen");
       
       if(folderNode.hasChildNodes())
       {
           var xChildNodes = folderNode.childNodes;

           for(var i=0 ; i < xChildNodes.length ; i++)
           {
               var node = xChildNodes[i];
               
               if(node.nodeType == XMLConst.ELEMENT_NODE)
               {
                   if(node.nodeName == "DIV")
                   {
                       var className = getAttribute(node,"class");
                       if(isOpen == "true")
                       {
                           if(className.substr(0,3) == "doc")
                               setAttribute(node,"class","doc_node_hidden");
                           else
                               setAttribute(node,"class","folder_node_hidden");
                       }
                       else
                       {
                           if(className.substr(0,3) == "doc")
                               setAttribute(node,"class","doc_node_visible");
                           else
                               setAttribute(node,"class","folder_node_visible");
                       }
                   }
               }
           }
       }
       setAttribute(pObj,"class",(isOpen=="true" ? "folder_closed" : "folder_open"));
       setAttribute(folderNode,"isOpen",(isOpen=="true" ? "false" : "true"));
   }

   function getAttribute(pNode,pAttributeName)
   {
       var attributes = pNode.attributes;

       var attNode = attributes.getNamedItem(pAttributeName);

       return attNode != null ? attNode.nodeValue: null;
   }
   function setAttribute(pNode,pAttributeName,pValue)
   {
       var attributes = pNode.attributes;

       var attNode = attributes.getNamedItem(pAttributeName);

       if(attNode != null)
           attNode.value = pValue;
   }

//-->
</script>
<style type="text/css" media="all">
.folder_node_visible
{
   margin-top:3px;
   margin-left:20px;
   display:block;
   font-size:12px;
}
.doc_node_visible
{
   margin-top:3px;
   margin-left:20px;
   padding:2px 2px 2px 20px;
   /*background:url("/image/doc.gif") no-repeat;*/
   cursor:pointer;
   display:block;
   font-size:12px;
}
.folder_node_hidden
{
   margin-left:20px;
   display:none;
   font-size:12px;
}
.doc_node_hidden
{
   margin-left:20px;
   padding:2px 2px 2px 20px;
   /*background:url("/image/doc.gif") no-repeat;*/
   cursor:pointer;
   display:none;
   font-size:12px;
}
.folder_closed
{
   padding:2px 2px 2px 20px;
   /*background:url("/image/closed.gif") no-repeat;*/
   cursor:pointer;
   display:block;
   font-size:12px;
}
.folder_open
{
   padding:2px 2px 2px 20px;
   /*background:url("/image/open.gif") no-repeat;*/
   cursor:pointer;
   display:block;
   font-size:12px;
}
</style>
</HEAD>

<BODY>
   <div id="treeView" name="treeView"></div>
   <script language="javascript">
       favoriteGen.Tree = document.getElementById("treeView");
       favoriteGen.importXML();
   </script>
</BODY>
</HTML>


tree.xml

<?xml version="1.0" encoding="utf-8" ?>
<tree>
   <folder title="포탈">
       <doc url="http://www.daum.net" title="다음"/>
       <doc url="http://www.naver.com" title="네이버"/>
       <doc url="http://yahoo.co.kr" title="야후"/>
       <doc url="http://empas.com" title="엠파스"/>
       <folder title="검색">
           <doc url="http://www.google.co.kr" title="구글"/>
       </folder>
   </folder>
   <doc url="http://mar.gar.in" title="마가린"/>
   <doc url="http://blog.mar.gar.in" title="마가린 블로그"/>
   <doc url="http://sodumarvin.tistory.com" title="소두마빈 블로그"/>
</tree>



출처 : http://sodumarvin.tistory.com/5
Posted by 1010