'03.HTML 4.X, HTML5, XML.../HTML/Css/Script'에 해당되는 글 196건

  1. 2008.10.19 prototype.js를 위한 개발자 노트
  2. 2008.10.19 ProtoType 정리
  3. 2008.09.25 지하철노선도
  4. 2008.09.03 셀렉트박스 모든것...
  5. 2008.09.03 html 다중 셀렉트 박스
  6. 2008.08.12 div 를 이용하여 가운데 배치하기
  7. 2008.08.12 Table 줄바꿈
  8. 2008.08.12 [css] 인쇄를 위한 스타일
  9. 2008.08.12 CSS & JAVASCRIPT 최적화 도구
  10. 2008.08.12 자바스크립트 그래프
  11. 2008.08.08 자바스크립트 튜토리얼 정리 끝
  12. 2008.08.07 textarea의 글자수와 라인수 제한
  13. 2008.08.07 자주 쓰이는 JavaScript
  14. 2008.08.07 자주쓰는 javascript StringUtil ver 1.0
  15. 2008.08.07 자바스크립트 자주쓰는 펑션들..
  16. 2008.08.07 IME MODE 1
  17. 2008.08.07 javascript 키코드
  18. 2008.08.07 내장 함수 parseInt()와 Number() 사용시 주의사항
  19. 2008.08.07 자바스크립트 강좌, 사용법, 객체, 이벤트 등 모든것
  20. 2008.08.07 Window 객체 속성[출처] 리플래시 인터발 |작성자 제로스엘
  21. 2008.08.07 DB에 정보를 읽어서 2초마다 화면에 뿌리기
  22. 2008.08.07 리플래시 인터발
  23. 2008.07.26 Internet Explorer 에서 Javascript 코드 디버깅 쉽게 하기
  24. 2008.07.25 prototype.js를 위한 개발자 노트
  25. 2008.07.25 Prototype.js를 제대로 사용하는 방법
  26. 2008.07.25 빠른 시간내 Prototype을 사용하기 위한 가이드 문서
  27. 2008.07.24 현재 웹페이지의 URL의 유효성 확인
  28. 2008.07.24 javascript 페이지이동명령어의 차이점
  29. 2008.07.18 [html] 자주 쓰는 테이블..
  30. 2008.07.11 체크박스 4천개 체크 시간 비교...
반응형
 
prototype.js를 위한 개발자 노트

1.5.0버전을 다룸

Sergio Pereira에 의해 작성됨
이동국에 의해 번역됨
최근 업데이트: 2007년 3월 4일

목차

Prototype은 무엇인가.?

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

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

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

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

toc

관련글

고급 자바스크립트 가이드

toc

유틸리티 함수들

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

toc

$() 함수 사용하기

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

DOM함수와는 달리 이 함수는 더 많은 작업을 수행한다. 반환된 element객체는 몇가지 추가적인 작업을 하게 될것이다. element를 숨기거나 보여주고 크기를 알아내며 element에 대해 스크롤을 하는 것과 같은 추가적인 많은 작업을 간단하게 만든다. Element 객체를 위한 참조문서에서 반환된 element객체에 추가된 메소드 목록을 얻을수 있다.

<html>
<head>
<title> Test Page </title>
<script src="prototype.js"></script>

<script>
	function test(){
		var d = $('myDiv');
		alert(d.innerHTML);
		d.hide();
		d.show();
		d.addClassName('active');
	}
</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="Test $()" onclick="test();"/><br/> 

</body>
</html>

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

toc

$$() 함수 사용하기

$$() 함수는 내용물에서 CSS를 일관되게 분리할때 많이 도와줄것이다. 하나 이상의 CSS필터링 표현식을 파싱한다면, CSS 룰을 정의하기 위해 사용되는 것과 유사하고 이러한 필터에 일치하는 요소를 반환한다.

이 함수는 터무니 없을 정도로 사용하기가 쉽다. 체크해보라.

<script>
function test$$(){
	/*
	  in case CSS is not your forte, the expression below says
	  'find all the INPUT elements that are inside 
	  elements with class=field that are inside a DIV
	  with id equal to loginForm.'
	*/
	var f = $$('div#loginForm .field input');
	var s = '';
	for(var i=0; i<f.length; i++){
		s += f[i].value + '/';
	}
	alert(s); // shows: "joedoe1/secret/"
	
	//now passing more than one expression
	f = $$('div#loginForm .field input', 'div#loginForm .fieldName');
	s = '';
	for(var i=0; i<f.length; i++){
		s += ( f[i].value ? f[i].value : f[i].innerHTML ) + '/';
	}
	alert(s); //shows: "joedoe1/secret/User name:/Password:/"
}


</script>

<div id='loginForm'>
	<div class='field'>
		<span class='fieldName'>User name:</span>
		<input type='text' id='txtName' value='joedoe1'/>
	</div>
	<div class='field'>
		<span class='fieldName'>Password:</span>
		<input type='password' id='txtPass' value='secret' />
	</div>
	<input type='submit' value='login' />
</div> 
<input type=button value='test $$()' onclick='test$$();' />
			

성능에 대한 빠른 노트. prototype.js에서 $$() 함수의 현재 구현체는 특별히 효과적으로 여겨지지 않는다. 이 함수를 자주 사용하여 복잡한 HTML문서를 처리하고자 계힉중이라면, 가능한 $$()함수 자체를 대체하는 다른 구현체를 고려하고자 할것이다.

toc

$F() 함수 사용하기

$F() 함수는 다른 단축키이다. 이것은 텍스트 박스나 드랍다운 리스트와 같은 어떤 필드의 입력 컨트롤의 값을 반환한다. 이 함수는 요소 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 클래스를 위한 확장과 조합된 이 함수는 열거가능한 리스트를 Array 객체로 변환하거나 복사하는 것을 더욱 쉽게 만든다. 예를 들면, 작성한 함수는 인자의 수를 유연하게 받아들인다. 여기서 추천되는 사용법은 DOM NodeLists를 좀더 효과적으로 처리할수 있도록 일반적인 배열로 변환하기 위해 사용하는 것이다. 아래의 예제를 보라.

<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() 함수 사용하기

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

String을 향상시키기

String은 강력한 객체이다. Prototype.js는 그 강력함을 가지고 있으며 다른 방법으로 그 강력함을 향상시킨다.

문자열 대체

문자열 대체를 사용할때 자바스크립트는 이미 String.Replace와 같은 메소드를 제공하고 있다. 정규표현식으로 작동하지만 prototype.js에서 소개한 대체 함수만큼 유연하지는 않다.

새로운 String.gsub 메소드를 사용해보라. 이 메소드를 사용하면 고정 문자열이나 정규 표현식 패턴을 찾고 변경할수 있을 뿐 아니라 교체를 넘어서는 더 많은 제어를 하게 된다. 예를 들어 찾은 요소를 변형하고자 하는 방법을 메소드에 지시하도록 문자열 템플릿을 사용할수 있다.

아래의 예제는 't'를 포함하는 단어를 찾고 그 위치에 'tizzle' 로 변경하는 것이다. 이 예제의 경우 명확하게 설명되지는 않는다. 우리가 선택한 정규 표현식인 괄호안의 \w+은 그룹 선언을 가져온다. 대체 템플릿 문자열로 #{1}를 사용하여 이 그룹에 의해 해당되는 값을 가져올수 있다.

예제에서 우리는 't'앞의 문자들을 가져와서 'tizzle'를 뒤에 붙인다. 정규 표현식으로 더 많은 찾을 수 있다면, #{2}, #{3} 등등을 사용하여 값을 가져올것이다.

<script>
function talkLikeYouKnowSomething(){
	var s = 'prototype string extensions can help you';
	var snoopdogfy = /\b(\w+)t\w+\b/;
	var snooptalk = s.gsub(snoopdogfy, '#{1}tizzle' );
	alert(snooptalk); // shows: "prototizzle stizzle extizzle can help you"				
}
</script>
			

여기서 멈추지 말자. 우리가 만든 대체기능은 패턴에 일치하면 대체하는데 제한되기 때문에 그다지 강력하다고 보기 힘들다. 그렇다면 원하는 대체 값을 만들기 위해 사용자 정의 로직에 일치하는 작업을 할수 있을까.? gsub에 두번째 인자로 함수를 넘길수 있다면 그렇게 할수 있을것이다. 여기서 인자로 넘기는 함수는 일치하는 텍스트를 가진 배열(인덱스값이 0)을 받고 어떤 그룹값(인덱스값이 1에서 N)을 가져올것이다.

<script>
function scamCustomers(){
	var prices = 'book1 $12.5, magazine $5.50, pencil $1.20';
	var priceFinder = /\$([0-9\.]+)/;
	var r = prices.gsub(priceFinder, jackUp);
	alert(r);//shows: "book1 $13.75, magazine $6.05, pencil $1.32"
}
	
function jackUp(matches){
	//increases the prices by 10%
	var price = parseFloat(matches[1]);
   	return '$' + Math.round(110 * price)/100;
}
</script>
			

문자열 템플릿

애플리케이션에 자바스크립트 코드의 양이 증가하는 만큼, increasingly you'll find yourself with collections of objects of the same type and that you need to list or present in a formatted way.

애플리케이션에서 객체 리스트를 통해 루프를 처리하고 객체 프라퍼티와 몇가지 고정된 형태의 요소에 기초하여 문자열을 만드는 코드를 찾는것이 드물게 발생하지는 않는다. Prototype.js는 이러한 타입의 시나리오를 다루는데 도움을 주는 Template class를 가진다.

아래의 예제는 다중 HTML라인에서 장바구니에 있는 항목 리스트를 형상화하는 방법을 보여준다.

<script>
function printCart(){
	//creating a sample cart
	var cart = new Object();
	cart.items = [ ];
	//putting some sample items in the cart
	cart.items.push({product: 'Book 123', price: 24.50, quantity: 1});
	cart.items.push({product: 'Set of Pens', price: 5.44, quantity: 3});
	cart.items.push({product: 'Gift Card', price: 10.00, quantity: 4});
	
	//here we create our template for formatting each item
	var itemFormat = new Template(
			'You are ordering #{quantity} units ' + 
			'of #{product} at $#{price} each'
			);
	var formatted = '';
	
	for(var i=0; i<cart.items.length; i++){
		var cartItem = cart.items[i];
		formatted += itemFormat.evaluate(cartItem) + '<br/>\n';
	}
	
	alert(formatted);
	/* SHOWS:
	You are ordering 1 units of Book 123 at $24.5 each<br/>
	You are ordering 3 units of Set of Pens at $5.44 each<br/>
	You are ordering 4 units of Gift Card at $10 each<br/>
	*/
}
</script>
			

새로운 메소드 목록에 대한 좀더 완전한 정보를 보기 위해서는 문자열 확장 참조를 보라.

toc

Ajax 객체

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

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

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

toc

Ajax.Request 클래스 사용하기

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

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

당신이 다음처럼 XML응답을 반환하는 http://yourserver/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) 프라퍼티를 체크할것이다. 몇가지 스크립트나 JSON형태의 데이터를 반환하고자 한다면 X-JSON 헤더가 유용하다.

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

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

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>
	

좀더 완전한 설명을 보기 위해서, 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.Updater 참조문서options 참조문서를 보라.

toc

What are all those "?" and squares?

So you went and wrote some quick test scripts to update your pages using the Ajax.Updater object and it all worked fine. Life was good until you ran your scripts against real data. All of a sudden the updated text was displayed with question marks or unprintable character symbols where the non-English characters should be.

Your first suspect is prototype.js, Of course, it seemed too easy to be true. But don't blame the library just yet. Ask yourself how much you really understand character encoding, code pages, and how the browser deals with it. If you have a positive answer then I bet you are on your way to fix the problem. If you are among the other 80% (another useless, imprecise author's estimate) of web developers that take character encoding for granted, keep reading.

I won't pretend to be an authority on the topic, much less give you a complete explanation of how this is best handled. Instead you go straight to the solution that I use and provide hints on how this could be fixed in your own scenario.

Simply put, the solution revolves around the following statement: Serve what the browser is expecting you to serve. If we are going to update the page with text that contains Unicode/UTF-8 characters then we better make the browser aware of that.

Let's start with the simple case when you are just updating the page with text from a static HTML file that resides on your server. When you created that file, depending on which text editor you employed, it is very possible that the file was saved in ANSI (or better said, non-Unicode) format. This is the default for many text editors, especially source code editors, because the file size will be smaller and it's rather unusual to edit source code with Unicode characters in it.

Suppose you have the following file named static-content.html on your server. You saved this file saved in ANSI format.

<div>
	Hi there, José. Yo no hablo español.
</div>

Your main page updates itself using something like the snippet below.

<script>
	function updateWithFile(){
		var url = 'static-content.html';
		var pars = '';
		var myAjax = new Ajax.Updater(
				'placeholder', url, 
				{method: 'get', parameters: pars});
	}
</script>
<div id="placeholder">(this will be replaced)</div>
<input id="btn" value="Test With Static File" 
                 onclick="updateWithFile()" type="button"/>

When you click the button the static file is retrieved but the non-English characters are replaced by question marks or some other symbol. The displayed text will look similar to "Hi there, Jos?. Yo no hablo espa?ol." or "Hi there, Jos?Yo no hablo espa?", depending on your browser.

In this case, the solution is straightforward, simply save the static file in an appropriate format. Let's save it in UTF-8 and run the script again (any decent text editor will have an option in the Save As dialog.) You should now see the correct text (if not, your browser may have cached the old version, try using a different file name.)

If the HTML that you are serving is not static, if it is being dynamically generated by some application framework (like ASP.NET, PHP, or even Perl,) make sure the code that generates this HTML is producing the text in the appropriate encoding and code page, and include in the HTTP response headers one header that informs this. Each platform has a different way to achieve this, but they are very similar.

For example, in ASP.NET you can set this globally in your web.config file and the default configuration is good enough to avoid this problem in the first place. You should already have the following section in your web.config.

<globalization requestEncoding="utf-8" responseEncoding="utf-8" />

고전적인 ASP 3.0에서 다음의 코드를 사용하여 이 문제를 해결할수 있다.

Response.CodePage = 65001
Response.CharSet = "utf-8" 

PHP에서 응답 헤더를 추가하기 위한 문법은 다음과 같을것이다.

<?php header('Content-Type: text/html; charset=utf-8'); ?>

어떤 경우에는, 당신이 생각하는 목표가 응답 메시지에 다음 HTTP 헤더를 보내는 것이다.

Content-Type: text/html; charset=utf-8 

위 예제에서는 UTF-8을 사용했지만 다른 셋팅이 필요하다면 쉽게 바꿀수 있다.

열거(Enumerating)...

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

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

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

toc

루프, 루비-스타일

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

<script>
	function showList(){
		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Maggie'];
		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', 'Maggie'];
		simpsons.each( function(familyMember){
			alert(familyMember);
		});
	}
			

당신은 특이한 문법으로 별로 좋지않다고 생각할지도 모른다. 위 예제에서, 엉망으로 만드는 것은 아무것도 없다. After all, there's not much to be changed in such a drop-dead-simple example. But keep reading, nonetheless.

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){
			//we'll just assume for now that external links
			// do not have a '#' in their url
			return link.href.indexOf('#') >= 0;
		});
		//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 의 값을 반환
keys(targetObj) static targetObj: 객체 모든 프라퍼티의 이름과 주어진 객체의 메소드를 가진 Array를 반환
values(targetObj) static targetObj: 객체 모든 프라퍼티의 값과 주어진 객체의 메소드를 가진 Array를 반환
clone(targetObj) static targetObj: 객체 targetObj의 얕은(shallow) 복사물을 반환

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 [, arg1 [, arg2 [...]]]) instance object: 메소드를 소유하는 객체 함수(=메소드) 소유자 객체로 미리 묶는 함수의 인스턴스를 반환. 반환된 함수는 원래의 것과 같은 인자를 가질것이다.
bindAsEventListener(object [, arg1 [, arg2 [...]]]) 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, ' from checkbox');
			
	   },

	   showMessage: function(evt, extraInfo) {
		  alert(this.message + ' (' + evt.type + ')' + extraInfo);
	   }
	};


	var watcher = new CheckboxWatcher('myChk', 'Changed');
</script>

			

toc

String 클래스를 위한 확장

메소드 종류 인자 상세설명
camelize() instance (none) -(하이픈)으로 분리된 문자열을 camelCaseString으로 변환하기. 이 함수는 예를 들면, 프라퍼티 스타일을 다루는 코드를 작성할때 유용하다.
capitalize() instance (none) 첫번째 글자를 대문자로 변환
dasherize() instance (none) '_' 기호를 '-' 기호로 대체
escapeHTML() instance (none) HTML마크업 문자들이 escaped된 문자열 반환
evalScripts() instance (none) 문자열내에서 발견되는 각각의 <script />블럭을 평가하기
extractScripts() instance (none) 문자열내에서 발견되는 모든 <script />블럭을 포함하는 Array객체 반환
gsub(pattern, replacement) instance pattern: 검색하는 문자열이나 정규 표현식 replacement: 간단한 문자열, 템플릿 문자열 또는 대체물을 만들기 위한 Function(strings[]) 현재 문자열에서 패턴 문자열을 찾은 결과의 문자열을 반환하고 대체 문자열이나 패턴에 일치하는 문자열을 가진 배열을 전달하는 대체함수를 호출한 결과로 대체한다. 대체물이 문자열일때, #{n}과 같은 특별한 템플릿 형태의 토큰을 포함할수 있다. 여기서 n이라는 값은 정규표현식 그룹의 인덱스이다. #{0}는 완전히 일치하면 대체될것이고 #{1}는 첫번째 그룹, #{2}는 두번째이다.
parseQuery() instance (none) toQueryParams()와 같음.
scan(pattern, replacement) instance pattern: 검색하는 문자열이나 정규 표현식. replacement: 반복을 통해 일치하는지 보는 Function(strings[]) 반복을 통해 문자열이 일치하는 패턴을 찾기 위한 방법을 제공한다. pattern인자는 문자열이나 RegExp가 될수 있지만 RegExp는 좀더 유용하다. 유사하게도 replacement인자는 문자열이나 함수가 될수 있지만 유용한것을 만들수 있도록 함수에 전달하는것이 좋다.
strip() instance (none) 문자열의 앞뒤로 공백 없는 문자열을 반환
stripScripts() instance (none) 삭제된 <script /> 블럭을 가진 문자열을 반환
stripTags() instance (none) HTML이나 XML태그가 삭제된 문자열을 반환
sub(pattern, replacement [, count]) instance pattern: 검색하는 문자열이나 정규 표현식. replacement: 문자열 또는 대체물을 만드는 Function(strings[]) count: 숫자나 대체물 - 디폴트는 1 gsub와 매우 유사하지만 count파라미터로 지정되는 대체물의 수에 제한이 있다
toArray() instance (none) 문자열을 이것의 문자들의 Array로 쪼개기
toQueryParams() instance (none) 쿼리문자열(querystring)을 파라미터 이름에 의해 인덱스화되는 결합된 Array로 쪼개기
truncate(length [, truncation]) instance length: 결과 문자열의 최대 길이 truncation: 결과 문자열의 마지막 글자를 대체하기 위해 사용되는 문자열 - 디폴트는 '...' 최대 길이의 문자열을 만들기 위해 사용. 문자열이 최대 길이를 유지하기 위해 짤릴필요가 있을 경우, truncation인자의 텍스트는 마지막의 몇개의 글자를 대체하기 위해 사용된다. (이를테면.: var s='123456790'; alert(s.truncate(5)); //displays '12...' )
underscore() instance (none) CamelizedStringValue를 uderscore_formatted_string로 변환. (이를테면.: var s='Namespace::MyClass123'; alert(s.underscore()); //displays 'namespace/my_class123' ). 이 함수는 루비 온 레일즈 기능에서 직접 대상이 될것처럼 보인다.
unescapeHTML() instance (none) escapeHTML()의 반대

toc

Array 클래스를 위한 확장

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

메소드 종류 인자 상세설명
clear() instance (none) 배열을 비우고 자체를 반환한다.
compact() instance (none) null 이거나 undefined인 요소를 제외하고 배열을 반환한다. 이 메소드는 배열자체를 변경하지 않는다.
first() instance (none) 배열의 첫번째 요소를 반환한다.
flatten() instance (none) 기복이 없고, 1차원의 배열을 반환한다. 이 함수는 배열이고 반환된 배열내 요소를 포함하는 배열의 각 요소를 찾음으로써 수행된다.
indexOf(value) instance value: what you are looking for. 배열에서 찾아진다면 주어진 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: 배열내 존재한다면 제외될 값 인자의 리스트에 포함된 요소를 제외한 배열을 반환. 이 메소드는 배열 자체를 변경하지는 않는다.

이 메소드들을 사용하는 것을 보자.

<script>
var A = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']"
var B = A.without('e','f');
alert(B.inspect()); // "['a', 'b', 'c', 'd', 'g', 'h']"
alert(A.inspect()); // did not change A: "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']"
A.push(null);
A.push('x');
A.push(null);
A.push('y');
alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', null, 'x', null, 'y']"
A = A.compact();
alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'x', 'y']"
var e = A.shift();
alert(e); // "a" 
alert(A.inspect()); // "['b', 'c', 'd', 'e', 'f', 'g', 'h', 'x', 'y']"
alert(A.indexOf('c')); // 1
alert(A.first()); // 'b'
alert(A.last()); // 'y'
A.clear();
alert(A.inspect()); // "[]"
A = ['a', 'b', 'c'];
B = A.reverse(false);
alert(B.inspect()); // "['c', 'b', 'a']"
alert(A.inspect()); // A left untouched: "['a', 'b', 'c']"
A.reverse(true);
alert(A.inspect()); // "['c', 'b', 'a']"	
A = ['a', 'b',  ['c1','c2','c3'] , 'd',  ['e1','e2']  ];
B = A.flatten();
alert(B.inspect()); // "['a','b','c1','c2','c3','d','e1','e2']"		
alert(A.inspect()); // unchanged: "['a','b',['c1','c2','c3'],'d',['e1','e2']]"		
</script>
			

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: Event객체 이벤트를 일으키는 요소를 반환
isLeftClick(event) static event: Event객체 마우스 왼쪽 버튼을 클릭시 true값 반환
pointerX(event) static event: Event객체 페이지에서 마우스 포인터의 x측 좌표값 반환
pointerY(event) static event: Event객체 페이지에서 마우스 포인터의 y측 좌표값 반환
stop(event) static event: Event객체 이벤트의 디폴트 행위를 취소하고 위임을 연기하기 위해 이 함수를 사용
findElement(event, tagName) static event: 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: 이벤트 명 (like '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', page_loaded, false);

	function page_loaded(evt) {
	  Event.observe('parent_node', 'click', item_clicked, false);
	}
	
	function item_clicked(evt){
		var child = Event.element(evt);
		alert('The child node with id=' + child.id + ' was clicked');
		Event.stop(evt); //avoid another call related to 'parent_node' itself
	}
</script>	
...
<div id="parent_node">
	<div id="child1">First</div>
	<div id="child2">Second</div>
	<div id="child3">Third</div>
</div>		
			

toc

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

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

toc

PeriodicalExecuter 객체

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

메소드 종류 인자 상세설명
[ctor](callback, interval) constructor callback: 오직 인자로 PeriodcalExecuter 객체 자체가 전달될 함수, interval: 초단위 시간간격 함수를 반복적으로 호출할 이 객체의 하나의 인스턴스를 생성
registerCallback() instance (none) 타이머를 다시 셋팅한다.
stop() instance (none) 타이머를 취소하고 콜백 실행을 하지 않도록 한다.
onTimerEvent() instance (none) 타이머가 호출하는 메소드. 순차적으로 객체 자체를 전달하는 콜백 메소드를 호출할것이다.
프라퍼티 타입 상세설명
callback Function(objExecuter) 호출되기 위한 함수. objExecuter: PeriodcalExecuter가 호출을 만든다.
timer Timer 콜백 메소드를 반복적으로 호출하기 위해 타이머 객체를 다룬다.
frequency Number 이것은 수초내 간격으로 실질적으로 작용
currentlyExecuting Boolean 만약 함수 호출이 진행중이라면 표시

toc

Prototype 객체

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

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

toc

Enumerable 객체

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

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

프라퍼티 타입 상세설명
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를 반환하는 요소가 없다면, detectnull을 반환한다.
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를 반환한다.
inGroupsOf(number, fillWith) instance number: 그룹별 타이머의 수, fillWith: 빈 공간을 채울 필요가 있는 값 첫번째 인자로 지정된 만큼의 항목을 포함하는 그룹별 collection을 반환. 초기 collection의 항목수가 첫번째 인자로 주어진 숫자로 나누어지지 않는다면, 마지막 그룹의 끝에 빈 항목이 null로 채워지거나 두번째 인자값으로 채워진다. 예를 들면, ['a','b','c','d'].inGroupsOf(3,'?')[ ['a','b','c'] , ['d','?','?'] ]를 생성한다.
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호출의 가장 큰 결과를 반환한다.
member(obj) instance obj: any object 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 object 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 implementation
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헤더의 컨텐츠를 평가하기 위해 내부적으로 호출된다.
evalResponse() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. AJAX응답이 text/javascriptContent-type헤더를 가진다면, 응답 몸체는 평가되고 이 메소드는 사용될것이다.
header(name) instance name: HTTP header name 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX응답의 HTTP헤더의 컨텐츠를 가져오기 위해 내부적으로 호출된다.
onStateChange() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX호출 상태 변경시 객체 자체에 의해 호출된다.
request(url) instance url: url for the AJAX call 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 생성자를 호출하는 동안 벌써 호출되었다.
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, Object) undefined 각각의 이벤트/상태가 AJAX호출이 발생하는 동안 도착할때 호출될 사용자정의 함수. 이 옵션에는 "XXXXXXXX"를 위해 Ajax.Request.Events, 와 HTTP status codes의 상태중에 다양한 대안이 있다. 예를 들어 var myOpts = {onComplete: showResponse, onLoaded: registerLoaded};. 사용되는 함수는 AJAX작업과 평가된 X-JSON응답 HTTP헤더를 포함하는 인자를 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
onSuccess Function(XMLHttpRequest, Object) undefined AJAX호출이 성공적으로 완성될때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
onFailure Function(XMLHttpRequest, Object) undefined AJAX호출이 에러를 가진채 끝날때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
onException Function(Ajax.Request, exception) undefined 유효하지 않은 응답이나 유효하지 않은 인자와 같이 예외적인 조건이 클라이언트 측 AJAX호출에서 발생했을때 호출될 사용자정의 함수. 사용된 함수는 AJAX작업을 포장하는 Ajax.Request 객체와 exception객체를 포함하는 두개의 인자를 받을것이다.
insertion an Insertion class undefined 새로운 내용이 삽입될 방법을 판단할 클래스. Insertion.Before, Insertion.Top, Insertion.Bottom, 또는 Insertion.After가 될수 있다. Ajax.Updater객체에만 적용한다.
evalScripts Boolean undefined, false 스크립트 블럭이 응답이 도착했을때 평가할지를 판단. Ajax.Updater객체에만 적용 objects.
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 container:이것은 요소의 id, 요소객체 자체, 또는 두개의 프라퍼티(AJAX호출이 성공할때 사용될 object.success 요소(나 id), AJAX호출이 실패할때 사용할 object.failure 요소(나 id))를 가지는 객체가 될수 있다. url: 가져오기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성
start() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것의 정기적인 작업 수행을 시작하기 위해 객체 자체에 의해 호출된다.
stop() instance (none) 주기를 가지는 작업 수행을 종료하도록 한다. 종료후, 객체는 onComplete 옵션에 주어진 콜백을 호출할것이다.
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 클래스명을 표시하는 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명을 가진다면 true를 반환
hide(element) instance element: 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(element) instance element: element 객체 또는 아이디 style.display''로 다시 셋팅하여 각각의 요소를 보여준다.
toggle(element) instance element: element 객체 또는 아이디 각각의 전달된 요소의 가시성(visibility)을 토글(toggle)한다.
undoClipping(element) instance element: element 객체 또는 아이디
undoPositioned(element) instance element: element 객체 또는 아이디 element의 style.position''으로 초기화
update(element, html) instance element: element 객체 또는 아이디, html: html content 주어진 html인자를 가지는 요소의 내부 html을 대체. 주어진 html이 <script>블럭을 포함한다면, 그것들은 포함되지는 않지만 평가될것이다.
visible(element) instance element: element 객체 또는 아이디 요소가 눈에 보이는지 표시하는 Boolean값을 반환

toc

Element.ClassNames 클래스

Enumerable로 부터 상속

element에 관련된 CSS 클래스명의 collection을 표시

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

toc

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 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 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 객체

This object provides some utility functions for working with input fields in forms.

메소드 종류 인자 상세설명
activate(field) instance field: field element 객체 또는 아이디 포커스를 이동하고 텍스트 선택을 지원하는 field내 값을 선택
clear(field) instance field: field element 객체 또는 아이디 field요소로부터 각각 전달된 값을 지움(clear)
disable(field) instance field: field element 객체 또는 아이디 폼 필드 요소를 사용하지 못하도록 만든다. 요소 객체를 반환한다.
enable(field) instance field: field element 객체 또는 아이디 폼 필드 요소를 사용가능하도록 만든다. 요소 객체를 반환한다.
focus(field) instance field: field element 객체 또는 아이디 주어진 폼 field로 입력 포커스 이동
getValue(field) instance field: field element 객체 또는 아이디 필드에 입력되거나 선택된 값을 반환한다.
present(field) instance field: field element 객체 또는 아이디 모든 폼 field가 빈값이 아니라면 true를 반환
select(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 반환. 선택적으로 목록은 요소의 type이나 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: 요소가 변경될때 호출되는 함수 요소를 모니터링할 객체 생성
getValue() instance, abstract (none) 클래스는 요소에서 모니터링이 되는 현재값이 무엇인지 판단하기 위햔 메소드를 구현해야만 한다.
registerCallback() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소 모니터링릉 시작하기 위한 객체 자체에 의해 호출된다.
onTimerEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소를 체크하기 위해 정기적으로 객체 자체에 의해 호출된다.
Property Type Description
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: 초단위 간격, callback: 요소가 변경될때 호출되는 함수 Abstract.TimedObserver으로부터 상속. 요소의 value프라퍼티를 모니터링할 객체를 생성.
getValue() instance (none) 요소의 값을 반환

toc

Form.Observer 클래스

Abstract.TimedObserver로 부터 상속

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

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

toc

Abstract.EventObserver 클래스

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

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

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

메소드 종류 인자 상세설명
[ctor](element, callback) constructor element: element 객체 또는 아이디, callback: function to be called when the event happens 요소를 모니터링할 객체 생성.
getValue() instance, abstract (none) 클래스는 요소에서 모니터링이 되는 현재값이 무엇인지 판단하기 위햔 메소드를 구현해야만 한다.
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: 이벤트가 발생할때 호출될 함수 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' or 'horizontal', element: object within()은 이 메소드가 호출되기 전에 호출될 필요가 있다. 이 메소드는 요소에서 겹치는 것을 조정하는 세분화정도를 표현하는 0.0과 1.0사이의 10진수를 반환할것이다. 예를 들면, 만약 요소가 100px를 가지는 정사각형 DIV이고 (300,300)에 위치한다면, within(divSquare, 330, 330); overlap('vertical', divSquare);는 0.70을 반환해야만 한다. 이 값이 의미하는 것은 DIV의 아래쪽 경계에서 70%(100px - 30px = 70px)를 표시하는 지점이라는 것이다. 이해하기 가장 쉬운 방법은 다른 사각형의 위-왼쪽 구석처럼 주어진 쌍을 생각하는 것이다. 숫자값은 겹치는 넓이와 높이의 퍼센트값일 것이다.
clone(source, target) instance source: element 객체 또는 아이디, target: element 객체 또는 아이디 source요소에 대해 똑같이 target요소의 크기를 다시 조정하고 다시 위치를 지정

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

Posted by 1010
반응형

<!--
/******************************************************************************
* prototype 모음
*****************************************************************************/

//-----------------------------------------------------------------------------
// 문자 앞 뒤 공백을 제거 한다.
//-----------------------------------------------------------------------------
String.prototype.trim = function() {
return this.replace(/(^\s*)|(\s*$)/g, "");
}

//-----------------------------------------------------------------------------
// 내용이 있는지 없는지 확인하다.
//
// @return : true(내용 있음) | false(내용 없음)
//-----------------------------------------------------------------------------
String.prototype.notNull = function() {
return (this == null || this.trim() == "") ? false : true;
}

//-----------------------------------------------------------------------------
// 메일의 유효성을 체크 한다.
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.mail = function() {
var em = this.trim().match(/^[_\-\.0-9a-zA-Z]{3,}@[-.0-9a-zA-z]{2,}\.[a-zA-Z]{2,4}$/);
return (em) ? true : false;
}

//-----------------------------------------------------------------------------
// 주민번호 체크 XXXXXX-XXXXXXX 형태로 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.jumin = function() {
var num = this.trim().onlyNum();
if(num.length == 13) {
num = num.substring(0, 6) + "-" + num.substring(6, 13);
}
else {
return false;
}
num = num.match(/^([0-9]{6})-?([0-9]{7})$/);
if(!num) return false;
var num1 = RegExp.$1;
var num2 = RegExp.$2;
if(!num2.substring(0, 1).match(/^[1-4]{1}$/)) return false;
num = num1 + num2;
var sum = 0;
var last = num.charCodeAt(12) - 0x30;
var bases = "234567892345";
for (i=0; i<12; i++) {
sum += (num.charCodeAt(i) - 0x30) * (bases.charCodeAt(i) - 0x30);
}
var mod = sum % 11;
return ((11 - mod) % 10 == last) ? true : false;
}

//-----------------------------------------------------------------------------
// 사업자번호 체크 XXX-XX-XXXXX 형태로 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.biznum = function() {
var num = this.trim().onlyNum();
if(num.length == 10) {
num = num.substring(0, 3) + "-" + num.substring(3, 5) + "-" + num.substring(5, 10);
}
else {
return false;
}
num = num.match(/([0-9]{3})-?([0-9]{2})-?([0-9]{5})/);
if(!num) return false;
num = RegExp.$1 + RegExp.$2 + RegExp.$3;
var cVal = 0;
for (var i=0; i<8; i++) {
var cKeyNum = parseInt(((_tmp = i % 3) == 0) ? 1 : ( _tmp == 1 ) ? 3 : 7);
cVal += (parseFloat(num.substring(i,i+1)) * cKeyNum) % 10;
}
var li_temp = parseFloat(num.substring(i,i+1)) * 5 + '0';
cVal += parseFloat(li_temp.substring(0,1)) + parseFloat(li_temp.substring(1,2));
return (parseInt(num.substring(9,10)) == 10 - (cVal % 10)%10) ? true : false;
}

//-----------------------------------------------------------------------------
// 전화번호 체크 XXX-XXXX-XXXX 형태로 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.phone = function() {
var num = this.trim().onlyNum();
if(num.substring(1,2) == "2") {
num = num.substring(0, 2) + "-" + num.substring(2, num.length - 4) + "-" + num.substring(num.length - 4, num.length);
}
else {
num = num.substring(0, 3) + "-" + num.substring(3, num.length - 4) + "-" + num.substring(num.length - 4, num.length);
}
num = num.match(/^0[0-9]{1,2}-[1-9]{1}[0-9]{2,3}-[0-9]{4}$/);
return (num) ? true : false;
}

//-----------------------------------------------------------------------------
// 핸드폰 체크 XXX-XXXX-XXXX 형태로 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.mobile = function() {
var num = this.trim().onlyNum();
num = num.substring(0, 3) + "-" + num.substring(3, num.length - 4) + "-" + num.substring(num.length - 4, num.length);
num = num.trim().match(/^01[016789]{1}-[1-9]{1}[0-9]{2,3}-[0-9]{4}$/);
return (num) ? true : false;
}

//-----------------------------------------------------------------------------
// 숫자만 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.num = function() {
return (this.trim().match(/^[0-9]+$/)) ? true : false;
}

//-----------------------------------------------------------------------------
// 영어만 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.eng = function() {
return (this.trim().match(/^[a-zA-Z]+$/)) ? true : false;
}

//-----------------------------------------------------------------------------
// 영어와 숫자만 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.engnum = function() {
return (this.trim().match(/^[0-9a-zA-Z]+$/)) ? true : false;
}

//-----------------------------------------------------------------------------
// 영어와 숫자만 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.numeng = function() {
return this.engnum();
}

//-----------------------------------------------------------------------------
// 아이디 체크 영어와 숫자만 체크 첫글자는 영어로 시작
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.userid = function() {
return (this.trim().match(/[a-zA-z]{1}[0-9a-zA-Z]+$/)) ? true : false;
}

//-----------------------------------------------------------------------------
// 한글만 체크
//
// @return : true(맞는 형식) | false(잘못된 형식)
//-----------------------------------------------------------------------------
String.prototype.kor = function() {
return (this.trim().match(/^[가-힣]+$/)) ? true : false;
}

//-----------------------------------------------------------------------------
// 숫자와 . - 이외의 문자는 다 뺀다. - 통화량을 숫자로 변환
//
// @return : 숫자
//-----------------------------------------------------------------------------
String.prototype.toNum = function() {
var num = this.trim();
return (this.trim().replace(/[^0-9\.-]/g,""));
}

//-----------------------------------------------------------------------------
// 숫자 이외에는 다 뺀다.
//
// @return : 숫자
//-----------------------------------------------------------------------------
String.prototype.onlyNum = function() {
var num = this.trim();
return (this.trim().replace(/[^0-9]/g,""));
}

//-----------------------------------------------------------------------------
// 숫자만 뺀 나머지 전부
//
// @return : 숫자 이외
//-----------------------------------------------------------------------------
String.prototype.noNum = function() {
var num = this.trim();
return (this.trim().replace(/[0-9]/g,""));
}

//-----------------------------------------------------------------------------
// 숫자에 3자리마다 , 를 찍어서 반환
//
// @return : 통화량
//-----------------------------------------------------------------------------
String.prototype.toMoney = function() {
var num = this.toNum();
var pattern = /(-?[0-9]+)([0-9]{3})/;
while(pattern.test(num)) {
num = num.replace(pattern,"$1,$2");
}
return num;
}

//-----------------------------------------------------------------------------
// String length 반환
//
// @return : int
//-----------------------------------------------------------------------------
String.prototype.getLength = function() {
return this.length;
}

//-----------------------------------------------------------------------------
// String length 반환 한글 2글자 영어 1글자
//
// @return : int
//-----------------------------------------------------------------------------
String.prototype.getByteLength = function() {
var tmplen = 0;
for (var i = 0; i < this.length; i++) {
if (this.charCodeAt(i) > 127)
tmplen += 2;
else
tmplen++;
}
return tmplen;
}

//-----------------------------------------------------------------------------
// 파일 확장자 반환
//
// @return : String
//-----------------------------------------------------------------------------
String.prototype.getExt = function() {
var ext = this.substring(this.lastIndexOf(".") + 1, this.length);
return ext;
}

//-----------------------------------------------------------------------------
// String에 따라서 받침이 있으면 은|이|을 을
// 받침이 없으면 는|가|를 등을 리턴 한다.
// str.josa("을/를") : 구분자는 항상 "/"로
//
//
// @return : 은/는, 이/가 ...
//-----------------------------------------------------------------------------
String.prototype.josa = function(nm) {
var nm1 = nm.trim().substring(0, nm.trim().indexOf("/"));
var nm2 = nm.trim().substring(nm.trim().indexOf("/") + 1, nm.trim().length);
var a = this.substring(this.length - 1, this.length).charCodeAt();
a = a - 44032;
var jongsung = a % 28;
return (jongsung) ? nm1 : nm2;
}


/******************************************************************************
* Form에 관련된 메서드
*
* 1. text, textarea
* required : 값이 없으면 경고
* num : 값에 숫자만 가능
* eng : 값에 영어만 가능
* han : 값에 한글만 가능
* numeng : 값에 숫자와 영어만 가능
* min=value : 최소 value자 이상
* max=value : 최대 value자 이하
* len=value : 정확하게 value자만 가능
* len=start~end : start자에서 end자까지 가능
* userid : 영어 숫자만 가능하고 첫문자는 영어로
* phone=value : value가 ""면 이 필드만 아니면 value가 같은 phone에 관련된 모든 필드 조사
* mobile=value : value가 ""면 이 필드만 아니면 value가 같은 mobile에 관련된 모든 필드 조사
* email=value : value가 ""면 이 필드만 아니면 value가 같은 email에 관련된 모든 필드 조사
* jumin=value : value가 ""면 이 필드만 아니면 value가 같은 jumin에 관련된 모든 필드 조사
* biznum=value : value가 ""면 이 필드만 아니면 value가 같은 biznum에 관련된 모든 필드 조사
* 2. select
* required : 값이 없으면 경고
* 3. radio
* required : 아무것도 선택되지 않으면 경고
* 4. checkbox
* required : 아무것도 선택되지 않으면 경고
* min=value : 최소 value개 이상 가능
* max=value : 최대 value개 이하 가능
* len=value : 정확하게 value개 가능
* len=start~end : start개에서 end개 까지 가능
* 5. file
* required : 아무것도 선택되지 않으면 경고
* allow=value : 확장자가 value 인 파일만 업로드 가능 (allow="gif jpg jpeg png")
* deny=value : 확장자가 value 인 파일은 업로드 불가능
*****************************************************************************/
//-----------------------------------------------------------------------------
// FormUtil Class 생성
//-----------------------------------------------------------------------------
FormUtil = function(obj) {
this.obj = obj;
}

//-----------------------------------------------------------------------------
// 폼 유효성 체크
//
// @return : true | false
//-----------------------------------------------------------------------------
FormUtil.prototype.success = function() {

for(var i = 0; i < this.obj.elements.length; i++) {
var f = this.obj[i];

var fname = (f.getAttribute("FNAME") == null) ? f.name.toUpperCase() : fname = f.getAttribute("FNAME");

// checkbox
if(f.type == "checkbox") {
if(!this.checkbox(f, fname)) {
return false;
}
}
// radio
else if(f.type == "radio") {
if(!this.radio(f, fname)) {
return false;
}
}
else { // text, textarea, password, select
// <input required>
if(f.getAttribute("REQUIRED") != null) {
var ftype = f.type;
var msg = " 입력 하세요";
if(ftype.indexOf("select") >= 0 || ftype == "file") {
msg = " 선택하세요";
}

if(!f.value.notNull()) {
alert(fname + fname.josa("을/를") + msg);
f.focus();
return false;
}
}
// <input num>
if(f.getAttribute("NUM") != null && f.value != "") {
if(!f.value.num()) {
alert(fname + fname.josa("은/는") + " 숫자로만 구성되어야 합니다.");
f.value = "";
f.focus();
return false;
}
}
// <input eng>
if(f.getAttribute("ENG") != null && f.value != "") {
if(!f.value.eng()) {
alert(fname + fname.josa("은/는") + " 영어로만 구성되어야 합니다.");
f.value = "";
f.focus();
return false;
}
}
// <input numeng>
if(f.getAttribute("NUMENG") != null && f.value != "") {
if(!f.value.numeng()) {
alert(fname + fname.josa("은/는") + " 숫자와 영어로만 구성되어야 합니다.");
f.value = "";
f.focus();
return false;
}
}
// <input han>
if(f.getAttribute("HAN") != null && f.value != "") {
if(!f.value.kor()) {
alert(fname + fname.josa("은/는") + " 한글로만 구성되어야 합니다.");
f.value = "";
f.focus();
return false;
}
}
// <input userid>
if(f.getAttribute("USERID") != null && f.value != "") {
if(!f.value.userid()) {
alert(fname + fname.josa("은/는") + " 숫자와 영어로만 구성되어야 하며\n\n첫문자는 반드시 영어로 시작해야 합니다.");
f.value = "";
f.focus();
return false;
}
}
// <input type="file" deny="value">
if(f.getAttribute("DENY") != null && f.type == "file" && f.value != "") {
var ext = f.value.getExt().toLowerCase();
var ext2 = f.getAttribute("DENY").toLowerCase();
if(ext2.indexOf(ext) >= 0) {
alert("확장자가 " + f.getAttribute("DENY").toUpperCase() + " 인 파일은 업로드 하실 수 없습니다.");
return false;
}
}
// <input type="file" deny="value">
if(f.getAttribute("ALLOW") != null && f.type == "file" && f.value != "") {
var ext = f.value.getExt().toLowerCase();
var ext2 = f.getAttribute("ALLOW").toLowerCase();
if(ext2.indexOf(ext) < 0) {
alert("확장자가 " + f.getAttribute("ALLOW").toUpperCase() + " 인 파일만 업로드 가능 합니다.");
return false;
}
}
// <input max="10">
if(f.getAttribute("MAX") != null) {
var tmpLen = f.value.getLength();
if(tmpLen > parseInt(f.getAttribute("MAX"))) {
alert(fname + fname.josa("은/는") + " " + f.getAttribute("MAX") + "자 이하로 입력 하세요.");
f.value = "";
f.focus();
return false;
}
}
// <input min="10">
if(f.getAttribute("MIN") != null) {
var tmpLen = f.value.getLength();
if(tmpLen < parseInt(f.getAttribute("MIN"))) {
alert(fname + fname.josa("은/는") + " " + f.getAttribute("MIN") + "자 이상으로 입력 하세요.");
f.focus();
return false;
}
}
// <input len="10">
if(f.getAttribute("LEN") != null) {
var tmpLen = f.value.getLength();
var val = f.getAttribute("LEN");
if(val.indexOf(val.noNum()) > 0) {
var num1 = val.substring(0, val.indexOf(val.noNum()));
var num2 = val.substring(val.lastIndexOf(val.noNum()) + 1, val.length);
if(tmpLen < parseInt(num1) || tmpLen > parseInt(num2)) {
alert(fname + fname.josa("은/는") + " " + num1 + "자 이상 " + num2 + "자 이하로 입력하세요");
f.focus();
return false;
}
}
else {
if(tmpLen != parseInt(val)) {
alert(fname + fname.josa("은/는") + " " + val + "자리 입니다.");
f.focus();
return false;
}
}
}
}
}

for(var i = 0; i < this.obj.elements.length; i++) {
var f = this.obj[i];
// <input phone="name">
if(f.getAttribute("PHONE") != null) {
var val = "";
if(f.getAttribute("PHONE") == "") {
val = f.value
}
else {
val = this.getValue("PHONE", f.getAttribute("PHONE"));
}
if(!val.phone()) {
alert("올바른 전화번호가 아닙니다.\n\n다시 확인하여 주세요");
f.focus();
return false;
}
}
// <input mobile="name">
if(f.getAttribute("MOBILE") != null) {
var val = "";
if(f.getAttribute("MOBILE") == "") {
val = f.value
}
else {
val = this.getValue("MOBILE", f.getAttribute("MOBILE"));
}
if(!val.mobile()) {
alert("올바른 핸드폰번호가 아닙니다.\n\n다시 확인하여 주세요");
f.focus();
return false;
}
}
// <input jumin="name">
if(f.getAttribute("JUMIN") != null) {
var val = "";
if(f.getAttribute("JUMIN") == "") {
val = f.value
}
else {
val = this.getValue("JUMIN", f.getAttribute("JUMIN"));
}
if(!val.jumin()) {
alert("올바른 주민등록 번호가 아닙니다.\n\n다시 확인하여 주세요");
f.focus();
return false;
}
}
// <input email="name">
if(f.getAttribute("EMAIL") != null) {
var val = "";
if(f.getAttribute("EMAIL") == "") {
val = f.value
}
else {
val = this.getValue("EMAIL", f.getAttribute("EMAIL"));
}
if(!val.mail()) {
alert("유효한 이메일이 아닙니다.\n\n다시 확인하여 주세요");
f.focus();
return false;
}
}
// <input biznum="name">
if(f.getAttribute("BIZNUM") != null) {
var val = "";
if(f.getAttribute("BIZNUM") == "") {
val = f.value
}
else {
val = this.getValue("BIZNUM", f.getAttribute("BIZNUM"));
}
if(!val.bizname()) {
alert("유효한 사업자 등록 번호가 아닙니다.\n\n다시 확인하여 주세요");
f.focus();
return false;
}
}

}

return true;
}

//-----------------------------------------------------------------------------
// Checkbox 일때 유효성 체크
//
// @return : true | false
//-----------------------------------------------------------------------------
FormUtil.prototype.checkbox = function(f, fname) {
var chkObj = eval("this.obj." + f.name);
// 체크박스를 선택하여야 할 때
var c = 0;
var len = chkObj.length;
if(len) {
for(var j = 0; j < len; j++) {
if(chkObj[j].checked) c++;
}
}
else {
if(chkObj.checked) c = 1;
}

if(f.getAttribute("REQUIRED") != null) {
if(c == 0) {
alert(fname + fname.josa("을/를") + " 선택하여 주세요");
return false;
}
}
if(f.getAttribute("MAX") != null) {
var val = f.getAttribute("MAX");
if(c > parseInt(val)) {
alert(fname + fname.josa("은/는") + " 최대 " + val + "개 이하로 선택 하셔야 합니다.");
return false;
}
}
if(f.getAttribute("MIN") != null) {
var val = f.getAttribute("MIN");
if(c < parseInt(val)) {
alert(fname + fname.josa("은/는") + " 최소 " + val + "개 이상 선택 하셔야 합니다.");
return false;
}
}
if(f.getAttribute("LEN") != null) {
var val = f.getAttribute("LEN");
if(val.indexOf(val.noNum()) > 0) {
var num1 = val.substring(0, val.indexOf(val.noNum()));
var num2 = val.substring(val.lastIndexOf(val.noNum()) + 1, val.length);
if(c < parseInt(num1) || c > parseInt(num2)) {
alert(fname + fname.josa("은/는") + " " + num1 + "개 이상 " + num2 + "개 이하로 선택 하셔야 합니다.");
return false;
}
}
else {
if(c != parseInt(val)) {
alert(fname + fname.josa("은/는") + " " + val + "개 선택 하셔야 합니다.");
f.focus();
return false;
}
}
}
return true;
}

//-----------------------------------------------------------------------------
// Radio 유효성 체크
//
// @return : true | false
//-----------------------------------------------------------------------------
FormUtil.prototype.radio = function(f, fname) {
var chkObj = eval("this.obj." + f.name);
if(f.getAttribute("REQUIRED") != null) {
var c = 0;
var len = chkObj.length;
if(len) {
for(var j = 0; j < len; j++) {
if(chkObj[j].checked) c++;
}
}
else {
if(chkObj.checked) c = 1;
}
if(c == 0) {
alert(fname + fname.josa("을/를") + " 선택하여 주세요");
return false;
}
}
return true;
}

//-----------------------------------------------------------------------------
// 체크되어 있는 갯수를 리턴해 준다.
//
// @return : int
//-----------------------------------------------------------------------------
FormUtil.prototype.checked = function(btn) {
var len = btn.length;
var c = 0;
if(len) {
for(var j = 0; j < len; j++) {
if(btn[j].checked) c++;
}
}
else {
if(btn.checked) c = 1;
}
return c;
}

//-----------------------------------------------------------------------------
// 해당 name의 값이 같은 filed를 구한다.
//
// @return : String
//-----------------------------------------------------------------------------
FormUtil.prototype.getValue = function(name, value) {
var val = "";
for(var j = 0; j < this.obj.elements.length; j++) {
if(eval("this.obj[j].getAttribute(\"" + name + "\")") != null && eval("this.obj[j].getAttribute(\"" + name + "\")") == value) {
if(val == "") {
val += this.obj[j].value;
}
else {
val += "@" + this.obj[j].value;
}
}
}
return val;
}
//-->

Posted by 1010
반응형

  1. <script type="text/javascript" src="http://widget.wzd.com/scripts/myjit.js">  
  2. </script>  
  3. <script type="text/javascript">  
  4. var myjit = new WZD.Myjit({   
  5.     myjitid: 'f472492259e3736f'   
  6. });   
  7. myjit.setConfiguration({   
  8.     skin: 21,   
  9.     width: 640,   
  10.     height: 480,   
  11.     title: '지하철 노선도'   
  12. });   
  13. myjit.load();   
  14. </script>  




    <script type="text/javascript" src="http://widget.wzd.com/scripts/myjit.js"> 
    </script> 
    <script type="text/javascript"> 
    var myjit = new WZD.Myjit({  
        myjitid: 'f472492259e3736f'  
    });  
    myjit.setConfiguration({  
        skin: 21,  
        width: 640,  
        height: 480,  
        title: '지하철 노선도'  
    });  
    myjit.load();  
    </script> 
Posted by 1010
반응형
 스크립트 목적
  - 기존의 셀렉트박스를 스타일의 적용이 가능한 레이어 형태(실제로는 테이블과 Popup Object)로 자동 변환

* 주요 기능 및 특징
  - 기존 셀렉트박스 태그의 수정 없이 스타일 시트에 정의하는 것만으로 모든 셀렉트박스 변환 가능
  - 셀렉트박스를 기준으로 아래위의 여백을 비교하여 옵션 항목 창의 출력 방향 결정
  - 기존 셀렉트박스처럼 변환된 셀렉트박스도 포커스를 가질 수 있음
    <script>document.getElementById('SelectBox_Name').focus();</script>
  - 변환된 셀렉트박스가 포커스를 가지고 있을 경우 휠을 움직이거나 키보드의 Home, End, Page Up, Page Down,
    Up Arrow, Down Arrow 등을 누름에 따라 값의 변경이 가능
    또한 열려진 옵션 항목 창에서도 가능함
  - 위의 이벤트 시에 문서의 스크롤을 제어하여 문서의 움직임이 없음
  - 아이프레임 및 프레임에 삽입된 상황에서도 프레임에 영향을 받지 않고 정상적으로 출력
    (Layer가 아닌 Popup Object를 이용)
  - 셀렉트박스의 항목이 동적으로 변경할 경우를 위한 메소드 제공
    <script>document.getElementById("SelectBox_Name").reInitializeSelectBox();</script>
  - 옵션 항목 창에 출력될 항목의 갯수를 지정(setDisplayCount() 메소드 이용)할 수 있으며 항목이 출력될
    갯수보다 많을 경우 자동으로 스크롤바 생성 (기본값은 10)
  - 셀렉트박스 및 옵션 항목에 대해 툴팁 메세지 설정 가능
  - 특정 셀렉트박스의 색상 및 화살표 이미지 변경 가능
  - 변환된 레이어를 텍스트처럼 취급 (연속적인 출력이 가능, 하단 여백 없음)
  - HTC 가 지원되는 브라우져에서만 변환 (HTC는 5.0 이상에서 가능하나 createPopup() 메소드가 5.5부터
    지원되어 IE 5.5 이상에서만 변환)
  - 옵션 항목 창 출력시 일시적으로 문서가 길어져 스크롤바가 출력되는 일이 없음

* 사용 방법
  - 스타일시트에 미리 정의하는 방법
  <style>select{ behavior: url('./selectBox.htc');}<style>
  - 특정 SelectBox 폼필드에만 적용하는 방법
  <select style="behavior: url('./selectBox.htc');"></select>


* 셀렉트박스 포커스 처리
  - 일반적인 SelectBox와 동일하게 처리 -> <script> document.getElementById('selectbox').focus();</script>
  - 셀렉트박스가 포커스를 가진 상황에서 휠을 움직이거나 Home, End, Page Up, Page Down,
    Up Arrow, Down Arrow 등의 키를 누르면 포커스를 가진 셀렉트박스의 값을 변경 함
  - 동적 처리 ->

<body onLoad="document.getElementById('selectbox_focus').focus();">
1번 항목

* 셀렉트박스 동적 변경 처리
  - 셀렉트박스의 항목을 동적으로 변경할 경우 reInitializeSelectBox() 메소드를 이용하여 재변환 가능
  - 셀렉트박스의 항목을 동적으로 추가 및 삭제할 경우 변환된 셀렉트박스를 제거 후 다시 변환함
    <script>document.getElementById("SelectBox_Name").reInitializeSelectBox();</script>

<script>
function addItem(selected_index){
  var objSB = document.getElementById("selectbox_dc_1");
  for(i=0; i<10; i++){
    objNewOption = new Option();
    objNewOption.text = "추가된 "+i+"번째 항목";
    objSB.add(objNewOption,objSB.length);
  }
  if(selected_index) objSB.selectedIndex = selected_index;
  objSB.reInitializeSelectBox();
}
</script>

2번 항목

<script>
function changeItem(selected_index){
  var objSB = document.getElementById("selectbox_dc_2");
  for(i=0; i<10; i++){
    objSB.add = new Option("변경된 "+i+"번째 항목",i);
  }
  if(selected_index) objSB.selectedIndex = selected_index;
  objSB.reInitializeSelectBox();
}
</script>
2번 항목

* 색상 및 화살표 이미지 설정
  setColor="일반폰트색상,일반배경색상,롤오버폰트색상,롤오버배경색상,일반보더색상,롤오버보더색상"
  setImage="./arrow_image.gif" (14*16 이하 사이즈)
<select> (기본형)
1번 항목
<select setColor="#000000,#FFFFFF,#000000,#E6E4E4,#C0C0C0,#000000">
1번 항목
<select setColor="white,red,black,white,blue,yellow">
1번 항목
<select setImage="./arrow_image2.gif">
4번 항목
setColor와 setImage 동시 적용
3번 항목

* 툴팁 메세지 설정
  - 셀렉트박스 및 옵션 항목에 툴팁 메세지를 설정하는 것이 가능 함
  - 셀렉트박스 태그 및 옵션 항목 태그에 tooltip="툴팁 메세지" 와 같이 프로퍼티 추가

    <select name='selectbox_tooltip' tooltip='필수 항목이니 꼭 선택하세요'>
     <option value='1' tooltip='첫번째 항목'>1번 항목</option>
     <option value='2' tooltip='두번째 항목'>2번 항목</option>
     <option value='3' tooltip='세번째 항목'>3번 항목</option>
     <option value='4' tooltip='네번째 항목'>4번 항목</option>
     <option value='5' tooltip='다섯번째 항목'>5번 항목</option>
    </select>
3번 항목

* 최대 출력 갯수 설정
  - 옵션 항목 창에 출력될 항목의 갯수를 설정 가능
  - setDisplayCount="출력될 갯수" 를 이용하여 설정

<select name="selectbox_count_1" setDisplayCount="5">
1번 항목
<select name="selectbox_count_2" setDisplayCount="10">
10번 항목
<select name="selectbox_count_3" setDisplayCount="15">
1번 항목

* SelectBox의 넓이 설정
  - style="width:200px" 와 같이 설정 가능
  - 별도의 넓이 설정이 없을 경우에는 변환 전의 셀렉트박스의 넓이 값(this.style.offsetWidth)으로 설정 함
    (offsetWidth 값을 못 읽을 경우 이전 버전에서 사용하던 문자열의 넓이를 픽셀로 구하는 함수 이용)

<select style="width:200px" >
스타일을 200px로 설정함
자동 설정 ( 옵션 내용이 한글만 )
옵션 텍스트가 한글만 있을 경우
자동 설정 ( 옵션 내용이 영문만 )
This option text is english...
자동 설정 ( 옵션 내용이 한글 + 영문 + 숫자 )
한글 + English + 1234567890

* 테이블 안에서의 정렬
  - 테이블 안에서 셀의 정렬에 따라 자동 적용

왼쪽 정렬
왼쪽 정렬
중앙 정렬
중앙 정렬
오른쪽 정렬
오른쪽 정렬

* onChange 이벤트 처리
  - 일반적인 SelectBox와 동일하게 처리

<select onChange="alert('선택값 : '+this.options[this.selectedIndex].value)">
1번 항목
<select onChange="location.href=this.options[this.selectedIndex].value;">
:: 검색 사이트로 이동 ::

* 스크롤바 및 레이어 위치 테스트
  - 셀렉트박스의 문서에서의 위치에 따라 옵션 항목 창을 위로 보여주거나 아래로 보여줌.
  - 또한 한쪽으로 모두 못 보여줄 경우에는 자동으로 스크롤바가 생성됨.
  - 기본적으로는 셀렉트박스를 기준으로 아래위의 공간을 비교하여 더 넓은 공간쪽으로 옵션 항목 창이 출력되나
    공간이 10개 항목이 나올 정도의 높이(204px)가 되면 아래로 나옴
  - 단, 하단 여백이 204px보다 적을 경우에도 하던 여백과 항목의 갯수에 비례해 공간이 될 경우에는 아래로 출력됨
  - 문서를 스크롤하여 아래의 셀렉트박스를 기준으로 아래위의 공간을 조절한 후 셀렉트박스를 클릭하면 알 수 있음

테스트용 1 (항목이 2개)
1번 항목
테스트용 2 (항목이 5개)
1번 항목
테스트용 3 (항목이 10개)
1번 항목
테스트용 4 (항목이 15개)
1번 항목
테스트용 5 (항목이 100개)
1번 항목

* 아이프레임 테스트
  - 아이프레임 또는 프레임 안에 셀렉트박스가 있을 경우 옵션 항목 창이 아이프레임 및 프레임을 넘어서 정상적으로
   출력 가능함



Posted by 1010
반응형

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<meta http-equiv="imagetoolbar" content="no">
<link rel="stylesheet" href="/css/admin.css" type="text/css">
<script language="javascript">
<!--
function Category(value, name, parent, depth) {
  this.value = value;
  this.name = name;
  this.parent = parent;
  this.depth = depth;
  this.length = 0;
}

function addCategory(category, value, name, parent, depth) {
  category[category.length] = new Category(value, name, parent, depth);
  category.length++;
}

var category = new Category();
var category1 = new Category();

addCategory(category, '00', '자동차계약', '01', '1');
addCategory(category, '01', '개인용', '01', '2');
addCategory(category, '02', '업무용', '01', '2');
addCategory(category, '03', '영업용', '01', '2');
addCategory(category, '04', '플러스 개인용', '01', '2');
addCategory(category, '05', '플러스 업무용', '01', '2');
addCategory(category, '06', '참좋은 개인용', '01', '2');
addCategory(category, '99', '기타', '01', '2');
addCategory(category, '00', '자동차보상', '02', '1');
addCategory(category, '01', '대인Ⅰ', '02', '2');
addCategory(category, '02', '대인Ⅱ', '02', '2');
addCategory(category, '03', '대물', '02', '2');
addCategory(category, '04', '자손', '02', '2');
addCategory(category, '05', '자차', '02', '2');
addCategory(category, '06', '무보험', '02', '2');
addCategory(category, '07', '상해', '02', '2');
addCategory(category, '08', '타차', '02', '2');
addCategory(category, '99', '기타', '02', '2');
addCategory(category, '00', '보장사업', '03', '1');
addCategory(category, '00', '장기계약', '04', '1');
addCategory(category, '01', '재물', '04', '2');
addCategory(category, '02', '운전자', '04', '2');
addCategory(category, '03', '저축성', '04', '2');
addCategory(category, '04', '상해', '04', '2');
addCategory(category, '05', '연금', '04', '2');
addCategory(category, '06', '질병', '04', '2');
addCategory(category, '99', '기타', '04', '2');
addCategory(category, '00', '장기보상', '05', '1');
addCategory(category, '01', '재물', '05', '2');
addCategory(category, '02', '상해', '05', '2');
addCategory(category, '03', '질병', '05', '2');
addCategory(category, '04', '연금', '05', '2');
addCategory(category, '05', '저축성', '05', '2');
addCategory(category, '06', '운전자', '05', '2');
addCategory(category, '99', '기타', '05', '2');
addCategory(category, '00', '일반보상', '06', '1');
addCategory(category, '01', '화재', '06', '2');
addCategory(category, '02', '기술', '06', '2');
addCategory(category, '03', '근재', '06', '2');
addCategory(category, '04', '배상', '06', '2');
addCategory(category, '05', '종합', '06', '2');
addCategory(category, '06', '상해', '06', '2');
addCategory(category, '07', '기타특종', '06', '2');
addCategory(category, '08', '종합(物)', '06', '2');
addCategory(category, '09', '기타특종(物)', '06', '2');
addCategory(category, '99', '기타', '06', '2');
addCategory(category, '00', '융자', '07', '1');
addCategory(category, '00', '영업', '08', '1');
addCategory(category, '00', '기타', '09', '1');
addCategory(category, '00', '일반계약', '10', '1');
addCategory(category, '01', '상해', '10', '2');
addCategory(category, '02', '재물', '10', '2');
addCategory(category, '99', '기타', '10', '2');

addCategory(category1, '10000', '자동차계약', '00000', '1');
addCategory(category1, '20000', '장기계약', '00000', '1');
addCategory(category1, '30000', '고객서비스', '00000', '1');
addCategory(category1, '10100', '계약인수', '10000', '2');
addCategory(category1, '10200', '계약관리', '10000', '2');
addCategory(category1, '10300', '계약해지', '10000', '2');
addCategory(category1, '20100', '계약인수', '20000', '2');
addCategory(category1, '20200', '계약관리', '20000', '2');
addCategory(category1, '20300', '계약해지', '20000', '2');
addCategory(category1, '30100', '임직원', '30000', '2');
addCategory(category1, '30200', 'PA', '30000', '2');
addCategory(category1, '30300', 'PA 제기 불만', '30000', '2');
addCategory(category1, '30400', '대출', '30000', '2');
addCategory(category1, '30500', '콜센터', '30000', '2');
addCategory(category1, '30600', 'SOS서비스', '30000', '2');
addCategory(category1, '30700', '현장출동', '30000', '2');
addCategory(category1, '30800', '시스템', '30000', '2');
addCategory(category1, '10101', '증권, 약관, 영수증 미수령', '10100', '3');
addCategory(category1, '10102', '인수기준 불만', '10100', '3');
addCategory(category1, '10103', '계약정보 착오입력', '10100', '3');
addCategory(category1, '10104', '자동이체 갱신특약 안내미흡', '10100', '3');
addCategory(category1, '10105', '특약/보상범위등 상품안내 미흡', '10100', '3');
addCategory(category1, '10106', '계약자 동의없이 임의 계약체결', '10100', '3');
addCategory(category1, '10107', '기타', '10100', '3');
addCategory(category1, '10201', '수납방법 배서누락', '10200', '3');
addCategory(category1, '10202', '자동이체일/갱신/연체/실효안내 미흡', '10200', '3');
addCategory(category1, '10203', '특약/담보변경사항 안내 미흡', '10200', '3');
addCategory(category1, '10204', '기타 요청 배서 지연 및 누락', '10200', '3');
addCategory(category1, '10205', '자동이체 해지/수납방법 변경 후 계좌에서 자동이체됨', '10200', '3');
addCategory(category1, '10206', '차량대체착오', '10200', '3');
addCategory(category1, '10207', '신용정보 유출 여부', '10200', '3');
addCategory(category1, '10208', '기타', '10200', '3');
addCategory(category1, '10301', '해지환급금 불만', '10300', '3');
addCategory(category1, '10302', '관련서류안내착오', '10300', '3');
addCategory(category1, '10303', '해지후 보험료 이체', '10300', '3');
addCategory(category1, '10304', '기타', '10300', '3');
addCategory(category1, '20101', '증권(영수증) 미수령', '20100', '3');
addCategory(category1, '20102', '인수기준 불만', '20100', '3');
addCategory(category1, '20103', '계약정보 착오입력', '20100', '3');
addCategory(category1, '20104', '피보험자 선정 착오', '20100', '3');
addCategory(category1, '20105', '특약/보상범위등 상품안내 미흡', '20100', '3');
addCategory(category1, '20106', '계약자 동의없이 임의 계약체결', '20100', '3');
addCategory(category1, '20107', '기타', '20100', '3');
addCategory(category1, '20201', '자동이체 약정일 임의 변경', '20200', '3');
addCategory(category1, '20202', '영업조직 임의로 실시간 출금', '20200', '3');
addCategory(category1, '20203', '특약/담보변경사항 안내 미흡', '20200', '3');
addCategory(category1, '20204', '수납방법 배서누락', '20200', '3');
addCategory(category1, '20205', '자동이체일/갱신/연체안내/실효안내 미흡', '20200', '3');
addCategory(category1, '20206', '기타 요청 배서 누락', '20200', '3');
addCategory(category1, '20207', '자동이체 해지/수납방법 변경 후 계좌에서 자동이체됨', '20200', '3');
addCategory(category1, '20208', '신용정보 유출 여부', '20200', '3');
addCategory(category1, '20209', '기타', '20200', '3');
addCategory(category1, '20301', '환급금 불만', '20300', '3');
addCategory(category1, '20302', '관련서류 안내착오', '20300', '3');
addCategory(category1, '20303', '해지후 보험료 이체', '20300', '3');
addCategory(category1, '20304', '기타', '20300', '3');
addCategory(category1, '30101', '업무처리 미흡', '30100', '3');
addCategory(category1, '30102', '응대 불친절', '30100', '3');
addCategory(category1, '30103', '약속 불이행', '30100', '3');
addCategory(category1, '30104', '직업윤리 위반', '30100', '3');
addCategory(category1, '30105', '기타', '30100', '3');
addCategory(category1, '30201', '업무처리 미흡', '30200', '3');
addCategory(category1, '30202', '계약후 별도의 관리없음', '30200', '3');
addCategory(category1, '30203', '응대 불친절', '30200', '3');
addCategory(category1, '30204', '약속 불이행', '30200', '3');
addCategory(category1, '30205', '보험료 유용', '30200', '3');
addCategory(category1, '30206', '직업윤리 위반', '30200', '3');
addCategory(category1, '30207', '기타', '30200', '3');
addCategory(category1, '30301', '수당,수수료 관련', '30300', '3');
addCategory(category1, '30302', '조직이관,해촉', '30300', '3');
addCategory(category1, '30303', '영업관리상 불만', '30300', '3');
addCategory(category1, '30304', '기타', '30300', '3');
addCategory(category1, '30401', '대출이자 관련', '30400', '3');
addCategory(category1, '30402', '신용정보 유출 여부', '30400', '3');
addCategory(category1, '30403', '소득정산관련', '30400', '3');
addCategory(category1, '30404', '대출이자연체 안내미흡', '30400', '3');
addCategory(category1, '30405', '기타', '30400', '3');
addCategory(category1, '30501', '응대 불친절', '30500', '3');
addCategory(category1, '30502', '상품/보상/배서 관련 착오안내', '30500', '3');
addCategory(category1, '30503', '변경업무 처리 미흡', '30500', '3');
addCategory(category1, '30504', '기타', '30500', '3');
addCategory(category1, '30601', '정비서비스 불만', '30600', '3');
addCategory(category1, '30602', '부당요금 청구', '30600', '3');
addCategory(category1, '30603', '출동지연', '30600', '3');
addCategory(category1, '30604', '현장조치 미흡', '30600', '3');
addCategory(category1, '30605', '업체 불친절', '30600', '3');
addCategory(category1, '30606', '업체 횡포 (부당한 요구)', '30600', '3');
addCategory(category1, '30607', '직원 복장/태도 불량', '30600', '3');
addCategory(category1, '30608', '기타', '30600', '3');
addCategory(category1, '30701', '현장출동 미실시(지연)', '30700', '3');
addCategory(category1, '30702', '현장조치 미흡', '30700', '3');
addCategory(category1, '30703', '직원 불친절', '30700', '3');
addCategory(category1, '30704', '직원 복장/태도 불량', '30700', '3');
addCategory(category1, '30705', '기타', '30700', '3');
addCategory(category1, '30801', '이메일 및 핸드폰으로 불필요한 안내', '30800', '3');
addCategory(category1, '30802', '전산 등 시스템으로 야기되는 불만', '30800', '3');
addCategory(category1, '30803', '홈페이지 관련 불만', '30800', '3');
addCategory(category1, '30804', '기타', '30800', '3');
 

function initForm() {
    var frm = document.form1;
    var j = 1;
    var k = 1;
    for (i = 0; i < category.length; i++) {
        if (category[i].depth == "1") {
            frm.ins_type.options[0] = new Option(":: 보험종목 ::", "");
            frm.ins_type.options[j] = new Option(category[i].name, category[i].parent);
            j++;
        }
    }
    for (i = 0; i < category1.length; i++) {
        if (category1[i].depth == "1") {
            frm.codeA.options[0] = new Option(":: 대분류 ::", "");
            frm.codeA.options[k] = new Option(category1[i].name, category1[i].value);
            k++;
        }
    }
    frm.ins_type.selectedIndex = 0;
    frm.codeA.selectedIndex = 0;
    changeMiddle(frm.ins_type, frm.ins_s_type, "1");
    changeMiddle(frm.codeA, frm.codeB, "1");
}

function changeMiddle(obj, changeObj, depth) {
    var j = 1;
    var i = obj.selectedIndex;
    if (i < 0) i = 0;
    var value = obj[i].value;
   
    if (obj == document.form1.ins_type) {
        changeObj.options[0] = new Option(":: 보험종목세부 ::", "");
        for (i = 0; i < category.length; i++) {
            var parent = category[i].parent;
            if (parent == value && category[i].depth == "2") {
                changeObj.options[j] = new Option(category[i].name, category[i].value);
                j++;
            }
        }
    } else {
        if (depth == "3") {
            changeObj.options[0] = new Option(":: 소분류 ::", "");
        } else {
            document.form1.codeB.options[0] = new Option(":: 중분류 ::", "");
            document.form1.codeC.options[0] = new Option(":: 소분류 ::", "");
        }
        for (i = 0; i < category1.length; i++) {
            var parent = category1[i].parent;
            if (parent == value) {
                changeObj.options[j] = new Option(category1[i].name, category1[i].value);
                j++;
            }
        }
    }

    changeObj.selectedIndex = 0;
}

function submitForm(){
    alert(document.form1.ins_type.value);
    alert(document.form1.ins_s_type.value);
    alert(document.form1.codeA.value);
    alert(document.form1.codeB.value);
    alert(document.form1.codeC.value);
}

// -->
</SCRIPT>
</head>

<body onLoad="initForm();">

<h1>3단 동적 셀렉트 박스 예제</h1>

<form name="form1" method="get" action="#">
<select name="ins_type" onchange="changeMiddle(this, document.form1.ins_s_type, '2')"></select>
<select name="ins_s_type"></select><br>

<select name="codeA" onchange="changeMiddle(this, document.form1.codeB, '2')"></select>
<select name="codeB" onchange="changeMiddle(this, document.form1.codeC, '3')"></select>
<select name="codeC"></select>
</form>
<input type="button" value="submit" onclick="submitForm();">
</body>
</html>



 

Posted by 1010
반응형

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Vertically and Horizontally Centering a DIV</title>

<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />

<script type="text/javascript" src="/mint/mint.js.php"></script>

<style type="text/css">
body {
 font-size: 12px;
 font-family: arial, helvetica, sans-serif;
 color: #333;
}
p {
 margin: 1em;
}
.comments {
 background-color: #e3e3e3;
 border-top: 1px solid #ccc;
 border-bottom: 1px solid #ccc;
 padding: 2px;
}

#mydiv {
 position:absolute;
 top: 50%;
 left: 50%;
 width:30em;
 height:18em;
 margin-top: -9em; /*set to a negative number 1/2 of your height*/
 margin-left: -15em; /*set to a negative number 1/2 of your width*/
 border: 1px solid #ccc;
 background-color: #f3f3f3;
}

</style>

</head>
<body>
<div id="mydiv">
 <p>This is a vertically and horizontally centered &lt;div&gt; tag. Try resizing your browser.</p>
 
 <div class="comments">
  <p><strong>Comments:</strong></p>
  <p>Tested in: <span style="color: darkblue">Firefox, IE6, Opera 7, NN4.7, NN7, and Mozilla 1.2.</span><br />
  Works in: <span style="color: darkblue">Firefox, IE6, Opera 7, NN7, and Mozilla 1.2.</span><br />
  Doesn't work in: <span style="color: darkblue">NN4.7</span></p>
  <p>&copy; Copyright 2003, <a href="/">Infinity Web Design</a></p>
 </div>
</div>
</body>
</html>

Posted by 1010
반응형

Table 줄바꿈

  1. 강제로 줄바꿈(특수문자제외) style="word-break:break-all"
  2. 강제로 줄바꿈(특수문자포함) style="word-wrap:break-word"
  3. 줄바꿈 못하도록 nowrap
Posted by 1010
반응형

1. 소스

<html>
<head>
<title>Bizest 체험관 - KIS</title>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr">
<link rel="alternate" type="application/rss+xml" href="/rss/" title="RSS feed for Bizest KIS"/>
<link rel="stylesheet" type="text/css" href="/skin/x4/css/blue.css" />
<link rel="stylesheet" type="text/css" href="/skin/x4/css/layout.css" />
<link rel="stylesheet" type="text/css" href="/skin/x4/css/form.css" />
<link rel="stylesheet" type="text/css" href="/skin/x4/css/form.css" />
<link rel="stylesheet" media="print" type="text/css" href="/skin/x4/css/print.css" />

print.css

body {
 
 /*
 font-family:"Times New Roman", serif;
 font-size:12pt;
 */

 background:none;

 margin-left: 20px;
 margin-top: 10px;
 margin-right: 20px;
 margin-bottom: 10px;
}

#container {
 width:100%;
}

#container_head {
 DISPLAY: none;
}

#container_body .left {
 DISPLAY: none;
}

#container_body {
 width:100%;
}

#container_body .right {
 width:100%;
}

#container_footer {
 DISPLAY: none;
}



출처 : http://www.ihelpers.co.kr/programming/tipntech.php?CMD=view&TYPE=0&KEY=&SC=S&&CC=&PAGE=1&IDX=639
Posted by 1010
반응형
1. JavaScript 최적화 도구
2. CSS 최적화 도구
3. 웹 사이트 성능 개선

출처 : http://www.mimul.com/pebble/default/2008/01/29/1201616760000.html

Posted by 1010
반응형

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title> obxGetColor, obxStickGraph</title>
<meta http-equiv="content-type" content="text/html; charset=euc-kr" />
 <script>
 IE=(window.showModalDialog) ? true : false;

 function obxGetColor(color,gap) {

  var rtn='',col,tmp;

  for(var x=0;x <6; x+=2) {
   col=parseInt(color.substr(x,2),16)+gap;
   if (col > 255) col = 255;
   else if (col < 0) col=0;

   if(col < 10) rtn+='0'+col.toString(16);
   else rtn+=col.toString(16);
  }

  return rtn;
 }


 function obxStickGraph(dsize) {

  this.step=3;
  this.speed=10;
  this.total=0;
  this.max=0;
  this.dsize=dsize;
  this.statictext=false;

  this.item= new Object();

  this.add = function (id,size,color,text) {
   this.total += size;
   this.max=Math.max(this.max,size);
   this.item[id]= {'size' : size, 'color' : color.replace('#',''), 'text' : text}
  }

  this.draw = function (id,action) {

   var dColor=obxGetColor(this.item[id].color,-20);

   document.write("<div></div>");
   //this.item[id].div=document.body.appendChild(document.createElement('div'));
   var divs=document.getElementsByTagName('div');
   this.item[id].div=divs[divs.length-1];

   this.item[id].div.style.borderLeft="1px solid #"+dColor;
   this.item[id].div.style.overflow="hidden";
   this.item[id].div.style.height="11px";

   if(!action) this.actDraw(id);
   else this.actDraw(id,5);

  }

  this.getCss= function(width,height,color,bwidth,bcolor) {
   if(width<1)width=1;
   return "overflow:hidden;width:"+width+";height:"+height+";background-color:"+color+";border-right:"+bwidth+"px #"+bcolor+" solid";

  }

  this.actDraw= function(id,limit) {

   var pp = this.item[id].size / this.total;
   var sizep = this.item[id].size / this.max;

   if(!limit) var size=this.dsize * sizep;
   else size=limit;

   var hit = Math.round(this.max/this.dsize*size);
   var percent =(Math.round(this.max/this.dsize*size)/this.total*100).toString().match(/[0-9]*(?:\.[0-9][0-9])?/);

   var text = (this.item[id].text) ? this.item[id].text.replace('#',hit).replace('$',percent) : percent + " %"


   var Color=this.item[id].color;
   var hColor=obxGetColor(Color,20);
   var hhColor=obxGetColor(Color,30);
   var dColor=obxGetColor(this.item[id].color,-20);
   var add='',d;

   if(IE || opera) d=new Array(3,2,1);
   else d=new Array(3,4,5);

   this.item[id].div.innerHTML= ''
    +'<div style="'+this.getCss(size-d[0],1,hColor,1,hhColor)+'"></div>'
    +'<div style="'+this.getCss(size-d[1],2,hColor,3,hhColor)+'"></div>'
    +'<div style="'+this.getCss(size-d[2],2,hColor,5,hhColor)+'"></div>'
    +'<div style="'+this.getCss(size-d[2],1,hhColor,5,hhColor)+'"></div>'
    +'<div style="'+this.getCss(size-d[2],2,Color,5,hhColor)+'"></div>'
    +'<div style="'+this.getCss(size-d[1],2,Color,3,hhColor)+'"></div>'
    +'<div style="'+this.getCss(size-d[0],1,dColor,1,hhColor)+'"></div>'
    +'<span style="position:relative;top:'+(-11-IE)+'px;left:'+(((this.statictext)?this.dsize*sizep:size)+5)+'px;font:7pt verdana">'+text+'</span>'

   if(limit)
   if(this.dsize * sizep > limit) {
    obxStickGraphRunObject=this;
    setTimeout('obxStickGraphRunObject.actDraw("'+id+'",'+(limit+this.step)+');',this.speed);
   }else{
    setTimeout('obxStickGraphRunObject.actDraw("'+id+'");',this.speed);
   }

  }


 }


 grp=new obxStickGraph(200) ;
  grp.add('id1',100,'F8CF7B');
  grp.add('id2',200,'#D1D3D3');

  grp.add('id3',500,'FDB480','# hit ($ %)');
  grp.add('id4',300,'3399ff','# hit');
 </script>
 <style>
  td {font: 11px gulim}
 </style>

</head>


<body>

<table>
<tr>
 <td>
  항목 1
 </td>
 <td width="300">
  <script>grp.draw('id1',true);</script>
 </td>
 <td>
  동적 드로우, 기본출력
 </td>
</tr>

<tr>
 <td>
  항목 2
 </td>
 <td>
  <script>grp.draw('id2');</script>
 </td>
 <td>
  정적 드로우, 기본출력
 </td>
</tr>

<tr>
 <td>
  항목 3
 </td>
 <td>
  <script>grp.draw('id3',true);</script>
 </td>
 <td>
  동적 드로우, "# hit" 출력
 </td>
</tr>

<tr>
 <td>
  항목 4
 </td>
 <td>
  <script>grp.draw('id4');</script>
 </td>
 <td>
  정적 드로우, "# hit" 출력
 </td>
</tr>

</table>


<xmp>

생성 :

 <script>

  grp=new obxStickGraph(200) ;
  //젤 긴게 200px 만하게 grp란걸 만든다 (그래프 길이"만" 입니다, 글자 때문에 더 깁니다.)

  grp.add('id1',100,'F8CF7B');
  //그 grp로 명령을 내립니다.
  // "id1" 아이디로 100이란 값을 넣어준다 이때 색은 F8CF7B로
  //색은 조금 어두운 부분(그래프 밑부분)색입니다

  grp.add('id2',200,'#D1D3D3');

  grp.add('id3',500,'FDB480','# hit ($ %)');
  // 4번째 인자는 출력 문잡니다. #은 값으로 $는 퍼센트값으로 바뀝니다

  grp.add('id4',300,'3399ff','# hit');

 </script>


출력 :

 <script>

  grp.draw('id1',true);
  //아이디에 해당되는 그래프를 출력합니다,
  //이때 두번째 인자는 옵션이고 true로 해주면 동적으로 그립니다.(비추-_-;)

 </script>


동적옵션코드 :

 <script>
  grp.step = 3;
  grp.speed = 10;
  //그려주기(grp.draw()) 전에 이런 코드를 넣어주셔도 됩니다.
  //동적으로 그릴때 쓰는 옵션인데
  //스텝은 한번에 늘어나는 길이(픽셀)고, 스피드는 한번 돌아가는;; 속도입니다. 적을수록 빠르고 0이 최소값입니다.

 +yser님의 조언

  grp.statictext=true
  //텍스트 표시를 정적으로 합니다.
 </script>


</xmp>




</body>
</html>

Posted by 1010
반응형
참조 및 번역 http://www.w3schools.com/js/default.asp

자바스크립트는 웹에서 사용하는 스크립트 언어 입니다!

자바스크립트는 수만 개의 웹 페이지에서 디자인을 향상 시키고, 폼을 검증하고, 브라우저를 인식하고, 쿠키를 생성하는데 사용하고 있습니다.

자바스크립트는 인터넷에서 가장 유명한 스크립트 언어입니다.

자바스크립트는 배우기 쉬워요! 즐겨보세요!

JS Basic
JS HOME(Whiteship's Note)
JS Introduction(Introduction to JavaScript)
JS How To(JavaScript How To ...)
JS Where To(JavaScript Where To ...)
JS Variables(JavaScript Variables)
JS If...Else(JavaScript If...Else와 Switch Statement)
JS Switch
JS Operators(JavaScript Operators)
JS Popup Boxes(JavaScript Popup Boxes)
JS Functions(JavaScript Functions)
JS For Loop(JavaScript For Loop와 While Loop)
JS While Loop
JS Break Loops
JS For...In
JS Events(JavaScript Events)
JS Try...Catch(JavaScript Try...Catch Statement)
JS Throw(JavaScript Throw Statement)
JS onerror(JavaScript The onerror Event)
JS Special Text(JavaScript Special Characters)
JS Guidelines(JavaScript Guidelines)

JS Objects
JS Objects Intro(JavaScript Objects Introduction)
JS String(avaScript String Object)
JS Date(JavaScript Date Object)
JS Array(JavaScript Array Object)
JS Boolean(JavaScript Boolean Object)
JS Math(JavaScript Math Object)
JS HTML DOM(JavaScript HTML DOM Objects)

JS Advanced
JS Browser(JavaScript Browser Detection)
JS Cookies(JavaScript Cookies)
JS Validation(JavaScript Form Validation)
JS Animation(JavaScript Animation)
JS Image Maps
JS Timing(JavaScript Timing Events)
JS Create Object(JavaScript Create Your Own Objects)
JS Summary
Basic 부분은 요약 하는 식으로 정리했으며
Object와 Advanced 부분은 거의 번역을 했습니다.

전부 살표보신 분들은 재미삼아 퀴즈도 보실 수 있습니다.
물론 다 보지 않고도 퀴즈만 볼 수도 있지요.ㅋ

사용자 삽입 이미지
문제 난이도는 매우 쉬운데(20문제 푸는데 3분 10초면..그냥 찍기 수준입니다.ㅋㅋ).. 저는 두 문제를 틀려버렸어요;;


출처 : http://whiteship.me/1004
Posted by 1010
반응형

<HTML>

       <HEAD>

              <TITLE>TextArea </TITLE>

              <SCRIPT LANGUAGE="JavaScript">

<!--

 

function CheckStrLength()

{

 

 var temp;

 var f = document.form.write_text.value.length;

 var msglen = 256; //최대 길이

 var tmpstr = "";

 var enter = 0;

 var strlen;

 

 // 초기 최대길이를 텍스트 박스에 뿌려준다.

 if(f == 0)

  document.form.remain.value = msglen;

 else

 {

  for(k=0;k<f;k++)

  {

   temp = document.form.write_text.value.charAt(k);

  

   if(temp == '\n')// 입력 라인 제한을 위해 엔터키 횟수 증가

   {

    enter++;

   }

 

   if(escape(temp).length > 4)

    msglen -= 2;

   else

    msglen--;

 

 

   if(msglen < 0)

   {

    alert("총 영문 512자 한글 256자 까지 쓰실 수 있습니다.");

    document.form.write_text.value = tmpstr;

    break;

   }

   else if(enter > 3)

   {

    alert("라인수 4라인을 넘을수 없습니다.");

    enter = 0;

    strlen = tmpstr.length - 1;

    //alert(strlen);

    document.form.write_text.value = tmpstr.substring(0,strlen);

    break;

   }

   else

   {

 

    document.form.remain.value = msglen;

    tmpstr += temp;

   }

  }

 }

}

//-->

              </SCRIPT>

       </HEAD>

       <BODY>

              아는 후배 한테 받은건데 잘써먹고 있어요

              <FORM name="form" METHOD="POST" ACTION="" ID="Form1">

                     <table border="0" cellspacing="0" cellpadding="0" ID="Table1">

                            <tr>

                                   <td width="200" style="FONT-FAMILY: 굴림; FONT-SIZE: 12pt">⊙ 내용입력 남은 글자수 :

                                   </td>

                                   <td align="left" width="50"><input type="text" name="remain" size="3" value="" style="background-color:#ffffff;border:1 solid #33333; FONT-FAMILY: 굴림; FONT-SIZE: 10pt"

                                                 readonly ID="Text1">

                                   </td>

                                   <td align="" valign="bottom" width="360">(4줄까지만 작성 가능합니다.)

                                   </td>

                            </tr>

                            <tr>

                                   <td colspan="3" height="1"></td>

                            </tr>

                            <tr>

                                   <td colspan="3"><img src="http://okjsp.pe.kr/images/okjsp_top.gif" width="1" height="3" border="0"><br>

                                          <textarea name="write_text" cols="75" rows="10" WRAP="SOFT" onChange="CheckStrLength()" onKeyUp="CheckStrLength()"

                                                 ID="Textarea1"></textarea>

                                   </td>

                            </tr>

                     </table>

              </FORM>

       </BODY>

</HTML>

Posted by 1010
반응형

<!--

// 최상위 체크 로직(chars로 넘긴 값이 있다면 true)

    function containsCharsOnly(input,chars) {

        for (var inx = 0; inx < input.value.length; inx++) {

            if (chars.indexOf(input.value.charAt(inx)) == -1)

                return false;

        }

        return true;

    }

 

 

// 최상위 체크 로직(chars로 넘긴 값이 있다면 false)

 function containsChars(input,chars) {

     for (var inx = 0; inx < input.value.length; inx++) {

        if (chars.indexOf(input.value.charAt(inx)) != -1)

            return true;

     }

     return false;

 }

 

 

 

// 숫자 체크

    function isNum(input) {

        var chars = "0123456789";

        return containsCharsOnly(input,chars);

    }

 

 

 

// 이름체크

 function nameCheck(input){

  var chars = '0123456789~!@#$%^&*()_-+=|{}[]<>,./?';

        return containsChars(input,chars);

 }

 

 

 

// 전화 번호 Check

    function isPhoneCheck(input) {

     var chars = "0123456789( ).-,<>{}[]_~";

        return containsCharsOnly(input,chars);

    }

 

 

 

// 영문 판별

    function isPhoneCheck(input) {

     var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

        return containsCharsOnly(input,chars);

    }

 

 

 

// 영숫자 판별

    function isPhoneCheck(input) {

     var chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

        return containsCharsOnly(input,chars);

    }

 

 

 

 // 입력값이 숫자,대시(-)로 되어있는지 체크

 function isNumDash(input) {

     var chars = "-0123456789";

     return containsCharsOnly(input,chars);

 }

 

 

 

 // 입력값이 숫자,콤마(,)로 되어있는지 체크

 function isNumComma(input) {

     var chars = ",0123456789";

     return containsCharsOnly(input,chars);

 }

 

 

 

 // 입력값이 사용자가 정의한 포맷 형식인지 체크

 // 자세한 format 형식은 자바스크립트의 ''regular expression''을 참조

 function isValidFormat(input,format) {

     if (input.value.search(format) != -1) {

         return true; file://올바른 포맷 형식

     }

     return false;

 }

 

 

 

 /**

  * 입력값이 이메일 형식인지 체크

  * ex) if (!isValidEmail(form.email)) {

  *         alert("올바른 이메일 주소가 아닙니다.");

  *     }

  */

 function isValidEmail(input) {

 //    var format = /^(\S+)@(\S+)\.([A-Za-z]+)$/;

     var format = /^((\w|[\-\.])+)@((\w|[\-\.])+)\.([A-Za-z]+)$/;

     return isValidFormat(input,format);

 }

 

 

 

 /**

  * 입력값이 전화번호 형식(숫자-숫자-숫자)인지 체크

  */

 function isValidPhone(input) {

     var format = /^(\d+)-(\d+)-(\d+)$/;

     return isValidFormat(input,format);

 }

 

 

 

 // 콤마 없애기

 function removeComma(input) {

     return input.value.replace(/,/gi,"");

 }

 

 

 

 // 문자 변환 함수

    function alterString(str,before,after) {

     var returnStr = "";

     for(i = 0; i < str.length; i++) {

      value = str.charAt(i);

      index = before.indexOf(value);

      if(index >= 0) value = after.charAt(index);

      returnStr += value;

     }

     return returnStr;

    }

 

 

 

// --> 대문자 변환 함수

    function ToUpper(arg) {

     var str1 = "abcdefghijklmnopqrstuvwxyz";

     var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

     return alterString(arg,str1,str2);

    }

 

 

 

// --> 소문자 변환 함수

    function ToLower(arg){

     var str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

     var str2 = "abcdefghijklmnopqrstuvwxyz";

     return alterString(arg,str1,str2);

    }

 

 

 

// 반각 문자를 전각문자로

    function convert2ByteChar(x_char) {

        var x_2byteChar = ""; //컨버트된 문자

        var c = x_char.charCodeAt(0);

        if(32 <= c && c <= 126) { //전각으로 변환될수 있는 문자의 범위

            if(c == 32) { //스페이스인경우 ascii 코드 32

                x_2byteChar = unescape("%uFFFC");

            } else {

                x_2byteChar = unescape("%u"+gf_DecToHex(c+65248));

            }

        }

        return  x_2byteChar;

    }

 

 

 

// 10진수를 16진수로

    function gf_DecToHex(x_dec) {

        var x_Hex = new Array();

        var x_serial = 0;

        var x_over16 = x_dec;

        var x_tempNum = 0;

        while(x_dec > 15) {

            var x_h = x_dec % 16;          //나머지

            x_dec = parseInt(x_dec/16); //

            x_Hex[x_serial++] = (x_h > 9 ? String.fromCharCode(x_h + 55) : x_h); //16진수코드변환

        }

 

 

 

    //마지막은 몫의 값을 가짐

        x_Hex[x_serial++] = (x_dec > 9 ? String.fromCharCode(x_dec + 55) : x_dec); //16진수코드변환

  

    //,나머지,나머지,.....

        var retValue = "";

        for(var i=x_Hex.length ; i>0 ;i--) {

            retValue += x_Hex[i-1];

        }

        return retValue;

    }

 

 

 

// input box space, &nbsp;등 만으로 넣고 장난 칠때 이들 문자 뺀 길이를 통해 유효성 체크한다...

    function CheckStr(strOriginal, strFind, strChange){

        var position, strOri_Length;

        position = strOriginal.indexOf(strFind); 

        while (position != -1){

            strOriginal = strOriginal.replace(strFind, strChange);

            position = strOriginal.indexOf(strFind);

        }

        strOri_Length = strOriginal.length;

        return strOri_Length;

    }

 

 

 

// 체크 박스에 체크가 되어 있으면 true

 function checkValidator(str) {

  if(str.checked) return true;

  else return false;

 }

 

 

 

 // 비밀번호는 4자 등 최대 최소 길이를 파람으로 주고 처리...

    function checkLength(str,minLng,maxLng){

        var ckstr = str.value.length;

        if (parseInt(ckstr) < parseInt(minLng) || parseInt(ckstr) > parseInt(maxLng)) return false;

        return true;

    }

 

 

 

// 숫자만 받아서 아니면 메세지 보여 주는

    function onlyNumber(objEv) {

        if(!isNum(objEv)){

            alert("숫자만 입력가능합니다.");

            objEv.value = "";

            objEv.focus();

            return;

        }

    }

 

 

 

// 숫자를 체크하다가 6자 등 원하는 만큼 이동후 다음 input 박스로 이동 시키는...

    function goJump(fname, len, goname){

        onlyNumber(fname);

        if (document.all[fname].value.length == len) document.all[goname].focus();

    }

 

 

 

// 주민등록번호 체크 로직

    function check_ResidentNO(str_f_num,str_l_num){ 

        var i3=0

        for (var i=0;i<str_f_num.length;i++){

         var ch1 = str_f_num.substring(i,i+1);

            if (ch1<'0' || ch1>'9') i3=i3+1;

        }

        if ((str_f_num == '') || ( i3 != 0 )) return false;

        var i4=0;

        for (var i=0;i<str_l_num.length;i++){

            var ch1 = str_l_num.substring(i,i+1);

            if (ch1<'0' || ch1>'9') i4=i4+1;

        }

        if ((str_l_num == '') || ( i4 != 0 )) return false;

        if(str_f_num.substring(0,1) < 4) return false;

        if(str_l_num.substring(0,1) > 2) return false;

        if((str_f_num.length > 7) || (str_l_num.length > 8)) return false;

        if ((str_f_num == '72') || ( str_l_num == '18'))  return false;

               

        var f1=str_f_num.substring(0,1)

        var f2=str_f_num.substring(1,2)

        var f3=str_f_num.substring(2,3)

        var f4=str_f_num.substring(3,4)

        var f5=str_f_num.substring(4,5)

        var f6=str_f_num.substring(5,6)

        var hap=f1*2+f2*3+f3*4+f4*5+f5*6+f6*7

        var l1=str_l_num.substring(0,1)

        var l2=str_l_num.substring(1,2)

        var l3=str_l_num.substring(2,3)

        var l4=str_l_num.substring(3,4)

        var l5=str_l_num.substring(4,5)

        var l6=str_l_num.substring(5,6)

        var l7=str_l_num.substring(6,7)

        hap=hap+l1*8+l2*9+l3*2+l4*3+l5*4+l6*5

        hap=hap%11

        hap=11-hap

        hap=hap%10

        if (hap != l7) return false;

        return true;

    }

 

 

 

// 바이트 구하기

    function getByteLen(str){

        return(str.length+(escape(str)+"%u").match(/%u/g).length-1);

    }

 

 

 

 // url 가져오기

    function getUrlAddress(){

        var pageUrl = document.location;

     pageUrl  = new String(pageUrl);

      return pageUrl.substring(0,pageUrl.lastIndexOf("/"));

    }

 

 

 

// 오른마우스 금지, 나중에 해당 주석 풀고 사용

    function rightbutton(e){

        if (navigator.appName == 'Netscape' &&  (e.which == 3 || e.which == 2))

            return false;

        else if (navigator.appName == 'Microsoft Internet Explorer' && (event.button == 2 || event.button == 3))

        {

            alert("죄송합니다!! 정보무단복제를 막기 위하여 오른쪽 마우스 사용을 허용하지 않습니다.");

            return false;

        }

        return true;

    }

 

 

 

//document.onmousedown=rightbutton;

 

// 컨트롤 키 금지, 나중에 해당 주석 풀고 사용

    function checkCtl(){

        if (document.all){

            if(event.keyCode==17) {

                alert("죄송합니다!! 컨트롤키 사용을 허용하지 않습니다.");

                return false;

            }

        }

    }

 

 

 

//document.onkeydown = checkCtl;

 

 function setCookie(name,value) {

     document.cookie = name+"="+escape(value)+";path=/;domain=.kkaok.pe.kr;";

 }

 

 function setCookie(name,value, expires) {

     document.cookie = name + "=" + escape(value) +

     "; path=/; expires=" + expires.toGMTString();

 }

 

 function getCookie(Name) {

     var search = Name + "="

     if (document.cookie.length > 0) { // 쿠키가 설정되어 있다면

         offset = document.cookie.indexOf(search)

         if (offset != -1) { // 쿠키가 존재하면

             offset += search.length

         // set index of beginning of value

             end = document.cookie.indexOf(";", offset)

         // 쿠키 값의 마지막 위치 인덱스 번호 설정

             if (end == -1)

                 end = document.cookie.length

             return unescape(document.cookie.substring(offset, end));

         }

     }

 }

 

 

 

    String.prototype.trim = function(){

        return this.replace(/(^\s*)|(\s*$)/gi, "");

    }

 

//문자 바꾸기, 사용법 var str = 문자열.replaceAll("a", "1"); 

    String.prototype.replaceAll = function(str1, str2) {

        var temp_str = "";

        if (this.trim() != "" && str1 != str2) {

            temp_str = this.trim();

            while (temp_str.indexOf(str1) > -1){

                temp_str = temp_str.replace(str1, str2);

            }

        }

        return temp_str;

    }

 

//-->

 

 

Posted by 1010
반응형
script>

<!--

//---------------------------------------------------------------------------//

//                                StringUtil                                 //

//---------------------------------------------------------------------------//

 

/**----------------------------------------------------------------------------

 함수명 : removeWhiteSpace()

   : 문자열에 포함된 공백, 개행문자 제거

 인자값 : String strTarget - 문자열에 포함된

                             공백, 개행문자를 제거하고자하는 문자열

   : String - 좌우 공백이 제거된 문자열

 사용법 : var strResult = trim('  문 자 열  ');

          return '문자열'

-----------------------------------------------------------------------------*/

function removeWhiteSpace(strTarget)

{

    var strEliminate = /\s+/g;

 

    if(strTarget)

    {

        return strTarget.replace(strEliminate,"");

    }

    else

    {

        return strTarget;

    }

 }

 

 

/**----------------------------------------------------------------------------

 함수명 : trim()

   : 좌우 공백 제거

 인자값 : String strTarget - 좌우 공백을 없애고자하는 문자열

   : String - 좌우 공백이 제거된 문자열

 사용법 : var strResult = trim('  문 자 열  ');

          return '문 자 열'

-----------------------------------------------------------------------------*/

function trim(strTarget)

{

    var strEliminate = /(^\s*)|(\s*$)/gi;

   

    if(strTarget)

    {

        return strTarget.replace(strEliminate,"");

    }

    else

    {

        return strTarget;

    }

 }

 

 

/**----------------------------------------------------------------------------

 함수명 : ltrim()

   : 좌측 공백 제거

 인자값 : String strTarget - 좌측 공백을 없애고자하는 문자열

   : String - 좌측 공백이 제거된 문자열

 사용법 : var strResult = ltrim('  문 자 열  ');

          return '문 자 열 '

-----------------------------------------------------------------------------*/

 

function ltrim(strTarget)

{

    while(strTarget.substring(0,1)==" ")

    {

        strTarget = strTarget.substring(1);

    }

    return strTarget;

 }

 

 

/**----------------------------------------------------------------------------

 함수명 : rtrim()

   : 우측 공백 제거

 인자값 : String strTarget - 우측 공백을 없애고자하는 문자열

   : String - 우측 공백이 제거된 문자열

 사용법 : var strResult = rtrim('  문 자 열  ');

          return ' 문 자 열'

-----------------------------------------------------------------------------*/

function rtrim(strTarget)

{

    var len = strTarget.length;

   

    while(strTarget.substring(len-1,len)==" ")

    {

        strTarget = strTarget.substring(0,len-1);

        len = strTarget.length;

    }

    return strTarget;

 }

 

 

/**----------------------------------------------------------------------------

 함수명 : replaceAll()

   : 소스문자열에 포함된 문자를 원하는 문자로 변환

          공백 또는 '0'을 자리수만큼 채운 문자열

 인자값 : String strSrc - 소스 문자열

          String strOld - 총 자릿수

          String strNew - 숫자인가?             (옵션 default : false)

   : String - 소스 문자열을 포함해 원하는 위치에

                   공백 또는 '0'을 자리수만큼 채운 문자열

 사용법 : var strResult = packValue('1234', 8, true, true);

          return '00001234'

-----------------------------------------------------------------------------*/

function replaceAll(strSrc, strOld, strNew)

{

 

    var retValue = "";

 

    if(strOld == null)

    {

        return strSrc;

    }

    if (strSrc != "" && strOld != strNew)

    {

        retValue = strSrc;

 

        while (retValue.indexOf(strOld) > -1)

        {

            retValue = retValue.replace(strOld, strNew);

        }

    }

    return retValue;

}

 

 

// 문자 변환 함수 (=replaceAll() 함수와 동일)----------------------------------

function alterString(strSrc, strOld, strNew)

{

    var retValue = "";

 

    for(i = 0; i < strSrc.length; i++)

    {

        var value = strSrc.charAt(i);

        var index = strOld.indexOf(value);

 

        if(index >= 0)

        {

            value = strNew.charAt(index);

        }

        retValue += value;

    }

    return retValue;

}

 

 

/**----------------------------------------------------------------------------

 함수명 : formatString()

   : 포멧 문자열 변환

 인자값 : String strSrc    - 변환하고자 하는 문자열

          String strFormat - 포멧형식

          String strDelim  - 포멧 구분자 문자

   : String - 원하고자 하는 포멧으로 변환된 문자열

 사용법 : var strResult = formatString('20050512', '9999/99/99');

          return ' 문 자 열'

-----------------------------------------------------------------------------*/

function formatString(strSrc,strFormat)

{

    var retValue = "";

    var j = 0;

 

    var strSrc = strSrc.replace(/(\$|\^|\*|\(|\)|\+|\.|\?|\\|\{|\}|\||\[|\]|\-|\/|\:)/g, "");

 

    for (var i=0; i< strSrc.length; i++)

    {

        retValue += strSrc.charAt(i);

        j++;

 

        if ( (j < strSrc.length && j < strFormat.length)

              && (strFormat.charAt(j) != "9"

              && strFormat.charAt(j).toLower != "x"

              && strFormat.charAt(j) != "#")  )

        {

            retValue += strFormat.charAt(j++);

        }

    }

    return retValue;

}

 

 

/**----------------------------------------------------------------------------

 함수명 : packValue()

   : 소스 문자열을 포함해 원하는 위치에

          공백 또는 '0'을 자리수만큼 채운 문자열

 인자값 : String strSrc - 소스 문자열

          Int    nSize  - 총 자릿수

          bool   bNum   - 숫자인가?             (옵션 default : false)

          bool   bLeft  - 왼쪽에 위치할 것인지? (옵션 default : true )

   : String - 소스 문자열을 포함해 원하는 위치에

                   공백 또는 '0'을 자리수만큼 채운 문자열

 사용법 : var strResult = packValue('1234', 8, true, true);

          return '00001234'

-----------------------------------------------------------------------------*/

function packValue(strSrc, nSize, bNum, bLeft)

{

    var retValue = "";

    var preValue = "";

    var postValue = "";

    var nLen = 0;

    var i = 0;

 

    if(bNum == null)

    {

        bNum = false;

    }

    if(bLeft == null)

    {

        bLeft = true;

    }

 

    strSrc = "" + strSrc;

    nLen = strSrc.length;

    retValue = strSrc;

 

    if(bNum)

    {

        for(i = nLen; i < nSize; i++)

        {

            if(bLeft)

            {

                preValue += "0";

            }

            else

            {

                postValue += "0";

            }

        }

    }

    else

    {

        for(i = nLen; i < nSize; i++)

        {

            if(bLeft)

            {

                preValue += " ";

            }

            else

            {

                postValue += " ";

            }

        }

 

    }

    retValue = preValue + retValue + postValue;

 

    return retValue;

}

 

 

/**----------------------------------------------------------------------------

 함수명 : getByte()

   : 문자열의 바이트수 구하기

 인자값 : String strSrc - 소스 문자열

   : Int - 문자열 바이트수

 사용법 : var nResult = getByte('가나다1234');

          return 10

-----------------------------------------------------------------------------*/

function getByte(strSrc)

{  

//  var nByte = 0;

//  for(var i=0; i < strSrc.length; i++)

//  {

//      if(!((strSrc.charCodeAt(i) > 0x3130 && strSrc.charCodeAt(i) < 0x318F)

//          || (strSrc.charCodeAt(i) >= 0xAC00 && strSrc.charCodeAt(i) <= 0xD7A3)))

//      {

//          nByte += 1;

//      }

//      else

//      {

//          nByte += 2;

//      }

//  }

//  return nByte;

    return (strSrc.length+(escape(strSrc)+"%u").match(/%u/g).length - 1);

}

 

 

/**----------------------------------------------------------------------------

 함수명 : toUpper()

   : 소문자를 대문자로 변환

 인자값 : String strSrc - 소스 문자열

   : String - 대문자로 변환된 문자열

 사용법 : var strResult = toUpper('abc');

          return 'ABC'

-----------------------------------------------------------------------------*/

function toUpper(strSrc)

{

    var str1 = "abcdefghijklmnopqrstuvwxyz";

    var str2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

 

    return alterString(strSrc, str1, str2);

}

 

 

/**----------------------------------------------------------------------------

 함수명 : toLower()

   : 대문자를 소문자로 변환

 인자값 : String strSrc - 소스 문자열

   : String - 소문자로 변환된 문자열

 사용법 : var strResult = toLower('ABC');

          return 'abc'

-----------------------------------------------------------------------------*/

function toLower(strSrc)

{

    var str1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    var str2 = "abcdefghijklmnopqrstuvwxyz";

 

    return alterString(strSrc, str1, str2);

}

 

 

/**----------------------------------------------------------------------------

 함수명 : removeComma()

   : 문자열에 포함된 ','를 제거

 인자값 : String strSrc - 소스 문자열

   : String - ','가 제거된 문자열

 사용법 : var nResult = removeComma('123,456,789');

          return '123456789'

-----------------------------------------------------------------------------*/

function removeComma(strSrc)

{

    return strSrc.replace(/,/gi,"");

}

 

 

/**----------------------------------------------------------------------------

 함수명 : removeFormat()

   : 문자열에 포함된 포멧문자 ", . - / :"를 제거

 인자값 : String strSrc - 소스 문자열

   : String - ", . - / :"가 제거된 문자열

 사용법 : var nResult = removeComma('2005/03/12 12:24:00');

          return '20050312 122400'

-----------------------------------------------------------------------------*/

function removeFormat(strSrc)

{

    return strSrc.replace(/(\,|\.|\-|\/|\:)/g,"");

}

 

 

/**----------------------------------------------------------------------------

 함수명 : addComma()

   : 문자열에 포함된 ','를 제거

 인자값 : String strSrc - 소스 문자열

          bool   bSymbol - '+' 부호일때 보일것인가?

   : String - ','가 제거된 문자열

 사용법 : var nResult = addComma('1234567.12', true);

          return '+1,234,567.12'

-----------------------------------------------------------------------------*/

function addComma(strSrc, bSymbol)

{

    var strSymbol = '';

    var retValue  = '';

    var strTempSymbol = '';

    var strTempDotValue = '';

 

    var nLen      = 0;

 

    try

    {

        if(bSymbol == null)

        {

            bSymbol = false;

        }

 

        strSrc = strSrc.trim();

 

        if(strSrc.indexOf('.') != 0)

        {

            var nIndex = strSrc.indexOf('.');

            strTempDotValue = strSrc.substring(nIndex);

            strSrc = strSrc.substring(0, nIndex);

        }

   

        strTempSymbol = strSrc.substr(0,1);

        if(strTempSymbol == '+')

        {

            strSymbol = '+';

            strSrc = strSrc.substring(1);

        }

        if(strTempSymbol == '-')

        {

            strSymbol = '-';

            strSrc = strSrc.substring(1);

        }

 

        nLen = strSrc.length;

 

        for(var i=1; i <= nLen; i++)

        {

            retValue = strSrc.charAt(nLen - i) + retValue;

 

            if((i % 3 == 0) && ((nLen - i) != 0))

            {

                retValue = "," + retValue;

            }

        }

 

        if(bSymbol)

        {

            if(strSymbol == '')

            {

                strSymbol = '+';

            }

        }

        else

        {

            if(strSymbol == '+')

            {

                strSymbol = '';

            }

        }

        return strSymbol + retValue + strTempDotValue;

    }

    catch(e)

    {

    }

}

 

 

 

/**----------------------------------------------------------------------------

   윗 함수 사용법 : trim('aaa'); -> 변수.trim(); 또는 문자열.trim();

-----------------------------------------------------------------------------*/

String.prototype.removeWhiteSpace = function()

{

    return removeWhiteSpace(this);

}

 

String.prototype.trim = function()

{

    return trim(this);

}

 

String.prototype.ltrim = function()

{

    return ltrim(this);

}

 

String.prototype.rtrim = function()

{

    return rtrim(this);

}

 

String.prototype.replaceAll = function(strOld, strNew)

{

    return replaceAll(this, strOld, strNew);

}

 

String.prototype.formatString = function(strFormat)

{

    return formatString(this, strFormat);

}

 

String.prototype.packValue = function(nSize, bNum, bLeft)

{

    return packValue(this, nSize, bNum, bLeft);

}

 

String.prototype.getByte = function()

{

    return getByte(this);

}

 

String.prototype.toUpper = function()

{

    return toUpper(this);

}

 

String.prototype.toLower = function()

{

    return toLower(this);

}

 

String.prototype.removeComma = function()

{

    return removeComma(this);

}

 

String.prototype.removeFormat = function()

{

    return removeFormat(this);

}

 

String.prototype.addComma = function(bSymbol)

{

    return addComma(this, bSymbol);

}

 

-->

</script>

Posted by 1010
반응형

# 자바스크립트 라이브러리와 PHP함수 라이브러리를 같이 올립니다.
# 일부는 PHP스쿨에서 발췌하여 만든 소스입니다.



<!--

var n4 = (document.layers)?true:false;
var e4 = (document.all)?true:false;

//숫자만입력(onKeypress='return keyCheckdot(event)')
function keyCheck(e) {
if(n4) var keyValue = e.which
else if(e4) var keyValue = event.keyCode
if (((keyValue >= 48) && (keyValue <= 57)) || keyValue==13) return true;
else return false
}

//숫자및돗트입력(onKeypress='return keyCheckdot(event)')
function keyCheckDot(e) {
if(n4) var keyValue = e.which
else if(e4) var keyValue = event.keyCode
if (((keyValue >= 48) && (keyValue <= 57)) || keyValue==13 || keyValue==46) return true;
else return false
}

//공백제거
function Trim(string) {
for(;string.indexOf(" ")!= -1;){
string=string.replace(" ","")
}
return string;
}

//입력검사
function Exists(input,types) {
if(types) if(!Trim(input.value)) return false;
return true;
}

//영문검사+숫자검사(첫글자는 반드시영문)
function EngNum(input,types) {
if(types) if(!Trim(input.value)) return false;
var error_c=0, i, val;
for(i=0;i<Byte(input.value);i++) {
val = input.value.charAt(i);
if(i == 0) if(!((val>='a' && val<='z') || (val>='A' && val<='Z'))) return false;
else if(!((val>=0 && val<=9) || (val>='a' && val<='z') || (val>='A' && val<='Z'))) return false;
}
return true;
}

//영문검사+숫자검사
function EngNumAll(input,types) {
if(types) if(!Trim(input.value)) return false;
var error_c=0, i, val;
for(i=0;i<Byte(input.value);i++) {
val = input.value.charAt(i);
if(!((val>=0 && val<=9) || (val>='a' && val<='z') || (val>='A' && val<='Z'))) return false;
}
return true;
}

//영문검사+숫자검사+'_'
function EngNumAll2(input,types) {
if(types) if(!Trim(input.value)) return false;
var error_c=0, i, val;
for(i=0;i<Byte(input.value);i++) {
val = input.value.charAt(i);
if(!((val>=0 && val<=9) || (val>='a' && val<='z') || (val>='A' && val<='Z') || val=='_')) return false;
}
return true;
}

//영문검사
function Eng(input,types) {
if(types) if(!Trim(input.value)) return false;
var error_c=0, i, val;
for(i=0;i<Byte(input.value);i++) {
val = input.value.charAt(i);
if(!((val>='a' && val<='z') || (val>='A' && val<='Z'))) return false;
}
return true;
}

//숫자만입력
/*
function numberonlyinput() {
var ob = event.srcElement;
ob.value = noSplitAndNumberOnly(ob);
return false;
}
*/

//돈(3단위마다 컴마를 붙인다.)
function checkNumber() {
var ob=event.srcElement;
ob.value = filterNum(ob.value);
ob.value = commaSplitAndNumberOnly(ob);
return false;
}

//한정액(일정금액 이상이 되면 올라기지 않게 한다.)
function chkhando(money) {
var ob=event.srcElement;
ob.value = noSplitAndNumberOnly(ob);
if(ob.value > money) ob.value = money;
return false;
}

//이자율(소수점 사용가능)
function checkNumberDot(llen,rlen) {
if(llen == "") llen = 8;
if(rlen == "") rlen = 2;
var ob=event.srcElement;
ob.value = filterNum(ob.value);

spnumber = ob.value.split('.');
if( spnumber.length >= llen && (spnumber[0].length >llen || spnumber[1].length >llen)) {
ob.value = spnumber[0].substring(0,llen) + "." + spnumber[1].substring(0,rlen);
ob.focus();
return false;
}
else if( spnumber[0].length > llen ) {
ob.value = spnumber[0].substring(0,llen) + ".";
ob.focus();
return false;
}
else if(ob.value && spnumber[0].length == 0) {
ob.value = 0 + "." + spnumber[1].substring(0,rlen);
ob.focus();
return false;
}
ob.value = commaSplitAndAllowDot(ob);
return false;
}

//참조함수
function filterNum(str) {
re = /^\$|,/g;
return str.replace(re, "");
}

//참조함수(컴마불가)
function commaSplitAndNumberOnly(ob) {

var txtNumber = '' + ob.value;
if (isNaN(txtNumber) || txtNumber.indexOf('.') != -1 ) {
ob.value = ob.value.substring(0, ob.value.length-1 );
ob.value = commaSplitAndNumberOnly(ob);
ob.focus();
return ob.value;
}
else {
var rxSplit = new RegExp('([0-9])([0-9][0-9][0-9][,.])');
var arrNumber = txtNumber.split('.');
arrNumber[0] += '.';
do {
arrNumber[0] = arrNumber[0].replace(rxSplit, '$1,$2');
}
while (rxSplit.test(arrNumber[0]));

if (arrNumber.length > 1) {
return arrNumber.join('');
}
else {
return arrNumber[0].split('.')[0];
}
}
}

//참조함수(컴마가능)
function commaSplitAndAllowDot(ob) {

var txtNumber = '' + ob.value;
if (isNaN(txtNumber) ) {
ob.value = ob.value.substring(0, ob.value.length-1 );
ob.focus();
return ob.value;
}
else {
var rxSplit = new RegExp('([0-9])([0-9][0-9][0-9][,.])');
var arrNumber = txtNumber.split('.');
arrNumber[0] += '.';
do {
arrNumber[0] = arrNumber[0].replace(rxSplit, '$1,$2');
}
while (rxSplit.test(arrNumber[0]));

if (arrNumber.length > 1) {
return arrNumber.join('');
}
else {
return arrNumber[0].split('.')[0];
}
}
}

//숫자만가능
function noSplitAndNumberOnly(ob) {
var txtNumber = '' + ob.value;
if (isNaN(txtNumber) || txtNumber.indexOf('.') != -1 ) {
ob.value = ob.value.substring(0, ob.value.length-1 );
ob.focus();
return ob.value;
}
else return ob.value;
}


//바이트검사
function Byte(input) {
var i, j=0;
for(i=0;i<input.length;i++) {
val=escape(input.charAt(i)).length;
if(val== 6) j++;
j++;
}
return j;
}

//팝업메뉴
function popupmenu_show(layername, thislayer, thislayer2) {
thislayerfield.value = thislayer;
thislayerfield2.value = thislayer2;
var obj = document.all[layername];
var _tmpx,_tmpy, marginx, marginy;
_tmpx = event.clientX + parseInt(obj.offsetWidth);
_tmpy = event.clientY + parseInt(obj.offsetHeight);
_marginx = document.body.clientWidth - _tmpx;
_marginy = document.body.clientHeight - _tmpy ;
if(_marginx < 0) _tmpx = event.clientX + document.body.scrollLeft + _marginx ;
else _tmpx = event.clientX + document.body.scrollLeft ;
if(_marginy < 0) _tmpy = event.clientY + document.body.scrollTop + _marginy + 20;
else _tmpy = event.clientY + document.body.scrollTop ;
obj.style.posLeft = _tmpx - 5;
obj.style.posTop = _tmpy;

layer_set_visible(obj, true);
layer_set_pos(obj, event.clientX, event.clientY);
}
function layer_set_visible(obj, flag) {
if (navigator.appName.indexOf('Netscape', 0) != -1) obj.visibility = flag ? 'show' : 'hide';
else obj.style.visibility = flag ? 'visible' : 'hidden';
}
function layer_set_pos(obj, x, y) {
if (navigator.appName.indexOf('Netscape', 0) != -1) {
obj.left = x;
obj.top = y;
} else {
obj.style.pixelLeft = x + document.body.scrollLeft;
obj.style.pixelTop = y + document.body.scrollTop;
}
}


//페이지이동
function move(url) {
location.href = url;
}

//닫기
function toclose() {
self.close();
}

//위치변경
function winsize(w,h,l,t) {
if(window.opener) resizeTo(w,h);
}

//포커스위치
function formfocus(form) {
var len = form.elements.length;
for(i=0;i<len;i++) {
if((form.elements[i].type == "text" || form.elements[i].type == "password") && Trim(form.elements[i].value) == "") {
form.elements[i].value = "";
form.elements[i].focus();
break;
}
}
}

// 날짜,시간 format 함수 = php의 date()
function date(arg_format, arg_date) {
if(!arg_date) arg_date = new Date();

var M = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
var F = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
var K = new Array("일","월","화","수","목","금","토");
var k = new Array("日","月","火","水","木","金","土");
var D = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
var l = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
var o = new Array("전","후");
var O = new Array("오전","오후");
var a = new Array("am","pm");
var A = new Array("AM","PM");

var org_year = arg_date.getFullYear();
var org_month = arg_date.getMonth();
var org_date = arg_date.getDate();
var org_wday = arg_date.getDay();
var org_hour = arg_date.getHours();
var org_minute = arg_date.getMinutes();
var org_second = arg_date.getSeconds();
var hour = org_hour % 12; hour = (hour) ? hour : 12;
var ampm = Math.floor(org_hour / 12);

var value = new Array();
value["Y"] = org_year;
value["y"] = String(org_year).substr(2,2);
value["m"] = String(org_month+1).replace(/^([0-9])$/,"0$1");
value["n"] = org_month+1;
value["d"] = String(org_date).replace(/^([0-9])$/,"0$1");
value["j"] = org_date;
value["w"] = org_wday;
value["H"] = String(org_hour).replace(/^([0-9])$/,"0$1");
value["G"] = org_hour;
value["h"] = String(hour).replace(/^([0-9])$/,"0$1");
value["g"] = hour;
value["i"] = String(org_minute).replace(/^([0-9])$/,"0$1");
value["s"] = String(org_second).replace(/^([0-9])$/,"0$1");
value["t"] = (new Date(org_year, org_month+1, 1) - new Date(org_year, org_month, 1)) / 86400000;
value["z"] = (new Date(org_year, org_month, org_date) - new Date(org_year, 0, 1)) / 86400000;
value["L"] = ((new Date(org_year, 2, 1) - new Date(org_year, 1, 1)) / 86400000) - 28;
value["M"] = M[org_month];
value["F"] = F[org_month];
value["K"] = K[org_wday];
value["k"] = k[org_wday];
value["D"] = D[org_wday];
value["l"] = l[org_wday];
value["o"] = o[ampm];
value["O"] = O[ampm];
value["a"] = a[ampm];
value["A"] = A[ampm];

var str = "";
var tag = 0;
for(i=0;i<arg_format.length;i++) {
var chr = arg_format.charAt(i);
switch(chr) {
case "<" : tag++; break;
case ">" : tag--; break;
}
if(tag || value[chr]==null) str += chr; else str += value[chr];
}

return str;
}

// 해상도에 맞는 크기 사용
function screensize() {
self.moveTo(0,0);
self.resizeTo(screen.availWidth,screen.availHeight);
}

// 주민등록번호체크( 입력폼 1개)
function check_jumin(jumin) {
var weight = "234567892345"; // 자리수 weight 지정
var val = jumin.replace("-",""); // "-"(하이픈) 제거
var sum = 0;

if(val.length != 13) { return false; }

for(i=0;i<12;i++) {
sum += parseInt(val.charAt(i)) * parseInt(weight.charAt(i));
}

var result = (11 - (sum % 11)) % 10;
var check_val = parseInt(val.charAt(12));

if(result != check_val) { return false; }
return true;
}

// 주민등록번호체크( 입력폼 2개)
function check_jumin2(input, input2) {
input.value=Trim(input.value);
input2.value=Trim(input2.value);
var left_j=input.value;
var right_j=input2.value;
if(input.value.length != 6) {
alert('주민등록번호를 정확히 입력하세요.');
input.focus();
return true;
}
if(right_j.length != 7) {
alert('주민등록번호를 정확히 입력하세요.');
input2.focus();
return true;
}
var i2=0;
for(var i=0;i<left_j.length;i++) {
var temp=left_j.substring(i,i+1);
if(temp<0 || temp>9) i2++;
}
if((left_j== '') || (i2 != 0)) {
alert('주민등록번호가 잘못 입력되었습니다.');
j_left.focus();
return true;
}
var i3=0;
for(var i=0;i<right_j.length;i++) {
var temp=right_j.substring(i,i+1);
if (temp<0 || temp>9) i3++;
}
if((right_j== '') || (i3 != 0)) {
alert('주민등록번호가 잘못 입력되었습니다.');
input2.focus();
return true;
}
var l1=left_j.substring(0,1);
var l2=left_j.substring(1,2);
var l3=left_j.substring(2,3);
var l4=left_j.substring(3,4);
var l5=left_j.substring(4,5);
var l6=left_j.substring(5,6);
var hap=l1*2+l2*3+l3*4+l4*5+l5*6+l6*7;
var r1=right_j.substring(0,1);
var r2=right_j.substring(1,2);
var r3=right_j.substring(2,3);
var r4=right_j.substring(3,4);
var r5=right_j.substring(4,5);
var r6=right_j.substring(5,6);
var r7=right_j.substring(6,7);
hap=hap+r1*8+r2*9+r3*2+r4*3+r5*4+r6*5;
hap=hap%11;
hap=11-hap;
hap=hap%10;
if(hap != r7) {
alert('주민등록번호가 잘못 입력되었습니다.');
input2.focus();
return true;
}
return false;
}

// 비밀번호 체크
function check_passwd(input, input2, min) {
if(!input.value) {
alert('비밀번호를 입력해 주십시오.');
input.focus();
return false;
}
else if(BYTE(input.value) < min) {
alert('비밀번호의 길이가 너무 짧습니다.');
input.focus();
input.value='';
input2.value='';
return false;
}
else if(!input2.value) {
alert('확인비밀번호를 입력해 주십시오.');
input2.focus();
return false;
}
else if(input.value != input2.value) {
alert('비밀번호가 서로 다르게 입력되었습니다.');
input2.value='';
input2.focus();
return false;
}
else return true;
}

//콤마 넣기(정수만 해당)
function comma(val) {
val = get_number(val);
if(val.length <= 3) return val;

var loop = Math.ceil(val.length / 3);
var offset = val.length % 3;

if(offset==0) offset = 3;
var ret = val.substring(0, offset);

for(i=1;i<loop;i++) {
ret += "," + val.substring(offset, offset+3);
offset += 3;
}
return ret;
}

//문자열에서 숫자만 가져가기
function get_number(str) {
var val = str;
var temp = "";
var num = "";

for(i=0; i<val.length; i++) {
temp = val.charAt(i);
if(temp >= "0" && temp <= "9") num += temp;
}
return num;
}

//주민등록번호를 나이로 변환
function agechange(lno,rno) {
var refArray = new Array(18,19,19,20,20,16,16,17,17,18);
var refyy = rno.substring(0,1);
var refno = lno.substring(0,2);
var biryear = refArray[refyy] * 100 + eval(refno);

var nowDate = new Date();
var nowyear = nowDate.getYear();
return nowyear - biryear + 1;
}

//레디오박스 체크검사
function radio_chk(input, msg) {
var len = input.length;
for(var i=0;i<len;i++) if(input[i].checked == true && input[i].value) return true;
alert(msg);
return false;
}

//셀렉트박스 체크검사
function select_chk(input, msg) {
if(input[0].selected == true) {
alert(msg);
return false;
}
return true;
}

//새창띄우기
function open_window(url, target, w, h, s) {
if(s) s = 'yes';
else s = 'no';
var its = window.open(url,target,'width='+w+',height='+h+',top=0,left=0,scrollbars='+s);
its.focus();
}
//-->





<?
//셀렉트
function optionlist($optionlist, $getvalue="", $keyfield="key", $valuefield="value") {
foreach($optionlist as $key => $value) {
if($getvalue && $getvalue == ${$keyfield}) $chk = "selected";
else $chk = "";
echo "<option value='{${$keyfield}}' {$chk}>{${$valuefield}}</option>";
}
echo "\n";
}

//셀렉티드
function selected($checkkey, $getvalue="") {
echo "value='$checkkey'";
if($getvalue && $checkkey == $getvalue) echo " selected";
}

//체크드
function checked($checkkey, $getvalue="") {
echo "value='$getvalue'";
if($getvalue && $checkkey == $getvalue) echo " checked";
}

//주민번호 검사
function RegiNum($reginum) {
$weight = '234567892345'; // 자리수 weight 지정
$len = strlen($reginum);
$sum = 0;

if ($len <> 13) { return false; }

for ($i = 0; $i < 12; $i++) {
$sum = $sum + (substr($reginum,$i,1) * substr($weight,$i,1));
}

$rst = $sum%11;
$result = 11 - $rst;

if ($result == 10) {$result = 0;}
else if ($result == 11) {$result = 1;}

$jumin = substr($reginum,12,1);

if ($result <> $jumin) {return false;}
return true;
}

//사업자번호 검사
function comRegiNum($reginum) {
$weight = '137137135'; // 자리수 weight 지정
$len = strlen($reginum);
$sum = 0;

if ($len <> 10) { return false; }

for ($i = 0; $i < 9; $i++) {
$sum = $sum + (substr($reginum,$i,1) * substr($weight,$i,1));
}
$sum = $sum + ((substr($reginum,8,1)*5)/10);
$rst = $sum%10;

if ($rst == 0) {$result = 0;}
else {$result = 10 - $rst;}

$saub = substr($reginum,9,1);

if ($result <> $saub) {return false;}
return true;
}


//글자르기
function cut_str($msg,$cut_size,$tail="...") {
if($cut_size <= 0) return $msg;
$msg = strip_tags($msg);
$msg = str_replace("&mp;quot;","\"",$msg);
if(strlen($msg) <= $cut_size) return $msg;

for($i=0;$i<$cut_size;$i++) if(ord($msg[$i])>127) $han++; else $eng++;
if($han%2) $han--;

$cut_size = $han + $eng;

$tmp = substr($msg,0,$cut_size);
$tmp .= $tail;
return $tmp;
}

// 모든한글의 글자를 출력
function hangul_code() {
$count = 0;
for($i = 0x81; $i <= 0xC8; $i++) {
for($j = 0x00; $j <= 0xFE; $j++) {
if(($j >= 0x00 && $j <= 0x40) || ($j >= 0x5B && $j <= 0x60) || ($j >= 0x7B && $j <= 0x80) || ($j >= 0x00 && $j <= 0x40) ||
(($i >= 0xA1 && $i <=0xAF) && ($j >= 0xA1 && $j <= 0xFE)) || ($i == 0xC6 && ($j >= 0x53 && $j <= 0xA0)) ||
($i >= 0xC7 && ($j >= 0x41 && $j <= 0xA0))) continue;
echo chr($i).chr($j)." ";
$count++;
}
}
echo $count;
}

// 한글검사
function is_han($str) {
if(strlen($str) != 2) return false;

$i = ord ($str[0]);
$j = ord ($str[1]);

if($i < 0x81 || $i > 0xC8 || $j > 0xFE || ($j >= 0x00 && $j <= 0x40) || ($j >= 0x5B && $j <= 0x60) || ($j >= 0x7B && $j <= 0x80) ||
($j >= 0x00 && $j <= 0x40) || (($i >= 0xA1 && $i <=0xAF) && ($j >= 0xA1 && $j <= 0xFE)) ||
($i == 0xC6 && ($j >= 0x53 && $j <= 0xA0)) || ($i >= 0xC7 && ($j >= 0x41 && $j <= 0xA0))) return false;
else return true;
}



// 랜덤값 생성
function random_string($length) {
$randomcode = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
'A', 'B', 'C', 'd', 'E', 'F', 'G', 'H', 'x', 'J',
'K', 'b', 'M', 'N', 'y', 'P', 'r', 'R', 'S', 'T',
'u', 'V', 'W', 'X', 'Y', 'Z');
mt_srand((double)microtime()*1000000);
for($i=1;$i<=$length;$i++) $Rstring .= $randomcode[mt_rand(1, 36)];
return $Rstring;
}


// 디렉토리 리스트
function DirList($path="./") {
$path = opendir($path);
while($list = readdir($path)) if($list != "." && $list != "..") $Arraydir[] = $list;
closedir($path);
return $Arraydir;
}

// 15자리의 유일한 숫자값 만들기
function uniquenumber() {
$temparray = explode(" ", microtime());
$temparray2 = substr($temparray[0],2,5);
$number =$temparray[1].$temparray2;
return $number;
}

// 파일이름과 확장자 분리
function ExplodeFile($filename) {
$filename = strtolower($filename);
$elements = explode('.',$filename);
$elemcnt = count($elements)-1;
if(count($elements)==1) $ext = '';
else $ext = $elements[$elemcnt];
unset($elements[$elemcnt]);
$fname = implode($elements,'');

$fileinfo["name"] = $fname;
$fileinfo["ext"] = $ext;
return $fileinfo;
}

// 그림확장자
function ImageType($filename) {
$webimg = explodefile($filename);

$webext = $webimg["ext"];
$defineexp = array("gif","jpg","png");

$count = count($defineexp);

for($i=0;$i<$count;$i++) {
if($defineexp[$i] == $webext) return true;
}
return false;
}

// 유닉스날짜 포맷
function date_format($unixtime,$format="Y.m.d",$empty="&nbsp;") {
if($unixtime) return date($format, $unixtime);
else return $empty;
}

//YYYY-MM-DD 형식을 유닉스 타임으로
function unix_format($times, $operator="-", $type=true) {
if($type == true) {
$times = trim($times);
$arry = explode($operator,$times);
if(count($arry) != 3) return date_format(0);
$mktime = mktime(0,0,0,$arry[1],$arry[2],$arry[0]);
return date("U", $mktime);
} else {
$formats = "Y{$operator}m{$operator}d";
return date($formats, $times);
}
}

// 주민등록번호 포맷
function jumin_format($juminno, $cutno=3, $des="x", $empty="&nbsp;") {
$juminno = str_replace("-","",$juminno);
if(strlen($juminno) != 13) return $empty;
for($i=0;$i<$cutno;$i++) $x .= $des;
$juminno = substr($juminno,0,13-$cutno).$x;
$juminno = substr($juminno,0,6)."-".substr($juminno,6);
return $juminno;
}

// 홈페이지 포맷
function url_format($url, $ltype=false, $title=false, $other="", $htype="http://", $empty="&nbsp;") {
$url = eregi_replace("http://","",trim($url));
if($url) $url = $htype.$url;
else return $empty;

if($title) $turl = $title;
else $turl = $url;

if($ltype) return "<a href='{$url}' {$other}>{$turl}</a>";
else return $url;
}

// 전송값 초기화
function post_format($str, $type) {
switch($type) {
case "url":
$str = trim($str);
$str = eregi_replace("http://","",$str);
break;
case "num":
$str = trim($str);
$str = str_replace(",","",$str);
break;
}
return $str;
}

// 이메일 포맷
function mail_format($email, $ltype=false, $title=false, $empty="&nbsp;") {
$email = trim($email);
$title = trim($title);

if(!$email && !$title) return $empty;
else if(!$email) return $title;

if($title) $temail = $title;
else $temail = $email;

if($ltype) return "<a href='mailto:{$email}'>{$temail}</a>";
else return $email;
}

// 전화번호 포맷
function tel_format($num1, $num2, $num3, $format="-", $empty="&nbsp;") {
$num1 = trim($num1);
$num2 = trim($num2);
$num3 = trim($num3);

if(!$num1) $num1 = "02";

if($num2 && $num3) return $num1.$format.$num2.$format.$num3;
else return $empty;
}

// 문자 포맷
function text_format($str, $empty="&nbsp;") {
$str = trim($str);
if($str) return $str;
else return $empty;
}

// 새창띄우기
function win_format($title, $url, $target, $width, $height, $scrollbars=1, $empty) {
$title = text_format($title, $empty);
return "<a href='#' onclick=\"open_window('{$url}', '{$target}', {$width}, {$height}, {$scrollbars})\">{$title}</a>";
}

// 나이(주민등록번호를 이용)
function AGE_jumin($lno,$rno) {
$refArray = Array(18,19,19,20,20,16,16,17,17,18);
$refyy = substr($rno,0,1);

$biryear = $refArray[$refyy] * 100 + substr($lno,0,2);
$nowyear = date("Y");
return $nowyear - $biryear + 1;
}

// URL 존재확인
function URL_exists($url) {
$url = str_replace("http://", "", $url);
list($domain, $file) = explode("/", $url, 2); // 도메인부분과 주소부분으로 나눕니다.
$fid = fsockopen($domain, 80); // 도메인을 오픈합니다.
fputs($fid, "GET /$file HTTP/1.0\r\nHost: $domain\r\n\r\n"); // 파일 정보를 얻습니다.
$gets = fgets($fid, 128);
fclose($fid);

if(ereg("200 OK", $gets)) return TRUE;
else return FALSE;
}

// 조사 꾸미기
$array = "뵤 벼 뱌 배 베 보 버 바 비 뷰 부 브 뱨 볘 봐 봬 붜 붸 뵈 뷔 븨 뾰 뼈 뺘 빼 뻬 뽀 뻐 빠 삐 쀼 뿌 쁘 뺴 뼤 뽜 뽸 뿨 쀄 뾔 쀠 쁴 죠 져 쟈 재 제 조 저 자 지 쥬 주 즈 쟤 졔 좌 좨 줘 줴 죄 쥐 즤 쬬 쪄 쨔 째 쩨 쪼 쩌 짜 찌 쮸 쭈 쯔 쪠 쪠 쫘 쫴 쭤 쮀 쬐 쮜 쯰 됴 뎌 댜 대 데 도 더 다 디 듀 두 드 댸 뎨 돠 돼 둬 뒈 되 뒤 듸 뚀 뗘 땨 때 떼 또 떠 따 띠 뜌 뚜 뜨 떄 뗴 똬 뙈 뚸 뛔 뙤 뛰 띄 교 겨 갸 개 게 고 거 가 기 규 구 그 걔 계 과 괘 궈 궤 괴 귀 긔 꾜 껴 꺄 깨 께 꼬 꺼 까 끼 뀨 꾸 끄 꺠 꼐 꽈 꽤 꿔 꿰 꾀 뀌 끠 쇼 셔 샤 새 세 소 서 사 시 슈 수 스 섀 셰 솨 쇄 숴 쉐 쇠 쉬 싀 쑈 쎠 쌰 쌔 쎄 쏘 써 싸 씨 쓔 쑤 쓰 썌 쎼 쏴 쐐 쒀 쒜 쐬 쒸 씌 묘 며 먀 매 메 모 머 마 미 뮤 무 므 먜 몌 뫄 뫠 뭐 뭬 뫼 뮈 믜 뇨 녀 냐 내 네 노 너 나 니 뉴 누 느 냬 녜 놔 놰 눠 눼 뇌 뉘 늬 요 여 야 애 에 오 어 아 이 유 우 으 얘 예 와 왜 워 웨 외 위 의 료 려 랴 래 레 로 러 라 리 류 루 르 럐 례 롸 뢔 뤄 뤠 뢰 뤼 릐 효 혀 햐 해 헤 호 허 하 히 휴 후 흐 햬 혜 화 홰 훠 훼 회 휘 희 쿄 켜 캬 캐 케 코 커 카 키 큐 쿠 크 컈 켸 콰 쾌 쿼 퀘 쾨 퀴 킈 툐 텨 탸 태 테 토 터 타 티 튜 투 트 턔 톄 톼 퇘 퉈 퉤 퇴 튀 틔 쵸 쳐 챠 채 체 초 처 차 치 츄 추 츠 챼 쳬 촤 쵀 춰 췌 최 취 츼 표 펴 퍄 패 페 포 퍼 파 피 퓨 푸 프 퍠 폐 퐈 퐤 풔 풰 푀 퓌 픠";
function lastCon($str) {
global $array;
if(ord($str[strlen($str)-1]) < 128) return false;
$str = substr($str, strlen($str)-2);
if(strstr($array, $str)) return false;
return true;
}
function ul_rul($str) {
return $str.(lastCon($str) ? "을" : "를");
}
function gwa_wa($str) {
return $str.(lastCon($str) ? "과" : "와");
}
function un_num($str) {
return $str.(lastCon($str) ? "은" : "는");
}
function i_ga($str) {
return $str.(lastCon($str) ? "이" : "가");
}

// 도메인 또는 문서가 존재하는지 검사
function exists_url($url, $port="80") {
$fp = @fsockopen($url, $port);
if($fp) return true;
else return false;
}

// 숫자를 한글로 바꾸기
function numtokor($num) {
$text ='';
$d_symbol = array('4' => "만", '8' => "억", '12' => "조", '16' => "경", '20' => "해", '24' => "시", '28' => "양", '32' => "구", '36' => "간", '40' => "정", '44' => "재", '48' => "극", '52' => "항하사", '56' => "아승지", '60' => "나유타", '64' => "불가사의", '68' => "무량대수");
$p_symbol = array('0' => "", '1' => "십", '2' => "백", '3' => "천");
$t_symbol = array('0' => "", '1' => "일", '2' => "이", '3' => "삼", '4' => "사", '5' => "오", '6' => "육", '7' => "칠", '8' => "팔", '9' => "구");

if(substr($num,0,1) == '-') {
$num = substr($num ,1);
$text .= '마이너스';
}
$length_of_num = strlen($num);
if($length_of_num > 72) {
$text = "존재할 수 없는 수치 입니다.";
} else {
//실행
for ($k=0; $k< $length_of_num; $k++) {
$striped_value = substr($num, $k, 1);
$text .= $t_symbol[$striped_value];
$power_value = ($length_of_num - $k -1) % 4;
if ($striped_value <> 0) $text .= $p_symbol[$power_value];
if ($power_value == 0) $text .= $d_symbol[$length_of_num - $k -1];
}
}
return $text;
}

//검색쿼리작성
function querystring($query) {
if($query) {
$queryarray = explode("&", $query);
$count = count($queryarray);

foreach($queryarray as $key => $value) {
$array2st = explode("=", $value);
if($array2st[1]) {
if($querystring) $querystring .= "&".$value;
else $querystring = $value;
}
}

return $querystring;
}
else return "";
}

//페이징
function pagelist($tables, $nowpage, $primarykey , $chartline, $chartpage, $wheres="", $findquery="", $others="", $orders="", $urlquery="", $lastopt=true, $allopt=true, $firstbutton="[처음]", $prebutton="[이전]", $nextbutton="[다음]",$lastbutton="[끝]") {

if($wheres) $wheres = " where {$wheres} ";
if($others) $wheres .= " and {$others} ";

if(!$chartline) $chartline = 10;
if(!$chartpage) $chartpage = 10;

if(intval($nowpage) == 0) $nowpage = 1;
if(intval($nowstep) == 0) $nowstep = 1;

##마지막버튼 유무 체크
if($lastopt) {
$query = "select count(*) count from {$tables} {$wheres} {$others} {$findquery}";
$result = mysql_query($query);
$total = mysql_fetch_object($result);
#총카운트 $total->count;
}

##총검색수
if($allopt) {
$query = "select count(*) count from {$tables} {$wheres}";
$result = mysql_query($query);
$all = mysql_fetch_object($result);
#총검색수 $all->count;
}

##설정값계산
$nowstep = ceil($nowpage/$chartpage);
if($lastopt) {
$allstep = ceil($total->count/($chartpage*$chartline));
$allpage = ceil($total->count/$chartline);
}
$startpage = 1 + ($nowstep-1) * $chartpage;
$endpage = $startpage + $chartpage - 1;

if($lastopt && $endpage > $allpage) $endpage = $allpage;

##다음버튼 유무 체크
$nextline = $nowstep * $chartline * $chartpage;
$nextlimitquery = " limit {$nextline}, 1";
$query = "select {$primarykey} from {$tables} {$wheres} {$others} {$findquery} {$nextlimitquery}";
$result = mysql_query($query);
$nextok = mysql_affected_rows();

##처음버튼 및 이전버튼
if($nowstep > 1) {
$fir = " <a href='$PHP_SELF?$urlquery&nowpage=1'>{$firstbutton}</a> ";
$prepage = $startpage - $chartpage;
$pre = " <a href='$PHP_SELF?$urlquery&nowpage=$prepage'>{$prebutton}</a> ";
} else {
$fir = " <font color='#C0C0C0'>{$firstbutton}</font> ";
$pre = " <font color='#C0C0C0'>{$prebutton}</font> ";
}

##NEXT 버튼 활성화
if($nextok) {
$nextpage = $endpage + 1;
$next = " <a href='$PHP_SELF?$urlquery&nowpage=$nextpage'>{$nextbutton}</a> ";
} else {
$next = " <font color='#C0C0C0'>{$nextbutton}</font> ";
}

##중간페이지
for($i=$startpage;$i<=$endpage;$i++) {
if($i == $nowpage) $pagelist .= " <font color='#6600FF'><b>$i</b></font> ";
else $pagelist .= " <a href='$PHP_SELF?$urlquery&nowpage=$i'>$i</a> ";
}

##끝페이지
if($lastopt && $allstep > $nowstep) {
$lastpage = $allpage;
$last = " <a href='$PHP_SELF?$urlquery&nowpage=$nextpage'>{$lastbutton}</a> ";
} else {
$last = " <font color='#C0C0C0'>{$lastbutton}</font> ";
}


$firstlimit = 0 + ($nowpage-1) * $chartline;
$limitquery = " limit {$firstlimit}, {$chartline}";
$query = "select * from {$tables} {$wheres} {$others} {$findquery} {$orders} {$limitquery}";
$result = mysql_query($query);
while($fetch = mysql_fetch_array($result)) $get[] = $fetch;

$get[0]["count"] = count($get);
$get[0]["page"] = $fir.$pre." [ ".$pagelist." ] ".$next.$last;
if($lastopt) $get[0]["total"] = $total->count;
if($allopt) $get[0]["allto"] = $all->count;

return $get;

}

//업로드
function file_upload($upfile,$upfile_name,$upfile_size,$dir,$newfilename) {
if($upfile_size) {

$is_file = is_file("{$dir}/{$newfilename}");
if($is_file) unlink("{$dir}/{$newfilename}");

move_uploaded_file($upfile, "{$dir}/{$newfilename}");
chmod("{$dir}/{$newfilename}", 0644);

return true;

} else return false;
}

//현재디렉토리
function nowdir() {
global $DOCUMENT_ROOT;
global $PHP_SELF;
$getdir = pathinfo($DOCUMENT_ROOT.$PHP_SELF);
return $getdir["dirname"];
}


음..자바스크립트에서 333,333,333 을 333333333으로 만드려고 asp처럼 단순히 replace 하면 333333,333 이런값을 반환한다.

따라서 정규 표현식 사용해야함...

var re = /,/g;
var txt = "333,333,333";

txt = txt.replace(re,"");

요렇게 한후 alert(txt) 찍어보면 333333333 나옴




*)
i(대/소문자를 구분하지 않음)
g(발생할 모든 패턴에 대한 전역 검색)
gi(전역 검색, 대/소문자를 구분하지 않음) 

Posted by 1010
반응형

입력상자의 한글 영문모드 미리 결정하기

Input Method Editor (IME) for user text entry fields


회원가입 입력폼등에서 한글을 입력받아야 할 경우와 영문만 입력 받고 싶은 경우

input type에 style로 지정하여 정해진 한글/영문을 입력받을 수 있다

확인은 안한 사항은 IE 5.5 이상에서만 된다고 함.


<input type="text" name="id" style="ime-mode : disabled" size=12>


style="ime-mode:disabled" /* 영문만을 선택할수 있는 모드 */
 style="ime-mode:auto"    /* 한/영중 선택된 모드 */
 style="ime-mode:active"    /* Default로 한글모드 */
 style="ime-mode:inactive" /* Default로 영문모드 */

자바 스크립트 제어시에..

<html>
<head>
 <title>Untitled</title>
</head>
<script language="JavaScript" type="text/javascript">
function test(){
 alert(document.testForm.xxx.style);
 alert(document.testForm.xxx.style.imeMode);
}
</script>
<body onload="test()">

<form name="testForm">
<input type="text" name="xxx" style="ime-mode : disabled">
</form>

</body>
</html>

ime-mode가 아니라 imeMode이다.

Posted by 1010
반응형

=================================================================
키 | 코드(숫자)
=================================================================
0 = 48
1 = 49
~
9 = 57

A = 65
~
Z = 90

a = 97

~
z = 122

INSERT = 45
DELETE = 46

윈도우(왼쪽) = 91
윈도우(오른쪽) = 92
기능키 = 93

0(오른쪽) = 96
~
9(오른쪽) = 105

.(오른쪽) = 110
/(오른쪽) = 111
*(오른쪽) = 106
+(오른쪽) = 107
-(오른쪽) = 109

F1 = 112
~
F12 = 123

NUMLOCK = 144
SCROLLLOCK = 145
=(중간) = 187
-(중간) = 189
`(왼쪽콤마) = 192
\(중간) = 220
←(백스패이스) = 8
TAB = 9
ENTER = 13
SHIFT = 16
CTRL = 17
ALT = 18
PAUSEBREAK = 19
CAPSLOOK = 20
한/영 = 21
한자 = 25
ESC = 27

스패이스 = 32
PAGEUP = 33
PAGEDN = 34
END = 35
HOME =36
←(중간) = 37
↑(중간) = 38
→(중간) = 39
↓(중간) = 40
=================================================================
키 | 코드(숫자)
=================================================================

<html>
<head>
<script>
function key_check(){
alert("키번호는 [" +event.keyCode+ "] 입니다.");
}
</script>
</head>
<body onKeyDown='key_check();'>
</body>
</html>

Posted by 1010
반응형
[JS]parseInt()와 Number() 사용시 주의사항

var i = "01";


document.write(parseInt(i)) ---> 출력결과 : 0
document.write(Number(i))   ---> 출력결과 : 1


주의해서 사용하세요.^^

 
 

 
     
  • 음. 저도 비슷한 경험이 있습니다. 지금은 어떤지 모르겠지만 제작년 겨울 작업하다가 보니 parseInt() 시 07,08,09 정도에서 전부 값을 0으로 던지는 바람에 그부분을 Number()로 다 바꾸었던 기억이 나는군요. 그게 01에서도 같은 현상이 발생하지는 않았던거 같은데.. 음 그때는 IE 5.5로 테스트 했었지요. 지금도 비슷한 경우가 있다면 거참. 언제 고쳐질런지... ㅡㅡ;
  • 지나가다
  • 2003-07-10 16:57:48
  • x
  • 자바스크립트에서
    0으로 시작하는 스트링을 parseInt 하면 8진법 파싱합니다.
    그러나 8, 9 이런 글자가 포함되어 있으면 무조건 결과가 0입니다. (예외상황도 없이...)

    parseInt("01") 은 8진법 파싱 규칙에 따라 정확하게 1 이 나옵니다.
  • 자바클루
  • 2003-07-14 17:48:19
  • x
  • 아~하~ 그러쿠나~아~하~그러쿠나~
    감사요.
  • 붕냥붕
  • 2003-07-15 11:58:41
  • x
  • 저두 비슷한 경험이 있긴하는데 해결은...
    parseInt(i, 10);
    이렇게 하면 10진법으로 파싱하는데여..
  • 찡어
  • 2003-07-22 09:30:21
  • x
  • 정말 감사합니다...
    덕분에 오류원인을 알았습니다..(_ _)
  • gtman
  • 2003-07-31 11:43:00
  • x
  • 아.....
    0로 시작하니까...8진법...
    그렇구나....
  • ZZaN
  • 2003-08-11 21:32:45
  • x
  • number() 는 널값도 0으로 잘 되요~~
    parseInt()는 ㅡㅡ; NaN인가..이걸로 나오지요~
  • 하얀빛
  • 2003-09-19 15:18:12
  • x



내장 함수 …………………………………………………


내장함수란 자바스크립트 언어 자체에서 지원하는 함수로 자주 사용할 것으로 예상되는 것들을 함수로 만들어 둔 것을 얘기한다.
다음은 사용자 입력값을 가지고 계산을 할 때 꼭 필요한 함수들이다.!!!

■ eval()


eval("50")+50 또는

inta="50"
eval(inta)+50
숫자 형태를 가진 문자열이나 표현식을
숫자로 바꿔준다.

* 사용자 입력값을 계산을 위해 사용한다면 꼭 필요한 조치이다.
<script language="javascript">

document.write("50"+50) // 계산이 안되고 문자열 결합이 됨, 5050
document.write(eval("50")+50) // 100으로 계산됨

</script>



■ parseInt() / parseFloat()


paresInt("10.5")+50 또는

inta="10.5"
parseInt (inta)+50
숫자 형태를 가진 문자열이나 표현식을
정수나 실수로 바꿔준다.

* 사용자 입력값을 계산을 위해 사용한다면 꼭 필요한 조치이다.
<script language="javascript">

document.write("10.5"+50) // 계산이 안되고 문자열 결합이 됨
document.write(parseInt("10.5")+50) // 60으로 계산됨
document.write(parseFloat("10.5")+50) // 60.5으로 계산됨

</script>



■ isNaN()


isNaN("10.5") 또는

inta="10.5"
isNaN(inta)


// NaN : Not a Number
표현식이나 값이 숫자가 아닌지를 true/false 로 리턴함.

* 숫자가 아니면 true를 !!! (주의)

* 사용자 입력값이 숫자가 아닌지/인지를
판단하고자 할 때!!!
<script language="javascript">

document.write(isNaN("0050")) // false
document.write(isNaN("홍길동")) // true
document.write(isNaN(50)) // false (숫자일 경우 fasle!!!)

</script>



■ escape() / unescape()


escape("가") 또는

stra="가"
escape(stra)
unescape("%uAC00") 또는

inta="%uAC00"
unescape(inta)

알파벳과 숫자 및 *, @, -, _ , + , ., / 를 제외한 문자를 모두 16진수 문자로 바꾸어 준다

왼쪽과 반대로
<script language="javascript">

document.write(escape("가"))
document.write(unescape("%uAC00")) // "가"

</script>

parseInt()와 Number() 사용시 주의사항



Posted by 1010
반응형
 
  • HTML에 JavaScript 삽입
    <script language="javascript">
    JavaScript Statements
    </script>


  • HTML에 JavaScript 코드 파일 삽입
    <script language="javascipt" src="src.js">
    </script>


  • 변수의 대소문자 구분

  • 변수에 포함된 데이터의 형을 지정하지 않고, JavaScript 인터프리터가 변수에 포함된 데이터 형을 추적하고 변환.

  • JavaScript 데이터 형
    • 숫 자 형 : 정수와 부동 소수
    • BOOLEAN : true, false
    • STRING : 작은 따옴표나 큰 따옴표에 들어가 있는 값으로, 특수문자 포맷 사용시에는 '\'와 함께 사용.
    • null : 아무런 값도 없는 것으로, 변수를 초기화 시키거나 어떤 값이나 이벤트를 지울 때 사용됨
    • undefined : 변수만 만들고, 값을 할당하지 않은 상태

  • 유형간의 변환
    • 스트링 피연산자가 비스트링 연산자와 사용된 경우 다른 연산자를 모두 스트링으로 변환
    • BOOLEAN값은 1과 0으로 변환되어 수치 연산을 지원
    • null값은 스트링 연산에 대해서는 "null", 논리 연산에서는 false, 그리고 수치 연산에서는 0으로 각각 변환
    • 변환 함수
      • eval() : 스트링 표현식을 수치값으로 변환하고, 파라미터가 수치형태가 아닌 스트링 값이면 에러 발생
      • parseInt() : 스트링에 포함된 첫번째 정수를 리턴하고, 스트링이 정수로 시작되지 않으면 0을 리턴
      • parseFloat() : 스트링에 포함된 첫번째 부동 소수를 리턴하거나 스트링이 적절한 부동 소수로 시작되지 않으면 0을 리턴

  • 배열 : 값의 시퀀스를 정렬할 수 있는 객체로, JavaScript의 특수형으로 배열 사용 전엔 반드시 선언해야 한다.
    • 배열 선언 예
      arrayName = new Array(arrayLength)
      arrayName = new Array()
      arrayName = new Array(value0,value1, ..., valuen)

  • JavaScript만의 특수 연산자
    • comma(,) 연산자 : 두 표현식을 계산하고, 두 번째 표현식의 값 리턴
    • delete 연산자 : 객체의 프로퍼티나 배열 인덱스의 요소 삭제하고, 항상 undefined 값 리턴
    • new 연산자 : 객체 형의 인스턴스를 만들기 위해 사용
    • typeof 연산자 : 연산자의 형을 식별하는 스트링 값을 리턴
    • void 연산자 : 값을 리턴하지 않는다

  • 지역 변수와 전역 변수 : 함수 안에서만 사용되는 것을 지역 변수라 하고, 프로그램 내에서 사용되는 변수를 전역 변수라 하는 데, 지역 변수 사용시 반드시 var 키워드와 함께 선언해야 함

이벤트 처리!!

  • 이벤트 정의와 사용
    • 이벤트 : 사용자가 웹페이지나 기타 다른 브라우저에 수행한 작업으로 인한 결과
    • 이벤트 처리 : 이벤트로 인해 수행되는 프로세스
    • 이벤트 핸들러 : 프로세스를 수행하는 코드
    • 사용 예 : 사용자가 링크 위로 마우스를 갖다 대면 다이얼로그 박스를 표시한다거나, 폼에 입력한 데이터를 검증한다거나, 버튼을 클릭할 때 애니메이션을 나타내거나, Java 애플릿과 브라우저 플러그인이 상호작용을 하도록 한다.

  • JavaScript가 정의한 이벤트
    HTML 태그 JavaScript 이벤트 설명
    다양 mouseMove 마우스 이동
    <A>..</A> Click 마우스로 링크를 클릭
    dbClick 마우스를 링크위에서 더블클릭
    mouseDown 마우스 버튼을 누름
    mouseUp 마우스 버튼을 놓음
    mouseOver 마우스를 링크위로 이동
    mouseOut 링크 위에 있던 마우스를 링크 밖으로 이동
    keyDown 사용자가 키를 누름
    keyUp 사용자가 키를 놓음
    keyPress 사용자가 키를 눌렀다가 놓음
    <IMG> abort 사용자 액션으로 인해 이미지 로딩 작업을 중단함
    error 이미지 로딩하는 동안 에러 발생
    load 이미지가 로드되고 화면에 나타남
    keyDown 사용자가 키를 누름
    keyUp 사용자가 키를 놓음
    keyPress 사용자가 키를 눌렀다가 놓음
    <AREA> mouseOver 마우스가 클라이언트측 이미지맵의 한 영역으로 이동함
    mouseOut 마우스가 이미지맵 영역 밖으로 이동
    dbClick 사용자가 이미지맵의 한 영역을 더블클릭함
    <BODY>..</BODY> Click 사용자가 문서의 본문을 클릭
    dbClick 문서의 본문을 더블 클릭함
    keyDown 키를 누름
    keyUp 키를 놓음
    keyPress 키를 눌렀다가 놓음
    mouseDown 마우스 버튼을 누름
    mouseUp 마우스 버튼을 놓음
    <BODY>..</BODY>
    <FRAMESET>..</FRAMESET>
    <FRAME>..</FRAME>
    blur 윈도우에서 현재 입력 포커스가 사라짐
    error 윈도우가 로드되는 동안 에러 발생
    focus 입력 포커스가 현재 윈도우로 이동
    load 윈도우 로딩이 완료됨
    unload 윈도우를 종료함
    move 윈도우가 이동됨
    resize 윈도우의 크기가 바뀜
    dragDrop 윈도우에 객체를 드롭
    <FORM>..</FORM> submit 사용자가 폼을 제출
    reset 사용자가 폼을 재설정
    <INPUT TYPE="text"> blur 현재 입력 포커스가 텍스트 필드에서 사라짐
    focus 현재 입력 포커스가 텍스트 필드로 이동
    change 텍스트 필드가 변경되어 현재 입력 포커스가 사라짐
    select 텍스트 필드에 있는 텍스트가 선택됨
    <INPUT TYPE="password"> blur 패스워드 필드에서 입력 포커스가 사라짐
    focus 패스워드 필드에 입력 포커스 생김
    <TEXTAREA>..</TEXTAREA> blur 텍스트 영역이 현재 입력 포커스가 사람짐
    focus 텍스트 영역에 입력 포커스 생김
    change 텍스트 영역이 변경되어 입력 포커스가 사라짐
    select 텍스트 영역에서 텍스트가 선택됨
    keyDown 키를 누름
    keyUp 키를 놓음
    keyPress 키를 눌렀다 놓음
    <INPUT TYPE="button"> Click 버튼이 클릭됨
    blur 입력할 수 없도록 버튼이 흐려짐
    focus 입력할 수 있도록 포커스 생김
    mouseDown 버튼 위에서 왼쪽 마우스 버튼 누름
    mouseUp 버튼 위에서 왼쪽 마우스 버튼 놓음
    <INPUT TYPE="submit"> Click 제출 버튼이 클릭됨
    blur 제출 버튼에서 입력 포커스가 사라짐
    focus 제출 버튼에 입력 포커스 생김
    <INPUT TYPE="reset"> Click 리셋 버튼이 클릭됨
    blur 리셋 버튼에서 포커스가 사라짐
    focus 리셋 버튼에서 포터스가 놓임
    <INPUT TYPE="radio"> Click 라디오 버튼이 클릭
    blur 라디오 버튼에서 입력 포커스가 사라짐
    focus 라디오 버튼에 입력 포커스 생김
    <INPUT TYPE="checkbox"> Click 체크 박스가 클릭
    blur 체크 박스에서 입력 포커스가 사라짐
    focus 체크 박스에 입력 포커스 놓임
    <INPUT TYPE="file"> blur 파일 업로드 폼 요소에서 입력 포커스 사라짐
    change 사용자가 업로드될 파일을 선택
    focus 파일 업로드 폼 요소에 입력 포커스 놓임
    <SELECT>..</SELECT> blur 선택 요소가 현재 입력 포커스 잃음
    change 선택 요소가 변경되어 입력 포커스가 사라짐
    focus 선택 요소에 현재 입력 포커스가 놓임

  • 이벤트 처리 속성
    이벤트핸들링속성 실행되는 상황
    onAbort 이미지를 로딩하는 작업이 사용자의 한 행동으로 인해 취소되었음
    onBlur 문서나 윈도우, 프레임세트, 폼 요소에서 현재 입력 포커스가 사라짐
    onChange 텍스트 필드나 텍스트 영역, 파일 업로드 필드, 선택 항목이 변경되어 현재 입력 포커스가 사라짐
    onClick 링크나 클라이언트측 이미지맵 영역, 폼 요소가 클릭됨
    onDbClick 링크나 클라이언트측 이미지맵 영역, 문서가 더블 클릭됨
    onDragDrop 드래그된 객체가 윈도우나 프레임에 드롭됨
    onError 이미지나 윈도우, 프레임을 로딩하는 동안 에러가 발생함
    onFocus 문서나 윈도우, 프레임 세트, 폼 요소에 입력 포커스 놓임
    onKeyDown 키를 누름
    onKeyPress 키를 눌렀다 놓음
    onKeyUp 키를 놓음
    onLoad 이미지나 문서, 프레임이 로드됨
    onMouseDown 마우스 버튼 누름
    onMouseMove 마우스를 이동함
    onMouseOut 링크나 클라이언트측 이미지맵에서 마우스를 옮김
    onMouseOver 마우스를 링크나 클라이언트측 이미지맵으로 옮김
    onMouseUp 마우스 버튼을 놓음
    onMove 사용자가 윈도우나 프레임을 이동함
    onReset 폼의 리셋 버튼을 클릭하여 폼을 리셋시킴
    onResize 사용자가 윈도우나 프레임의 크기를 조절
    onSelect 텍스트는 텍스트 필드나 영역에서 선택됨
    onSubmit 폼이 제출됨
    onUnload 사용자가 문서나 프레임 세트를 종료함


객체 정의하기

  • 객체 유형 정의
    • 프로퍼티 : 객체에 들어 있는 데이터 값에 액세스할 때 사용.
    • 메소드 : 객체에 어떤 작업을 할 때 사용하는 함수.
  • 객체 유형 만들기
    사용자가 직접 객체 유형을 정의하고 특정 객체 인스턴스를 만들 수 있 는데 이렇게 만들려면 객체 유형의 특정 인스턴스를 만들 때 사용되는 함수를 정의하기만 하면 된다. 본래 이러한 생성자 함수는 다음과 같은 일을 한다.
    • 객체 유형의 프로퍼티에 값을 할당한다.
    • 객체 유형의 메소드로 사용할 수 있는 다른 함수를 지정한다.
  • 객체 사용 예
    1. table 객체의 정의 (table.js)
      function table_getValue(row,col){
        return this.data[row* this.columns+col ];
      }
      function table_setValue(row,col,value){
        this.data[row* this.columns+col ]=value;
      }
      function table_set(contents){
        var n=contents.length;
        for(var j=0;jthis.data[j]=contents[j];
      }
      function table_isHeader(row,col){
        return this.header[row* this.columns+col ];
      }
      function table_makeHeader(row,col){   this.header[row* this.columns+col ]=true;
      }
      function table_makeNormal(row,col){   this.header[row* this.columns+col ]=false;
      }
      function table_makeHeaderRow(row){   for(var j=0;j< this.columns+j)
          this.header[row* this.columns+col ]=true;
      }
      function table_makeHeaderColumn(col){   for(var i=0;i< this.rows;++i)
          this.header[i* this.columns+col ]=true;
      }
      function table_write(doc){
        doc.write("<TABLE BORDER="+ this.border+">");
        for(var i=0;i< this.rows;++i) {
          doc.write("<TR>");
          for(var j=0;j< this.columns;++j) {
            if( this.header[i* this.columns+j ]) {
              doc.write("<TH>");
              doc.write( this.data[i* this.columns+j ]);
              doc.write("</TH>");
            }
            else {
              doc.write("<TD>");
              doc.write( this.data[i* this.columns+j ]);
              doc.write("</TD>");
            }
          }
          doc.writeln("</TR>");
        }
        doc.writeln("</TABLE>");
      }
      funtion table(rows,columns) {
        this.rows=rows
        this.columns=columns
        this.border=0
        this.data=new Array(rows*columns)
        this.header=new Array(rows*columns)
        this.getValue=table_getValue
        this.setValue=table_setValue
        this.set=table_set
        this.isHeader=table_isHeader
        this.makeHeader=table_makeHeader
        this.makeNormal=table_makeNormal
        this.makeHeaderRow=table_makeHeaderRow
        this.makeHeaderColumn=table_makeHeaderColumn
        this.write=table_write
       
      }

    2. table 객체 사용하기
      <HTML>
      <HEAD>
      <TITLE>Defining Object Types</TITLE
      <SCRIPT LANGUAGE="JavaScript" SRC="table.js"><!-
      //-></SCRIPT>
      </HEAD>
      <BODY>
      <H1>Defining Object Types</H1>
      <SCRIPT LANGUAGE="JavaScript"><!-
      t=new table(3,4)
      contents=new
      Array("This","is","a","test","of","the","table","object.","Let's","see","it","work")
      t.set(contents)
      t.border=4
      t.makeHeaderColumn(0)
      t.write(document)
      //-></SCRIPT>
      </BODY>
      </HTML>

    3. 객체 유형에 프로퍼티와 메소드 추가
      : prototype 프로퍼티를 통해서 인스턴스화할 수 있는 미리 정의된 객체 유형에 프로퍼티와 메소드 추가
      사용 예
      <HTML>
      <HEAD>
      <TITLE>Updating Object Types </TITLE>
      <SCRIPT LANGUAGE="JavaScript" SRC="table.js"><!-
      //-></SCRIPT>
      </HEAD>
      <BODY>
      <H1>Updating Object Types</H1>
      <SCRIPT LANGUAGE="JavaScript"><!-
      function table_colorWrite(doc){
        ........
        함수 정의
        ........
        ........
      }
      t=new table(3,4)
      table.prototype.bgColor="Cyan"
      table.prototype.colorWrite=table_colorWrite
      .............
      .............
      t.colorWrite(document)
      //-></SCRIPT>
      </BODY>
      </HTML>

    4. 프로퍼티와 메소드 삭제
      delete objectName.propertyName
      delete objectName.methodName


브라우저 객체

객 체 용 도
window 객체 브라우저 윈도우나 윈도우 안에 있는 프레임에 액세스할 때 사용한다. 프로퍼티와 메소드를 참조할 때, window 객체가 존재하는 경우에는 "window."접두사를 붙일 필요가 없다
document 객체 현재 윈도우에 로드되어 있는 문서에 액세스할 때 사용한다. document 객체는 컨텐트를 제공하는 HTML 문서, 즉 HEAD와 BODY 태그가 있는 문서를 의미한다.
location 객체 URL을 나타낼 때 사용한다. 이 객체는 URL객체를 만들거나 URL의 일부분에 액세스하거나 기존의 URL을 수정할 때 사용할 수 있다.
history 객체 한 윈도우 안에서 액세스된 URL의 히스토리를 유지할 때 사용
frame 객체, frames 배열 HTML 프레임에 액세스할 때 사용
frames 배열은 윈도우안에 있는 모든 프레임에 액세스할 때 사용
link 객체, links 배열 하이퍼텍스트 링크의 텍스트 기반이나 이미지 기반 소스 앵커(anchor)에 액세스할 때 사용
links배열은 문서 안에 있는 모든 link 객체에 액세스할 때 사용한다. I.E.는 link 객체의 anchor객체를 결합한다.
anchor 객체, anchors 배열 하이퍼텍스트 링크의 타켓에 액세스할 때 사용
anchors 배열은 문서 안에 있는 모든 anchor 객체에 액세스할 때 사용
image객체, images 배열 HTML 문서에 삽입되어 있는 이미지에 액세스할 때 사용
images 배열은 문서 안에 있는 모든 image 객체에 액세스할 때 사용
area 객체 클라이언트측 이미지맵 안에 있는 영역에 액세스할 때 사용
applet 객체, applets 배열 Java 애플릿에 액세스할 때 사용
애플릿 배열은 문서 안에 있는 모든 애플릿에 액세스할 때 사용
event 객체, Event 객체 이벤트 발생에 대한 정보에 액세스할 때 사용
event 객체는 특정 이벤트에 대한 정보 제공
Event 객체는 이벤트를 식별하는 데 사용하는 상수 제공
form 객체, forms 배열 HTML 폼에 액세스시 사용
forms 배열은 문서 안에 있는 모든 폼에 액세스시 사용
element 객체 폼 안에 들어있는 모든 폼 요소에 액세스시 사용
text 객체 폼의 텍스트 필드에 액세스시 사용
textarea 객체 폼의 텍스트 영역 필드에 액세스시 사용
radio 객체 폼의 라디오 버튼 세트에 액세스하거나 세트 안에 있는 각각의 버튼에 액세스할 때 사용
checkbox 객체 폼의 체크 박스에 액세스할 때 사용
button 객체 Submit나 Reset 버튼이 아닌 폼 버튼에 액세스시 사용
reset 객체 폼의 Reset 버튼에 액세스시 사용
selet 객체 폼의 선택 리스트에 액세스시 사용
option 객체 option 객체는 선택 리스트의 요소에 액세스시 사용
password 객체 폼의 패스워드 필드에 액세스시 사용
hidden 객체 폼의 숨겨진 필드에 액세스시 사용
FileUpload 객체 폼의 파일 업로드 요소에 액세스시 사용
navigator 객체 스크립트를 실행하고 있는 브라우저에 대한 정보에 액세스시 사용
screen 객체 사용자의 화면의 색상 깊이와 크기에 대한 정보에 액세스시 사용
embed 객체, embeds 배열 삽입된 객체에 액세스시 사용
embeds 배열은 문서 안에 삽입된 모든 객체에 대한 액세스 제공
mimeType 객체, mimeTypes 배열 브라우저가 제공하는 특징 MIME 유형에 대한 정보에 액세스시 사용
mimeTypes 배열은 제공하는 모든 mimeType 객체의 배열
I.E.는 빈 배열을 리턴하면서 mimeTypes에 대해서 임시적으로 지원
plugin 객체, plugins 배열 특정 브라우저 플러그인에 대한 정보에 액세스시 사용
plugins 배열은 브라우저가 지원하는 모든 플러그인의 배열
I.E.는 빈 배열을 리턴하면서 plugins에 대해서 임시적으로 지원


window 객체

  • 모든 브라우저 스크립트의 기본적인 것으로, 브라우저가 자동으로 정의하는 최상위 레벨의 객체이다. 현재 열려 있는 각 윈도우에 대해 별도의 window 객체가 정의된다.

window 객체의 프로퍼티
프로퍼티 설 명
closed 윈도우가 닫혀 있는지 식별
defaultStatus 브라우저 윈도우의 하단의 상태바에 나타나는 디폴트 상대 메시지를 지정
document 윈도우에 표시되어 있는 현재 문서를 지정하는 객체
frames 윈도우 객체에 들어 있는 모든 프레임 객체로 구성된 배열
history 마지막으로 윈도우로 로드된 URL의 리스트를 포함하는 윈도우의 히스토리 객체
length window에 들어 있는 프레임의 수 식별
location window 객체와 관련된 URL을 지정하는 객체
name 윈도우의 이름 지정
offscreenBuffering 윈도우 정보의 오프스크린 버퍼링이 사용될 것인지를 지정하는 부울값
오프스크린 버퍼링은 윈도우를 나타내기 전에 윈도우의 모든 요소를 로드할 때 사용
opener 윈도우를 만들거나 열 수 있도록 해주는 window 객체 지정
parent 특정 윈도우를 포함하는 윈도우를 지정하는 시너님
self 참조될 현재 윈도우를 지정하는 시너님
status 브라우저 윈도의 하단의 상태 표시줄에 나타날 임시 메시지를 지정
top 중첩된 일련의 윈도우에서 맨 위에 있는 브라우저 윈도우를 의미하는 시너님
window 참조될 현재 윈도우를 식별하는 시너님

window 객체의 메소드
메 소 드 설 명
alert(text) 경고 다이얼로그 박스를 표시
blur() 포커스를 윈도우에서 옮긴다
setInterval(expression,milliseconds) 지정된 타임아웃 인터벌이 지난 이후에 표현식을 반복해서 평가하거나 함수를 불러온다.
clearInterval(interval) 이전에 설정된 인터벌 타이머를 클리어
setTimeout(expression,milliseconds) 타임아웃 기간이 지난 이후에 표현식을 평가하거나 함수를 호출한다.
clearTimeout(timer) 이전에 설정된 타임아웃을 클리어
close() 지정된 윈도우를 닫는다.
confirm(text) 확인 다이얼로그 박스를 나타낸다.
focus() 윈도우로 포커스를 가져간다.
open(url,name,[options]) 새로운 윈도우를 열고 새로운 window 객체를 만듬
prompt(text,defaultInput) 프롬프트 다이얼로그 박스를 나타낸다.
scroll(x,y) 윈도우를 특정 위치까지 스크롤한다.

open() 메소드의 옵션
옵 션 설 명
toolbar yes no 윈도우에 툴바 제공
location yes no 윈도우에 위치 필드 제공
directories yes no 디렉토리 버튼 제공
status yes no 상태 표시줄 제공
menubar yes no 메뉴바 제공
scrollbars yes no 스크롤 바 제공
resizable yes no 윈도우 크기 조절 가능
width 정수 윈도우의 폭(픽셀)
height 정수 윈도우의 높이(픽셀)


frame 객체

  • 프레임은 윈도우를 독립된 표시 영역들로 분할한 후, 이 영역들에 표시되는 정보들을 강력하게 컨트롤 할 수 있게 해준다.
  • 프레임 객체의 프로퍼티와 메소드는 window 객체와 같지만, close() 메소드는 지원하지 않는다.


document 객체

  • JavaScript 에서 아주 중요한 객체로, 이 객체를 사용하면 로드될 문서를 업데이트하고 로드된 문서 안에 있는 HTML 요소에 액세스할 수 있다.

프로퍼티 설 명
alinkColor <BODY> 태그의 alink 속성의 값 지정
anchor 문서에 들어 있는 배열을 참조하는 객체
anchors 문서에 들어 있는 모든 앵커의 배열
applet 문서에 들어 있는 애플릿을 참조하는 객체
applets 문서에 들어 있는 모든 애플릿의 배열
area 문서 안의 이미지맵 영역을 참조하는 객체
bgColor <BODY> 태그의 bgColor 속성의 값 식별
cookie 쿠키의 값 식별
domain 문서가 로드되는 서버의 도메인 이름 식별
embeds 문서안의 모든 플러그인의 배열
fgColor <BODY> 태그의 text 속성값 지정
form 문서 안의 폼을 참조하는 객체
Forms[] 문서 안의 모든 폼의 배열
image 문서 안의 이미지를 참조하는 객체
Images[] 문서 안의 모든 이미지의 배열
lastModified 문서가 마지막으로 수정된 날짜
link 문서 안의 링크를 참조하는 객체
links 문서 안의 모든 링크의 배열
linkColor <BODY> 태그의 link 속성의 값 식별
plugin 문서 안의 플러그인을 참조하는 객체
plugins[] 브라우저가 지원하는 플러그인을 나타내는 객체의 배열
referrer 문서에 대한 링크를 제공하는 문서의 URL
title 문서의 타이틀
URL 문서의 URL
vlinkColor <BODY> 태그의 vlink 속성의 값 식별

document 객체의 메소드
메 소 드 설 명
close() 문서의 객체를 만드는 데 사용된 스트림
open([mimeType][,"replace"]) 선택적인 MIME 유형으로 문서 객체를 만들 때 사용되는 흐름을 개시한다. "replace" 파라미터는 text/html MIME 유형과 함께 사용되어 히스토리 리스트에 있는 현재 문서를 대체
write(expr1[,expr2...,exprN]) 문서에 표현식의 값을 기록
write(expr1[,expr2...,exprN]) 개행 문자가 다음에 따라오는 문서에 표현식의 값 기록


navigator 객체

  • navigator 객체는 window 객체와 마찬가지로 브라우저 객체 모델에서 최상위 레벨의 객체이며, 스크립트를 실행할 때 사용되는 브라우저의 종류와 버전에 대한 정보 제공한다.

navigator 객체의 프로퍼티
프로퍼티 브라우저 지원 설 명
appCodeName N2, I.E3 브라우저 색상 이름
AppMinorVersion I.E4 브라우저 버전 번호
appName N2, I.E3 브라우저 이름
appVersion N2, I.E3 브라우저의 버전
browserLanguage I.E4 브라우저에 설정되어 있는 언어
connectionSpeed I.E4 브라우저가 네트워크에 연결되는 속도
cookieEnabled I.E4 브라우저가 쿠키를 허용하도록 설정되어 있는지의 여부
cpuClass I.E4 브라우저 실행시 사용되는 마이크로프로세서의 유형
onLine I.E4 브라우저가 현재 온라인 연결을 가지고 있는지 여부
Language N4, I.E4 브라우저에 설정되어 있는 언어
mimeTypes N3, I.E4 현재 브라우저가 지원하는 모든 MIME 유형의 배열
platform N4, I.E4 브라우저가 실행되는 운영체제 플랫폼
plugins N3, I.E4 현재 브라우저에 설치된 모든 플러그인의 배열
systemLanguage I.E4 운영체제의 디폴트 언어
userAgent N2, I.E3 브라우저에서 서버로 전송된 HTTP 프로토콜의 사용자 에이전트 헤더
userLanguage I.E4 사용자가 사용하는 언어
userProfile I.E4 사용자 프로파일 정보에 대한 액세스를 제공하는 객체

navigator 객체의 메소드
메 소 드 설 명
javaEnabled() 사용자가 브라우저의 Java 기능을 켜두었는지의 여부를 나타내는 부울값 리턴
taintEnabled() 사용자가 data tainting(보안 메커니즘)을 활성화했는지 여부를 나타내는 부울값 리턴
preference 서명이 되지 않은 스크립트가 보안 관련 프로퍼티를 얻고 설정할 때 사용


event 객체

event 객체의 프로퍼티
프로퍼티 브라우저 설 명
data N DragDrop 이벤트로 인해 드롭된 객체의 URL이 들어있는 스트링 배열
height, width N 윈도우나 프레인의 길이와 너비(픽셀표시)
pageX, pageY N 픽셀로 나타낸 커서의 수평/수직 위치(페이지에서의 상대적위치)
screenX, screenY N, I.E 픽셀로 나타낸 커서의 수평/수직 위치(화면에서의 상대적 위치)
layerX, layerY N 픽셀로 나타낸 커서의 수평/수직 위치, 이벤트가 발생한 레이어에 대한 상대적 위치. Resize 이벤트와 함께 사용하면 layerX와 layerY가 이벤트가 타겟으로 하는 객체의 길이와 너비 지정
clientX와 clientY I.E 픽셀로 나타낸 커서의 수평/수직 위치, 이벤트가 발생한 웹페이지에서의 상대적 위치
offsetX, offsetY I.E 픽셀로 나타낸 커서의 수평/수직 위치, 이벤트가 발생한 컨테이너에 대한 상대적 위치
X, Y I.E 픽셀로 나타낸 커서의 수평/수직 위치, 이벤트가 발생한 문서에 대한 상대적 위치
target N 이벤트가 전송된 원래 객체
srcElement I.E 이벤트가 전송된 원래 객체
type N, I.E 발생한 이벤트 유형
which N 눌려진 마우스 버튼(왼:1, 가:2, 오:3)이나 눌려진 키의 ASCII값
keyCode I.E 키 누름과 연관된 Unicode 키 코드를 식별
button I.E 이벤트가 발생했을 때 눌려진 마우스 버튼 식별(0:눌려진버튼없음, 1:왼, 2:오, 4:가)
modifiers N 마우스나 키 이벤트와 연관된 수정자 키(ALT_MASK,CONTROL_MASK,SHIFT_MASK,META_MASK)를 식별
altkey,ctrlkey,shiftkey I.E true나 false로 설정하여 이벤트가 발생했을 때 Alt키와 Control키, Shift 키 중에 어떤 것이 눌려졌는지 알려준다.
cancelBubble I.E true나 false로 설정하여 이벤트 버블링을 취소하거나 활성화한다.
fromElement, toElement I.E 이동 중인 HTML 요소 지정
reason I.E 데이터 소스 객체에 대한 데이터 전송 상태를 나타내는데 사용
returnValue I.E true나 false로 설정하여 이벤트 핸들러의 리턴값을 나타낸다. 이벤트 핸들러에서 true나 false를 리턴하는 것과 같다.
srcFilter I.E onfilterchange 이벤트를 시작하는 filter객체 지정

screen 객체

  • screen 객체의 프로퍼티
    • height : 사용자의 화면의 현재 높이(픽셀)
    • width : 사용자의 화면의 현재 너비(픽셀)
    • colorDepth : 사용자의 화면/비디오 카드에서 현재 지원하는 색상당 바이트 수


    form 객체

    • document 객체의 프로퍼티로 액세스되고, form 객체는 문서 안의 폼에 액세스할 수 있도록 해주고, 폼 관련 이벤트에 응답을 할 수 있도록 해주기 때문에 중요하다.
    form 객체의 프로퍼티
    프로퍼티 설 명
    action <FORM> 태그의 HTML action 속성에 대한 액세스 제공
    button GUI 컨트롤 버튼을 나타내는 객체
    checkbox 체크 박스 필드를 나타내는 객체
    elements 폼 안에 포함되어 있는 모든 필드와 GUI 컨트롤을 포함하는 배열
    encoding <FORM> 태그의 HTML enctype 속성에 대한 액세스 제공
    FileUpload 파일 업로드 폼 필드를 나타내는 객체
    hidden 숨겨진 폼 필드를 나타내는 객체
    length elements 배열의 길이에 대한 액세스 제공
    method <FORM> 태그의 HTML method 속성에 대한 액세스 제공
    name 폼의 이름 식별
    password 패스워드 필드를 나타내는 객체
    radio 라디오 버튼 필드를 나타내는 객체
    reset reset 버튼을 나타내는 객체
    select 선택 항목 리스트를 나타내는 객체
    submit submit 버튼을 나타내는 객체
    target <FORM> 태그의 HTML target 속성에 대한 액세스 제공
    text 텍스트 필드를 나타내는 객체
    textarea 텍스트 영역 필드를 나타내는 객체

    form 객체의 메소드
    메 소 드 설 명
    handleEvent() 지정된 이벤트에 대한 폼의 이벤트 핸들러를 호출할 때 사용
    submit() 폼을 제출시 사용
    reset 폼의 엔트리를 디폴트 값으로 재설정시 사용

    form 요소 객체의 프로퍼티
    객 체 프로퍼티 설 명
    button name 버튼의 name 속성에 대한 액세스 제공
    type 객체의 유형 지정
    value 객체의 값 지정
    checkbox checked 체크박스가 현재 체크되어 있는지를 식별
    defaultChecked 체크박스가 디폴트로 체크되어 있는지 식별
    name 체크박스의 HTML name 속성에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별
    FileUpload name 객체의 name 속성에 대한 액세스 제공
    type 객체의 type 속성에 대한 액세스 제공
    value 객체의 값 식별
    hidden name 객체의 name 속성에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별
    password defaultChecked 객체의 디폴트 값 식별
    name 객체의 name 속성에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별
    radio checked 라디오 버튼이 체크되어 있는지 식별
    defaultChecked 라디오 버튼이 디폴트로 체크되어 있는지 식별
    name 객체의 name 속성에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별
    reset name 객체의 name 속성에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별
    select length 선택 리스트의 길이 식별
    name 객체의 name 속성에 대한 액세스 제공
    option 선택 리스트가 제공하는 옵션 식별하는 배열
    selectedIndex 선택 리스트 안에서 처음 선택된 옵션 식별
    type 객체의 유형 식별
    submit name 객체의 name 속서에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별
    text defaultValue 텍스트 필드에 나타나는 디폴트 텍스트를 식별
    name 객체의 name 속성에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별
    textarea defaultValue 텍스트 영역 필드에 나타나게 되는 디폴트 텍스트 식별
    name 객체의 name 속성에 대한 액세스 제공
    type 객체의 유형 식별
    value 객체의 값 식별

    form 요소 객체의 메소드
    객 체 메 소 드 설 명
    button Click() 클릭된 버튼 시뮬레이트
    blur() 포커스 잃음
    focus() 포커스 맞춤
    checkbox Click() 클릭된 체크 박스 시뮬레이트
    blur() 포커스 잃음
    focus() 포커스 맞춤
    FileUpload blur() 포커스 잃음
    focus() 포커스 맞춤
    select() 입력 영역을 선택
    hidden 없음
    password blur() 포커스 잃음
    focus() 포커스 맞춤
    select() 패스워드 필드에 나타나는 텍스트를 하이라이트
    radio Click() 라디오 버튼 클릭 시뮬레이트
    blur() 포커스 잃음
    focus() 포커스 맞춤
    reset Click() 리셋 버튼 클릭 시뮬레이트
    blur() 포커스 잃음
    focus() 포커스 맞춤
    select blur() 포커스 잃음
    focus() 포커스 맞춤
    submit Click() 제출 버튼 클릭 시뮬레이트
    blur() 포커스 잃음
    focus() 포커스 맞춤
    text blur() 포커스 잃음
    focus() 포커스 맞춤
    select() 텍스트 필드에 있는 텍스트 하이라이트
    textarea blur() 포커스 잃음
    focus() 포커스 맞춤
    select() 텍스트 영역에 있는 텍스트 하이라이트


    location 객체

    • 윈도우에 로드되어 있는 현재 문서의 URL에 액세스하거나 새로운 문서를 로드할 때 사용

    location 객체의 프로퍼티
    프로퍼티 설 명
    hash URL의 앵커 부분(존재하는 경우)
    host URL의 hostname:port 부분
    hostname URL의 host부분
    href 전체 URL
    pathname URL의 경로명 부분
    port URL의 포트 부분
    protocol URL의 프로토콜 부분
    search URL의 쿼리 스트링 부분

    location 객체의 메소드
    • reload() : 윈도우의 현재 문서를 브라우저의 Reload 버튼에서 사용하는 정책에 따라 다시 로드
      • Every time : 문서는 매번 서버에서 다시 로드
      • Once per session : 서버의 문서의 날짜가 캐시에 저장되어 있는 문서보다 더 최신 날짜라는 것을 나타내면 문서는 세션당 한 번씩 서버에서 다시 로드된다. 문서가 캐시에 없는 경우에는 서버에서 로드
      • Never : 문서는 가능하면 캐시에서 다시 로드, 그렇지 않으면 서버에서 로드
    • replace() : URL을 파라미터로 취하여, 현재 문서 히스토리 목록에 있는 현재 문서위로 그 URL의 문서를 로드, 그러면 브라우저의 Back버튼을 클릭하여 이전 문서로 돌아갈 수 없음


    link 객체

    • link 객체는 document 객체의 프로퍼티로, 문서에 들어있는 텍스트나 이미지 링크를 캡슐화
    • links 배열은 문서에 들어있는 모든 링크의 배열
    • link 객체의 메소드
      handleEvent() : event 객체를 인자로 취하며 그 이벤트에 대해 적당한 이벤트 핸들러 호출

    link 객체의 프로퍼티
    프로퍼티 설 명
    hash URL의 앵커 부분(존재하는 경우)
    host URL의 hostname:port 부분
    hostname URL의 host부분
    href 전체 URL
    pathname URL의 경로명 부분
    port URL의 포트 부분
    protocol URL의 프로토콜 부분
    search URL의 쿼리 스트링 부분
    target 링크의 HTML, target 속성


    anchor 객체

    • HTML 문서 안에서 이름이 지정된 오프셋으로 사용되는 앵커 의미
    • anchors 배열에는 문서의 모든 앵커가 들어있음
    • 프로퍼티나 메소드 또는 이벤트를 전혀 가지고 있지 않음
    • HTML 문서와 관련하여 정의된 이름이 지정된 오프셋을 추적할 때 사용
    • anchor 객체는 HREF 속성을 포함하는 경우에 link 객체가 된다.


    history 객체

    • history 객체의 프로퍼티
      • current : 윈도우에 나타나는 현재 문서의 URL
      • length : History 리스트의 길이
      • next : History 리스트에서의 다음 URL
      • previous : History 리스트에서의 이전 URL
    • history 객체의 메소드
      • back() : History 리스트에 이전 문서를 로드. 브라우저의 Back 버튼을 클릭하는 것과 같은 효과
      • forward() : History 리스트에 다음 문서를 로드. 브라우저의 Forward 버튼을 클릭하는 것과 같은 효과
      • go() : History 리스트에 있는 특정 문서로 감
        • go(n) : n>0인 경우, 이 메소드는 History 리스트에서 n개의 엔트리가 앞에 있는 문서를 로드, n=0인 경우에는 현재 문서가 다시 로드되고, n<0인 경우엔 History 리스트에서 n개의 엔트리 뒤에 있는 문서를 로드
        • go(string) : go()는 이 스트링을 서브스트링으로 갖고 있는 URL의 History 리스트에서 가장 가까운 문서를 로드


    image 객체

    • document 객체의 프로퍼티
    • 문서와 함께 로드된 이미지에 대한 액세스 제공
    • images 배열은 문서 안에 지정되어 있는 각각의 <IMG>태그에 대한 엔트리가 들어있음
    • image 객체 유형을 사용하면 키워드와 생성자로 새로운 image 객체를 명시적으로 만들 수 있다. Image() 생성자는 웹페이지의 일부로서 처음에 나타나지 않는 이미지를 만들고 미리 로드할 때 사용한다. 이러한 image 객체는 브라우저의 캐시에 저장되면 이미 나타난 이미지를 대체할 때 사용
      * Image() 생성자를 사용하여 캐시된 이미지 만드는 예 cachedImage=new Image()
      cachedImage.src="myImage.gif"
      = > 첫번째 문장은 새로운 image 객체를 만들고 그것을 cachedImage 변수에 대입하고, 두번째 문장은 image 객체의 src프로퍼티를 myImage.gif 이미지 파일로 설정한다. 이 경우 myImage.gif는 브라우저 캐시로 로드된다. 그러면 로드된 이미지는 cachedImage 변수를 사용하여 참조 가능하다.

      image 객체의 프로퍼티
      프로퍼티 설 명
      border <:IMG> 태그의 BORDER 속성의 값
      complete 이미지가 완전히 로드되었는지 식별
      height <:IMG> 태그의 HEIGHT 속성의 값
      hspace <IMG> 태그의 HSPACE 속성의 값
      lowsrc <IMG> 태그의 LOWSRC 속성의 값
      name <IMG> 태그의 NAME 속성의 값
      prototype image 객체에 사용자 지정 프로퍼티를 추가할 때 사용
      src <IMG> 태그의 SRC 속성의 값
      vspace <IMG> 태그의 VSPACE 속성의 값
      width <IMG> 태그의 WIDTH 속성의 값


    area 객체

    • 이미지맵은 여러 가지 다른 영역으로 나누어져 있는 이미지로서 각각의 영역은 자체 URL과 관련되어 있다. 그리고 이러한 영역과 관련된 사용자 처리 방식으로 area 객체를 제공

    area 객체의 프로퍼티
    프로퍼티 설 명
    hash area 객체의 HREF 속성의 파일 오프셋 부분
    host area 객체의 HREF 속성의 호스트 이름 부분
    hostname area 객체의 HREF 속성의 host:port 부분
    href area 객체의 완전한 HREF 속성
    pathname area 객체의 HREF 속성의 경로명 부분
    port area 객체의 HREF 속성의 포트 부분
    protocol area 객체의 HREF 속성의 프로토콜 부분
    search area 객체의 HREF 속성의 쿼리 스트링 부분
    target area 객체의 TARGET 속성


    Array 객체

    • Array 객체를 사용하면 배열을 객체처럼 액세스 가능
    • Array 객체의 프로퍼티
      • length : 배열의 길이 식별
      • prototype : 모든 객체 유형이 지원하는 프로퍼티로 객체 유형에 대해 추가적인 프로퍼티 및 메소드 정의 가능
    • Array 객체의 메소드
      • toString() : 배열의 스트링 버전 리턴, 배열 요소는 컴마로 구분
      • join(separator) : 배열의 스트링 버전 리턴, 배열 요소는 seperator 스트링으로 구분, 분리자가 없으면 컴마로 구분
      • reverse() : 배열의 요소를 역순으로 바꿈
      • sort(comparisionFunction) : 비교 연산에 따라 배열의 요소 정렬. 비교 함수가 지정되면, 배열 요소는 사전순서로 정렬. 비교 연산이 지정되면 두개의 파라미터 p1,p2를 취하고, p1이 p2보다 작은 경우에는 음의 정수를 리턴하고, 같으면 0을 리턴하고, p1이 p2보다 크면 양의 정수 리턴


    Boolean 객체

    • Boolean 객체를 사용하면 부울값은 객체로서 액세스 가능
    • Boolean 객체는 생성자에 대한 인자로서 값을 식별하여 만들어짐 myBoolean=new Boolean(false)
      yourBoolean=new Boolean(true)
    • Boolean 객체의 프로퍼티
      • prototype : 모든 객체 유형이 지원하는 프로퍼티로 객체 유형에 대해 추가적인 프로퍼티 및 메소드 정의 가능
    • Boolean 객체의 메소드
      • toString() : 부울값에 해당하는 스트링 리턴
      • valueOf() : 객체의 값에 따라 true나 false로 리턴


    Date 객체

    Date 객체의 메소드
    메 소 드 설 명
    getDate()
    getUTCDate()
    setDate()
    setUTCDate()
    Date 객체의 날짜를 설정하거나 리턴
    getDay()
    getUTCDay()
    Date 객체의 한 주의 날짜를 설정하거나 리턴
    getHours()
    getUTCHours()
    setHours()
    setUTCHours()
    Date 객체의 시간를 설정하거나 리턴
    getMilliseconds()
    getUTCMilliseconds()
    setMilliseconds()
    setUTCMilliseconds()
    Date 객체의 밀리초 값을 설정하거나 리턴
    getMinutes()
    getUTCMinutes()
    setMinutes()
    setUTCMinutes()
    Date 객체의 분을 설정하거나 리턴
    getMonth()
    getUTCMonth()
    setMonth()
    setUTCMonth()
    Date 객체의 달을 설정하거나 리턴
    getSeconds()
    getUTCSeconds()
    setSeconds()
    setUTCSeconds()
    Date 객체의 초를 설정하거나 리턴
    getTime()
    getUTCTime()
    Date 객체의 시간을 설정하거나 리턴
    getTimeZoneOffset() Date 객체의 시간대 오프셋(분)을 리턴
    getYear()
    getFullYear()
    getUTCFullYear()
    setYear()
    setFullYear()
    setUTCFullYear()
    Date 객체의 연도를 리턴하거나 설정한다. 완전한 연도를 나타내는 방법으로 4자리 연도 값을 사용한다.
    toGMTString() 날짜를 Internet GMT(Greenwich Mean Time) 포맷의 스트링으로 변환
    toLocaleString() 날짜를 로케일(locale)포맷의 스트링으로 변환. 로케일 포맷이란 사용자가 위치해 있는 지형적 위치에서 일반적으로 사용하는 포맷 의미
    toString() Date 객체의 스트링 값을 리턴
    valueOf() 1970년 1월 1일 자정 이후의 밀리초 값 리턴
    toUTCString() UTC에서 시간을 나타내는 스트링 값을 리턴

    Date 생성자
    생 성 자 설 명
    Date() 현재 날짜와 시간으로 Date 인스턴스 만듬
    Date(dateString) dateString 파라미터에 지정되어 있는 날짜로, Date 인스턴스를 만든다. dateString의 포맷은 "월,일,연도,시:분:초"
    Date(milliseconds) 1970년 1월 1일 자정 이후 지정된 밀리초 값으로 Date 인스턴스를 만든다.
    Date(year,month,
    day,hours,minutes,
    seconds,milliseconds)
    년,월,일,시,분,초,밀리초 정수에 따라 지정된 날짜로 Date 인스턴스를 만든다. 연도와 월 파라미터는 제공되어야 하고 다른 나머지 파라미터가 포함되면 앞에 오는 모든 파라미터가 제공되어야 한다.


    Function 객체

    • 함수를 객체처럼 액세스 가능하고, 이 객체는 스크립트를 실행하는 동안에 함수를 동적으로 만들고 호출할 때 사용
    • Function 객체는 함수의 파라미터와 본문을 Function() 생성자에 제공하면 된다.
      variable=new Function("p1","p2", ... ,"pn","body")
    • Function 객체 프로퍼티
      • length : 함수에 대해 정의된 파라미터의 숫자 식별
      • prototype : 모든 객체 유형이 지원하는 프로퍼티로 객체 유형에 대해 추가적인 프로퍼티 및 메소드 정의 가능
      • arguments : 호출시 함수에 전달되는 인자를 가리키는 배열
      • caller : 특정 함수를 호출한 함수를 가리킴
    • Function 객체의 메소드
      • toString() : 함수의 스트링 형태 리턴
      • valueOf() : 함수 자체 리턴


    Global 객체

    • new Global() 을 통해서 명시적으로 만들거나, 참조할 수 없다. 대신 해당 프로퍼티와 메소드가 전역 변수와 함수로 직접 참조됨
    • Global 객체의 프로퍼티
      • Nan : 숫자가 아니라는 의미
      • Infinity : 양수 무한대 값 의미
    • Global 객체의 메소드
      • escape(string) : string을 새로운 스트링으로 변환
      • eval(x) : 표현식 x의 값을 계산하고 리턴
      • inFinite(number) : number가 유한하면 true를 리턴하고, 무한하면 false를 리턴
      • inNaN(number) : number가 숫자가 아니면 true를 리턴하고, 숫자이면 false를 리턴
      • parseFloat(string) : string을 부동 소수 값으로 파싱
      • parseInt(string,radix) : string을 밑이 radix인 정수로 파싱
      • unescape(string) : escape()에 들어 있는 스트링을 원래의 값으로 되돌린다.


    Math 객체

    • 수학적 상수와 함수의 표준 라이브러리 제공
    • Math의 특수 인스턴스는 Math가 내장 객체이고 객체 유형이 아니기 때문에 만들어지지 않는다.

    Math 프로퍼티
    프로퍼티 설 명
    E Euler의 상수. 이것은 계산을 하는 어디에서나 발견할 수 있으며 자연대수의 기초
    LN2 2의 자연대수. 이것은 자연대수와 밑이 2인 대수 사이의 전환에 사용되는 간단한 상수
    LN10 10의 자연대수. LN2와 마찬가지로 대수 변환에 사용
    LOG2E 밑이 2인 E의 대수. 이것은 밑이 10인 대수를 밑이 E인 대수로 변환시 사용
    PI 원의 원주 대 지름의 비율
    SQRT1_2 1/2의 제곱근은 많은 삼각법 계산에서 사용
    SQRT2 2의 제곱근은 대수식에서 흔히 사용

    Math 메소드
    메 소 드 설 명
    abs(x) x의 절대값 리턴
    acos(x) x의 아크 코사인값 라디안으로 리턴
    asin(x) x의 아크 사인값 라디안으로 리턴
    atan(x) x의 아크 탄젠트 값을 라디안으로 리턴
    atan2(x,y) (x,y)에 해당하는 극좌표의 각도를 리턴
    ceil(x) x보다 크거나 작은 최소 정수값 리턴
    cos(x) x의 코사인 값 리턴
    exp(x) eX를 리턴
    floor(x) x보다 작거나 같은 최대 정수값 리턴
    log(x) x의 자연대수 리턴
    max(x,y) x, y 중 큰 값 리턴
    min(x,y) x, y 중 작은 값 리턴
    pow(x,y) xy를 리턴
    random() 0과 1사이의 임의의 숫자 리턴
    round(x) x의 가장 가까운 정수로 반올림되는 값 리턴
    sin(x) x의 사인값 리턴
    sqrt(x) x의 제곱근 리턴
    tan(x) x의 탄젠트 값 리턴


    Number 객체

    • Number 객체 유형을 사용하면 숫자를 객체로 다룰 수 있다.
    • Number 객체의 프로퍼티
      • MAX_VALUE : 숫자는 가능한 최대 수치값
      • MIN_VALUE : 숫자는 가능한 최소 수치값
      • NaN : 숫자가 아니다
      • NEGATIVE_INFINITY : 숫자가 음수 무한대 값
      • POSITIVE_INFINITY : 숫자가 양수 무한대 값
      • prototype : 모든 객체 유형이 지원
    • Number 객체의 메소드
      • toString(radix) : 밑이 radix인 숫자를 나타내는 스트링 리턴
      • valueOf() : Number 객체의 수치값 리턴


    Object 객체

    • Object 객체는 다른 모든 객체들이 파생되어 나가는 기반 객체로 이것의 프로퍼티와 메소드는 다른 객체 유형들에서 사용 가능
    • Object 객체의 프로퍼티
      • prototype : 모든 객체 유형이 지원
      • constructor : 객체 생성자의 이름 식별
    • Object 객체의 메소드
      • toString() : 객체를 스트링 표현으로 바꾸는 역할
      • valueOf() : 객체와 관련된 경우의 원시값(숫자,스트링,부울값)을 리턴하고, 그렇지 않은 경우에는 객체 자체를 리턴


    String 객체

    • 스트링을 객체로 액세스 가능
    • String 객체의 프로퍼티
      • length : 문자에서 스트링의 길이 알아내는 역할
      • prototype : 모든 객체 유형이 지원
    String 메소드
    메 소 드 설 명
    charAt(index) 메소드가 적용되는 스트링의 지정된 인덱스에 있는 문자로 구성된 스트링을 리턴
    charCodeAt(index) 지정된 인덱스의 문자의 Unicode 인코딩 리턴
    fromCharCode(codes) 문자 코드의 컴마로 구분된 시퀀스에서 스트링 만듬
    indexOf(pattern) 스트링안에 들어있는 pattern 파라미터가 지정한 첫 번째 스트링의 인덱스 리턴, 패턴이 스트링 안에 들어있지 않으면 -1 리턴
    indexOf(pattern,startIndex) startIndex가 지정한 위치에서 검색을 시작하는 것을 제외하면 indexOf(pattern) 메소드와 같다.
    lastIndexOf(pattern) 스트링에 들어 있는 pattern 파라미터가 지정한 마지막 스트링의 인덱스 리턴, 패턴이 스트링 안에 들어있지 않으면 -1 리턴
    lastIndexOf(pattern,startIndex) startIndex가 지정한 위치에서 검색을 시작하는 것을 제외하면 lastIndexOf(pattern)과 같다.
    splitSeparator() 하나의 스트링을 분리자를 기반으로 하여 서브스트링의 배열로 분리
    substring(startIndex) startIndex에서 시작하는 스트링의 서브스트링을 리턴
    substring(startIndex,endIndex) startIndex에서 시작하고, endIndex에서 끝나는 스트링의 서브스트링을 리턴
    toLowerCase() 소문자로 변환된 스트링의 복사본 리턴
    toString() 객체의 스트링 값을 리턴
    toUpperCase() 대문자로 변환된 스트링의 복사본 리턴
    valueOf() 객체의 스트링 값을 리턴

  • Posted by 1010
    반응형

    Window 객체 속성

    • status 브라우저 상태바에 하단에 나타날 문자열
    • defaultStatus status에 지정된 문자열이 없을 때 나타날 문자열
    • self 자기 자신 객체
    • parent window 객체 간에 계층구조가 생길 때 상위 객체
    • top window 객체 간에 계층구조가 생길 때 최상위 객체
    • frames window 객체 안에 들어간 프레임들
    • opener open() 메소드로 윈도우를 연 문서가 있는 윈도우parent랑 비슷
    • pageXOffset 윈도우에 현재 나타나는 페이지의 x 위치
    • pageYOffset 윈도우에 현재 나타나는 페이지의 y 위치
    • locationbar 윈도우의 Locationbar를 보여줄지의 여부 지정
    • menubar 윈도우의 메뉴를 보여줄지의 여부 지정
    • personalbar 윈도우의 Personalbar(넷스케이프)를 보여줄지의 여부 지정
    • scrollbars 윈도우의 스크롤바를 보여줄지의 여부 지정
    • statusbar 윈도우의 상태선을 보여줄지의 여부 지정
    • toolbar 윈도우의 툴바를 보여줄지의 여부지정
    • tags HTML 문서에 사용된 모든 태그들
    • classes HTML 문서에 정의된 모든 스타일 시트 클래스들
    • innerHeight 윈도우에서 내용이 나타나는 영역의 높이 (NE only)
      IE는 clientHeight
      문법 : window.innerHeight
      문법 : document.body.clientHeight
    • innerWidth 윈도우에서 내용이 나타나는 영역의 너비 (NE only)
    • outerHeight 윈도우 바깥 테두리의 높이 (IE only)
    • outerWidth 윈도우 바깥 테두리의 너비 (IE only)

    Window 객체 메소드

    • alert() 경고창을 보여줍니다.
    • clearInterval() setInterval()메소드에의해 수행되고 있는 함수를 중지
    • clearTimeout() setTimeout()메소드에의해 수행되고 있는 함수를 중지
    • close() 창을 닫습니다
    • comfirm() 확인버튼이 있는 창 confirm dialog box를 띄운다
    • focus() 지정한 창에 focus를 맞춘다.
    • blur() 창에서 cursor가 벗어나서 focus를 읽은 상태(focus를 제거)
    • moveBy() 상대적 좌표로 창을 이동
    • moveTo() 절대위치로 창을 이동
    • open() 새로운 창을 열어줍니다
    • print() 화면의 내용을 인쇄
    • prompt() 입력란이 있는 대화상자 Prompt dialog box를 띄운다.
    • resizeBy() 상대크기로 창 크기를 변경
    • resizeTo() 절대크기로 창 크기를 변경
    • scroll() 창을 스크롤
    • scrollBy() 상대적 좌표로 창을 스크롤
    • scrollTo() 절대적 좌표로 창을 스크롤
    • setInterval() 실행할 수식을 지정한 시간 마다 반복 실행
    • setTimeout() 실행할 수식을 지정한 시간 후에 한 번 실행

    Window 창의 속성

    창 속성 옵션 의미

    • menubar yes/no, 1/0 메뉴바를 보여주거나 숨깁니다
    • toolbar yes/no, 1/0 도구막대를 보여주거나 숨깁니다
    • directories yes/no, 1/0 디렉토리바를 보여주거나 숨깁니다
    • scrollbars yes/no, 1/0 스크롤바를 보여주거나 숨깁니다
    • status yes/no, 1/0 상태표시줄을 보여주거나 숨깁니다
    • location yes/no, 1/0 주소표시줄을 보여주거나 숨깁니다
    • width 픽셀 팝업 윈도우의 가로크기를 지정합니다
    • height 픽셀 팝업 윈도우의 높이를 지정합니다
    • left 픽셀 팝업 윈도우의 x축 위치를 지정합니다
    • top 픽셀 팝업 윈도우의 y축 위치를 지정합니다
    • resizable yes/no 1/0 팝업윈도우의 크기를 사용자가 임의로 수정할 수 있는지 여부를 지정합니다
    • fullscreen 전체화면 모드로 열어줍니다
    Posted by 1010
    반응형
     

    하얀별님의 블로그의 내용을 바탕으로 나름 Test 해본것입니다.


    ajax_dbTest.htm


    <html><head>


    <script language=javascript>
      var xmlhttp = null;
      var tm; //ajax.html 화면에 찍는 시간
      var time;//ajax_dbTest.jsp에 넘기기위한 시간


    function getHttprequest() {


       /* 브라우져 셋팅*/

      if(window.XMLHttpRequest) {

       //파어이 폭스는 아래값으로 셋팅됨.
       xmlhttp = new XMLHttpRequest();
      } else {
       //인터넷 익스플로어는 아래값으로 셋팅됨.
       xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } //브라우져 셋팅 끝.


      //data.php를 호출한다.data.php에 값이 리로드 되는것을 확인하기 위해

      //일부러 시간값(time변수)을 2초마다 넘겨서 찍음.
      xmlhttp.open('get',"ajax_dbTest.jsp?time="+time+"",true);


      xmlhttp.onreadystatechange = function(){
        if(xmlhttp.readyState == '4'){ //readyState 4는 로딩된후, 값을 모두 받았음을 의미함.
          if(xmlhttp.status == 200) {

            //data.php에서 불러온 값이 data라는 변수에 담기게 된다.

            //실제로 window.alert(data)로 찍어봐도 확인 가능.

            //이 값을 ajax.html 화면에 찍기 위해 innerHTML 사용
            var data=xmlhttp.responseText;
            document.getElementById("test").innerHTML = data;

            //utf 설정 헤더를 넣을때 아래 추가
            //xmlhttp.setRequestHeader("Content-type", "application/x-www-urlencoded; charset=UTF-8");
          } //End of 200
        } //End of 4
      }

     xmlhttp.send(null);
        time=date(); //시간값을 호출하는 페이지 data.php에 넘겨보기 위해서 return
        setTimeout("getHttprequest()", 2000); //2초 마다 서버와 통신함
        return false; //setTimeout이 제대로 호출된다면 여기로는 넘어오지 않음
    }


    //현재 시간을 찍는 자바스크립트 함수
    function date(){
     
      var tm;
      var a=new Date();
      var b=a.getYear();
      var c=a.getMonth()+1;
      var d=a.getDate();
      var e=a.getHours();
      var f=a.getMinutes();
      var g=a.getSeconds();

      tm=b+"-"+c+"-"+d+" "+e+":"+f+":"+g+"";
      document.getElementById("tim").innerHTML = tm;
      return tm;
    }


    /*  리플레쉬 할때 setTimeout 대신 아래 함수 setInterval을 써도 됨.

    단, setInterval을 호출할때는 서버에 부하가 가므로, script밖에 호출할것.

    function refresh()
    {
    setInterval("getHttprequest()", 2000);
    }
    */


    </script>
    </head>


    <body onload="getHttprequest()">

    <!-- 시간찍는 테이블 -->
    <table border=1>
    <tr><td id='tim'>
    time:
    </td></tr>
    </table>


    <!-- 처음 로딩시 시간 자바스크립트 호출 -->
    <script>
    date();
    </script>


    <!-- data.php에서 찍는 db값이 이곳으로 들어옴 -->
    <table border=1>
    <tr>
     <td id='test'>start</td>
    </tr>
    </table>

    </body>
    </html>


     




    ajax_dbTest.jsp


    <%@ page import="
      java.util.*,
      java.sql.*,
      com.rsm.angel.sys.*
    "%>


    <%
      ResultSetHelper rsHelper;
      StringBuffer sql = new StringBuffer();
         JDBCHelper jdbc = new JDBCHelper();
      

      String poolName = "acrDS";
      sql = new StringBuffer();
     
       
      sql.append(" SELECT A.REC_FILENAME DATA1, A.APCUSTOMER_ID DATA2   ");
      sql.append("  FROM acr_v2.200701t_rec_data A        ");  
      sql.append("  WHERE  date_format(A.REC_START_DATE,'%Y%m%d') = '20070105' ");  
      sql.append("  ORDER BY A.REC_FILENAME DESC         ");
      sql.append("  LIMIT 10              ");

     
     
      System.out.println(sql.toString());
          
            try {
                jdbc.initPreparedStatement(sql , poolName) ;          
       jdbc.execStaticSQL() ;  
       rsHelper = ResultSetHelper.getResultSet(jdbc.getResultSet()) ;  
       
      } catch (Exception e) {
       
       throw e;
      }

       

     int iTotalRecord = 0;
     if (rsHelper != null) iTotalRecord = rsHelper.size();
    %>
    <HTML>
    <HEAD>
        <META HTTP-EQUIV="content-type" CONTENT="text/html; charset=euc-kr">
        <TITLE>DBCONNECTION TEST PAGE &nbsp; </TITLE>
        <LINK REL="stylesheet" HREF="./../css/smcc.css" TYPE="text/css">
        <SCRIPT LANGUAGE="JavaScript">
     <!--
      
        document.forms[0].submit();
     
     -->
     </SCRIPT>
    </HEAD>
    <BODY>
    <b><%=poolName%></b>
    <form action="_dbTest2.jsp" method="post">
    <input type="hidden" name="pageName" value="thisPage">
    <table border=1>
    <%
       for(int i = 0; i < iTotalRecord ; i++){
      rsHelper.next();
        %>
        <tr>  
            <td><%=rsHelper.getString("DATA1")%></td> 
        </tR>
        <%
           
        }
    %>
    </table>
    </BODY>
    </HTML>



    http://eticket.qubi.com/tn/index.jsp?radJoFlg=N&radJobId=1&txtGoStart=%BC%AD%B4%EB%C0%FC&txtGoStartCode=0001&txtGoEnd=%BF%B5%B5%EE%C6%F7&txtGoEndCode=0020&txtAbrdDt=&selGoYear=2007&selGoMonth=01&selGoDay=19&txtGoYoil=%B1%DD&txtGoHour=131100&selGoHour=13&selGoTrain=05&selGoRoom1=1&selGoSeat=15&pIndex=601&txtGoPage=1&txtGoAbrdDt=20070119&selGoRoom=1&useSeatFlg=&useServiceFlg=&checkStnNm=Y&SeandYo=&cp_no=tn&type_no=5&txtPnrNo=&hidRsvChgNo=&hidStlFlg=&hidRsvTpCd=




    '======================================================================================
    ' Refresh 설정 - initpage(), cmbTime_Onchange()
    '======================================================================================
    SUB star_Refresh()
       
            If chkRefresh.checked  = true then
             window.clearInterval  mstrInterval
       mstrInterval = window.setInterval("imgRetriview_OnClick()", cmbTime.value * 1000)
         END IF
      
    End Sub



    Window.routeEvent(), Event.TYPE, 15장 Window.clearInterval() ― 주기적으로 실행되는 코드를 중지시킨다 사용 가능한 버전 클라이언트측 자바스크립트...


    setInterval 함수는 특정한 간격대로 함수를 실행되도록 하고..clearInterval() 이 불러질때까지 계속 실행된다는거..아니면 윈도우가 닫히던가..할때까지 계속 실행됩니다.


    clearInterval 함수는 setInterval 함수로 정해진 것을 취소하는 함수입니다.

     

    아래 예제 역시 w3school에서 제공해주는 예제입니다.

    <html>
    <body>
    <input type="text" id="clock" size="35" />
    <script language=javascript>
    var int=self.setInterval("clock()",50)
    function clock()
      {
      var t=new Date()
      document.getElementById("clock").value=t
      }
    </script>
    </form>
    <button onclick="int=window.clearInterval(int)">
    Stop interval</button>
    </body>
    </html>
     
    window
     
    ps -ef|grep resin
    ps -ef|grep resin
    ps -ef|grep resin
    ps -ef|grep resin
    ps -ef|grep resin
    Starting Resin on Fri, 19 Jan 2007 14:02:57 +0900 (KST)
    [14:03:01.971] Proxy Cache disk-size=1024M memory-size=8M
    [14:03:02.382] Server[] starting
    [14:03:02.382]
    [14:03:02.383] HP-UX B.11.11 PA_RISC2.0
    [14:03:02.383] Java 1.5.0.01 jinteg:06.06.05-04:39 PA2.0 (aCC_AP), 32, mixed mode, KSC5601, ko, Hewlett-Packard Company
    [14:03:02.384] resin.home = /UNMS/resin-pro-3.0.21
    [14:03:02.384] server.root = /UNMS/resin-pro-3.0.21
    [14:03:02.385]
    [14:03:02.406] Socket JNI library is not available.
    [14:03:02.406] Resin will still run but performance will be slower.
    [14:03:02.406] To compile the Socket JNI library on Unix, use ./configure; make; make install.
    [14:03:02.431] http listening to *:80
    [14:03:02.436] hmux listening to localhost:6802
    [14:03:02.758] Host[210.207.153.100] starting
    [14:03:07.798] WebApp[http://210.207.153.100] starting
    [14:03:07.930] Resin started in 7420ms
     
    refresh_time
    Posted by 1010
    반응형
    /** * * 세션 끈기지 않게 하고 싶으면 자바스크립트 주석과 밑에 있는 *

    window.setInterval(실행구문, 밀리초) 메서드에 대하여

    setInterval메서드는 window 객체의 메서드로 특정 실행구문을  밀리초마다 반복실행합니다.


    실행구문은  문자열로 입력하여야 합니다.

    아래의 소스는 5초후에 newWin 객체에 close()메서드를 실행하여 창을 닫는 기능을 구현했습니다.


    <html>
    <head>
     <SCRIPT LANGUAGE="JavaScript">
     <!--
      var setTime = 5 // 종료하고자하는 시간
      function openWin(){
       var newWin = window.open('팝업url','popup','top=100,left=100,width=350,height=490')
       newWin.setInterval("self.close()", setTime*1000)
       
      }
     //-->
     </SCRIPT>
    </head>
    <body>
    <center>
    <a href="java-script:openWin()">
    내용
    </a>
    </center>
    </body>

    Posted by 1010
    반응형
    Internet Explorer 에서 Javascript 코드 디버깅 쉽게 하기
     작성자(아이디) alexlee  작성자(이름) 이호종
     메일주소 alex@whois.co.kr alex@whois.co.kr  홈페이지
     등록일 2006.10.02 16:06:11  등록 아이피 59.150.53.**
     수정일 2006.10.10 14:42:08  수정 아이피 59.150.53.**
     조회수 2,876  다운로드수 0
     카테고리 JavaScript
    MS IE에서 자바스크립트 오류를 디버깅하는 작업은, 사실 짜증의 연속이다. 에러가 발생해도 달랑 보여주는 메시지라는 게 원문의 몇번째 줄, 몇번째 문자에서 에러가 발생했다는 성의없는 팝업이 전부였다. (이에 비하면, 모질라의 파이어폭스는 제법 친절한 편이다.)

    이게 다 MS가 비주얼 스튜디오(VS)를 좀더 팔아먹으려는 속셈(?)이 아닌가 의심했던 적이 있었다. 비주얼 스튜디오에는 Step Into, Step Over 와 같은 디버깅 실행 명령 뿐만 아니라 Break Point 설정과 변수 Watch 까지 대부분의 디버깅 관련 기능들이 모두 들어 있기 때문이다.

    하지만, 좀더 찾아보니, MS에서도 거의 무료로 사용할 수 있는 괜찮은 자바스크립트 디버거를 제공하고 있었다. 그것도 두 가지 씩이나, 제공하고 있다. MSD(Microsoft Script Debugger), MSE(Microsoft Script Editor). 물론, 하도 꽁꽁 숨겨놓아서 쉽게 찾아 쓸 수가 없었다. MSD는 MS 웹사이트에서 여러번의 검색을 거쳐서 다운로드 받아서 설치할 수 있다. MSE는, 세상에, 누가 자바스크립트 디버거가 MS Office 패키지에 들어있다고 상상이나 할 수 있었을까! MS Office XP/2003 버전에 자바스크립트 디버거가 Microsoft Script Editor(MSE)라는 이름으로 들어있다. 그런데, 그냥 디폴트 설치로는 깔리지 않는다. 콕 찍어서 설치해야만 깔린다. (왜 이렇게 숨겨놓고 싶었던 것일까?)

    MSD는 완전히 무료 프로그램이다. 반면, MSE는 MS Office의 정식 라이센스가 필요한 프로그램이다. 하지만, 회사 업무용 컴퓨터의 경우 대부분 MS Office 라이센스가 있을 것이므로, 완전 공짜는 아니지만, 거의 공짜에 다름없이 사용할 수 있는 셈이다.

    이제 설치가 끝났다고, 해결된 게 아니다. 또다른 설정 작업이 남아있다. 자바스크립트 에러가 발생했을 때 자동으로 디버거가 작동하게 하려면, 확실하게 설정을 해줘야만 한다. (자동 연동 모드) 우선, 비슷한 이름으로 헷갈리게 만드는 Microsoft Script Debugger(MSD)를 설치해야 한다. 설치과정은 간단하다. 그냥 버튼만 꾹꾹 누르면 된다. 설치 완료 후에는 리부팅을 해야 하는 경우가 있다. 그게 싫으면, 설치 전에 모든 응용 프로그램 (특히 IE)을 모두 닫는다. 설치가 완료되면, IE의 보기(V) 메뉴에 스크립트 디버거(U)라는 항목이 생성되어 있는 것을 확인할 수 있다. 사실 MSD도 그런대로 쓸만한 디버거이다. MSE와 비교해보면, 변수값을 watching할 수 있는 창만 없고, 나머지 다른 기능들은 다 있다. 하지만, MSD를 사용해서 command window에서 변수 이름을 하나씩 입력해가며 디버깅하다 보면 성격이 나빠질 우려가 있다. 그러니 조금만 더 써서 MSE 까지 설치하는 편이 낫다.

    또다른 설정 작업 하나 더. IE : 도구 -> 인터넷 옵션 -> 고급 -> 스크립트 디버깅 사용 안함 항목이 언체크 되어 있어야 한다.

    이제, 스크립트 오류가 발생하면, 몇가지 대화박스에서 MSE를 선택할 것인지를 묻는 과정을 거쳐서, MSE가 본격적으로 작동하게 된다.

    MSD의 또다른 작동 방법은, 아예 바탕 화면에 아이콘으로 끌어내 놓고 독립적으로 실행하는 것이다. (독립 실행 모드) C:\Program Files\Microsoft Office\Office10\MSE7.EXE (XP에서는 Office10 폴더, 2003에서는 Office11 폴더 밑에 있음) 파일의 바로 가기를 바탕 화면에 생성한다. 그리곤, 더블 클릭을 해보면, MSE가 실행된다. 디버거 기능 외에도 HTML 화면 편집기로 사용해도 손색이 없다. 꽤 쓸만 한툴이다. 암튼, 자바스크립트 디버깅을 하기 위해서는 실행되고 있는 IE 프로세스와 연결을 해야 한다. 디버그(D)->프로세스(P) 메뉴를 누르면, 대화창이 열리는데, 현재 실행되고 있는 각종 응용 프로그램 프로세스 가운데에서 디버깅 하려는 IE 프로세스를 선택하여 '연결' 버튼을 누르면 된다.

    주의할 점은, MSD나 MSE 모두 현재 실행중인 프로세스에 '연결'되는 방식이기 때문에 MSD나 MSE를 닫으면 기존의 프로세스도 함께 닫혀 버린다는 것이다. 이걸 방지하려면, 디버깅이 끝난 후에는 디버그(D)->모두 분리(D) 메뉴를 누르면 된다.

     

    설치
    ---------
     

    MSD는 아래 링크에서 다운로드 받을 수 있다.

    [2006/10/10: MSE를 설치할 거라면, MSD는 설치하지 않는 게 좋겠다. MSD를 먼저 설치하면 MSE를 설치할 때 뭔가 영향이 있다. MSD는 그냥, 이런 게 있었다는 정도로만 기억해두고, MSE를 본격 설치해서 사용하자]

    [윈XP, 2000 이상] Download details: Script Debugger for Windows NT 4.0 and Later Script
    http://www.microsoft.com/downloads/details.aspx?familyid=2f465be0-94fd-4569-b3c4-dffdf19ccd99&displaylang=en

    [윈98, 윈Me] Debugger for Windows 98, Me, NT 4.0
    http://www.microsoft.com/downloads/details.aspx?FamilyId=E606E71F-BA7F-471E-A57D-F2216D81EC3D&displaylang=en

     

    MSE는 MS Office XP/2000 패키지에 들어있다.

    설치방법과 설정방법은, 다음과 같다.

    1. MS Office 설치 CD를 준비한다.

    2. 이미 MS Office가 설치되어 있다면, 워드, 엑셀, 파워포인트, 프론트페이지 중 하나를 실행한다.

    3. 도구->매크로->Microsoft Script Editor 항목을 클릭한다.

    4. 설치 프로그램 요청에 따라 MS Office 설치 CD를 넣고 해당 항목을 찾아서, 설치한다.

    * MS Office 를 처음 설치하는 경우에는, 커스텀 설치에서 MSE 항목을 찾아서 선택한 후 설치를 진행한다.

     

    요약
    ---------
     

    - IE 에서 사용할 수 있는 MS 디버거는 MSD, MSE가 있다. 둘은 조금 다르다. MSE를 자동 연동 모드로 사용하려면 MSD가 있어야 한다. MSE가 더 낫다.

    - MSE는 '자동 연동 모드'와 '독립 실행 모드' 두 가지로 실행할 수 있다.

    - 모든 스크립트 에러마다 팝업이 뜨는 '자동 연동 모드'가 불편할 때에는, IE : 도구->인터넷 옵션->고급->스크립트 디버깅 안함 항목을 체크하면 된다.

    - MSE 디버깅 작업이 끝났다고 바로 MSE 윈도우를 닫지 말고, 디버그(D)->모두 분리(D) 메뉴를 실행하여, MSE 와 디버깅 프로세스의 연결을 끊어 준다. 그래야 디버깅 하던 IE 프로세스가 계속 살아있게 된다.


    정정
    ---------
     
    회사에 있는 피씨는 워낙 많은 프로그램을 깔았다 지웠다를 반복해서 몹시 지저분해져 있다. 그래서 혹시나 하고 집에 있는 피씨에서 다시 실험해봄.

    역시나, MSE 하나만 설치해도 된다. 자동 연동 모드를 위해 MSD가 꼭 필요했던 게 아니었다. MSE 하나만으로도 자동 연동 모드와 독립 실행 모드 두 가지 모두 잘 돌아간다.

    더구나 실험을 했던 회사 피씨에서는 이상하게도 인터넷 옵션의 '스크립트 디버깅 안함' 항목을 선택하면 '보기' 메뉴에서 '스크립트 디버거' 항목 자체가 없어져 버리고, 리부팅하면 MSD마저 사라져 버리는 이상한 증세가 자꾸 발생하고 있다. 너무 오래 썼나 싶다. 깔끔하게 밀고 OS부터 새로 깔아야 할까 보다.

     

    다시 정정
    --------------
     
    인터넷 옵션의 '스크립트 디버깅 안함' 항목을 선택하거나 해제하면 그에 따라 '보기' 메뉴의 '스크립트 디버거' 항목이 없어졌다가 새로 생겼다가 한다. 원래 그렇게 만들었나 보다.

    출처 : Tong - BlueSky_08님의 개발업무통

    Posted by 1010
    반응형
     
     

    prototype.js를 위한 개발자 노트

    1.5.0버전을 다룸

    Sergio Pereira에 의해 작성됨
    이동국에 의해 번역됨
    최근 업데이트: 2007년 3월 4일

    목차

    Prototype은 무엇인가.?

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

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

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

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

    toc

    관련글

    고급 자바스크립트 가이드

    toc

    유틸리티 함수들

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

    toc

    $() 함수 사용하기

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

    DOM함수와는 달리 이 함수는 더 많은 작업을 수행한다. 반환된 element객체는 몇가지 추가적인 작업을 하게 될것이다. element를 숨기거나 보여주고 크기를 알아내며 element에 대해 스크롤을 하는 것과 같은 추가적인 많은 작업을 간단하게 만든다. Element 객체를 위한 참조문서에서 반환된 element객체에 추가된 메소드 목록을 얻을수 있다.

    <html>
    <head>
    <title> Test Page </title>
    <script src="prototype.js"></script>
    
    <script>
    	function test(){
    		var d = $('myDiv');
    		alert(d.innerHTML);
    		d.hide();
    		d.show();
    		d.addClassName('active');
    	}
    </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="Test $()" onclick="test();"/><br/> 
    
    </body>
    </html>

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

    toc

    $$() 함수 사용하기

    $$() 함수는 내용물에서 CSS를 일관되게 분리할때 많이 도와줄것이다. 하나 이상의 CSS필터링 표현식을 파싱한다면, CSS 룰을 정의하기 위해 사용되는 것과 유사하고 이러한 필터에 일치하는 요소를 반환한다.

    이 함수는 터무니 없을 정도로 사용하기가 쉽다. 체크해보라.

    <script>
    function test$$(){
    	/*
    	  in case CSS is not your forte, the expression below says
    	  'find all the INPUT elements that are inside 
    	  elements with class=field that are inside a DIV
    	  with id equal to loginForm.'
    	*/
    	var f = $$('div#loginForm .field input');
    	var s = '';
    	for(var i=0; i<f.length; i++){
    		s += f[i].value + '/';
    	}
    	alert(s); // shows: "joedoe1/secret/"
    	
    	//now passing more than one expression
    	f = $$('div#loginForm .field input', 'div#loginForm .fieldName');
    	s = '';
    	for(var i=0; i<f.length; i++){
    		s += ( f[i].value ? f[i].value : f[i].innerHTML ) + '/';
    	}
    	alert(s); //shows: "joedoe1/secret/User name:/Password:/"
    }
    
    
    </script>
    
    <div id='loginForm'>
    	<div class='field'>
    		<span class='fieldName'>User name:</span>
    		<input type='text' id='txtName' value='joedoe1'/>
    	</div>
    	<div class='field'>
    		<span class='fieldName'>Password:</span>
    		<input type='password' id='txtPass' value='secret' />
    	</div>
    	<input type='submit' value='login' />
    </div> 
    <input type=button value='test $$()' onclick='test$$();' />
    			

    성능에 대한 빠른 노트. prototype.js에서 $$() 함수의 현재 구현체는 특별히 효과적으로 여겨지지 않는다. 이 함수를 자주 사용하여 복잡한 HTML문서를 처리하고자 계힉중이라면, 가능한 $$()함수 자체를 대체하는 다른 구현체를 고려하고자 할것이다.

    toc

    $F() 함수 사용하기

    $F() 함수는 다른 단축키이다. 이것은 텍스트 박스나 드랍다운 리스트와 같은 어떤 필드의 입력 컨트롤의 값을 반환한다. 이 함수는 요소 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 클래스를 위한 확장과 조합된 이 함수는 열거가능한 리스트를 Array 객체로 변환하거나 복사하는 것을 더욱 쉽게 만든다. 예를 들면, 작성한 함수는 인자의 수를 유연하게 받아들인다. 여기서 추천되는 사용법은 DOM NodeLists를 좀더 효과적으로 처리할수 있도록 일반적인 배열로 변환하기 위해 사용하는 것이다. 아래의 예제를 보라.

    <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() 함수 사용하기

    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

    String을 향상시키기

    String은 강력한 객체이다. Prototype.js는 그 강력함을 가지고 있으며 다른 방법으로 그 강력함을 향상시킨다.

    문자열 대체

    문자열 대체를 사용할때 자바스크립트는 이미 String.Replace와 같은 메소드를 제공하고 있다. 정규표현식으로 작동하지만 prototype.js에서 소개한 대체 함수만큼 유연하지는 않다.

    새로운 String.gsub 메소드를 사용해보라. 이 메소드를 사용하면 고정 문자열이나 정규 표현식 패턴을 찾고 변경할수 있을 뿐 아니라 교체를 넘어서는 더 많은 제어를 하게 된다. 예를 들어 찾은 요소를 변형하고자 하는 방법을 메소드에 지시하도록 문자열 템플릿을 사용할수 있다.

    아래의 예제는 't'를 포함하는 단어를 찾고 그 위치에 'tizzle' 로 변경하는 것이다. 이 예제의 경우 명확하게 설명되지는 않는다. 우리가 선택한 정규 표현식인 괄호안의 \w+은 그룹 선언을 가져온다. 대체 템플릿 문자열로 #{1}를 사용하여 이 그룹에 의해 해당되는 값을 가져올수 있다.

    예제에서 우리는 't'앞의 문자들을 가져와서 'tizzle'를 뒤에 붙인다. 정규 표현식으로 더 많은 찾을 수 있다면, #{2}, #{3} 등등을 사용하여 값을 가져올것이다.

    <script>
    function talkLikeYouKnowSomething(){
    	var s = 'prototype string extensions can help you';
    	var snoopdogfy = /\b(\w+)t\w+\b/;
    	var snooptalk = s.gsub(snoopdogfy, '#{1}tizzle' );
    	alert(snooptalk); // shows: "prototizzle stizzle extizzle can help you"				
    }
    </script>
    			

    여기서 멈추지 말자. 우리가 만든 대체기능은 패턴에 일치하면 대체하는데 제한되기 때문에 그다지 강력하다고 보기 힘들다. 그렇다면 원하는 대체 값을 만들기 위해 사용자 정의 로직에 일치하는 작업을 할수 있을까.? gsub에 두번째 인자로 함수를 넘길수 있다면 그렇게 할수 있을것이다. 여기서 인자로 넘기는 함수는 일치하는 텍스트를 가진 배열(인덱스값이 0)을 받고 어떤 그룹값(인덱스값이 1에서 N)을 가져올것이다.

    <script>
    function scamCustomers(){
    	var prices = 'book1 $12.5, magazine $5.50, pencil $1.20';
    	var priceFinder = /\$([0-9\.]+)/;
    	var r = prices.gsub(priceFinder, jackUp);
    	alert(r);//shows: "book1 $13.75, magazine $6.05, pencil $1.32"
    }
    	
    function jackUp(matches){
    	//increases the prices by 10%
    	var price = parseFloat(matches[1]);
       	return '$' + Math.round(110 * price)/100;
    }
    </script>
    			

    문자열 템플릿

    애플리케이션에 자바스크립트 코드의 양이 증가하는 만큼, increasingly you'll find yourself with collections of objects of the same type and that you need to list or present in a formatted way.

    애플리케이션에서 객체 리스트를 통해 루프를 처리하고 객체 프라퍼티와 몇가지 고정된 형태의 요소에 기초하여 문자열을 만드는 코드를 찾는것이 드물게 발생하지는 않는다. Prototype.js는 이러한 타입의 시나리오를 다루는데 도움을 주는 Template class를 가진다.

    아래의 예제는 다중 HTML라인에서 장바구니에 있는 항목 리스트를 형상화하는 방법을 보여준다.

    <script>
    function printCart(){
    	//creating a sample cart
    	var cart = new Object();
    	cart.items = [ ];
    	//putting some sample items in the cart
    	cart.items.push({product: 'Book 123', price: 24.50, quantity: 1});
    	cart.items.push({product: 'Set of Pens', price: 5.44, quantity: 3});
    	cart.items.push({product: 'Gift Card', price: 10.00, quantity: 4});
    	
    	//here we create our template for formatting each item
    	var itemFormat = new Template(
    			'You are ordering #{quantity} units ' + 
    			'of #{product} at $#{price} each'
    			);
    	var formatted = '';
    	
    	for(var i=0; i<cart.items.length; i++){
    		var cartItem = cart.items[i];
    		formatted += itemFormat.evaluate(cartItem) + '<br/>\n';
    	}
    	
    	alert(formatted);
    	/* SHOWS:
    	You are ordering 1 units of Book 123 at $24.5 each<br/>
    	You are ordering 3 units of Set of Pens at $5.44 each<br/>
    	You are ordering 4 units of Gift Card at $10 each<br/>
    	*/
    }
    </script>
    			

    새로운 메소드 목록에 대한 좀더 완전한 정보를 보기 위해서는 문자열 확장 참조를 보라.

    toc

    Ajax 객체

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

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

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

    toc

    Ajax.Request 클래스 사용하기

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

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

    당신이 다음처럼 XML응답을 반환하는 http://yourserver/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) 프라퍼티를 체크할것이다. 몇가지 스크립트나 JSON형태의 데이터를 반환하고자 한다면 X-JSON 헤더가 유용하다.

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

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

    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>
    	

    좀더 완전한 설명을 보기 위해서, 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.Updater 참조문서options 참조문서를 보라.

    toc

    What are all those "?" and squares?

    So you went and wrote some quick test scripts to update your pages using the Ajax.Updater object and it all worked fine. Life was good until you ran your scripts against real data. All of a sudden the updated text was displayed with question marks or unprintable character symbols where the non-English characters should be.

    Your first suspect is prototype.js, Of course, it seemed too easy to be true. But don't blame the library just yet. Ask yourself how much you really understand character encoding, code pages, and how the browser deals with it. If you have a positive answer then I bet you are on your way to fix the problem. If you are among the other 80% (another useless, imprecise author's estimate) of web developers that take character encoding for granted, keep reading.

    I won't pretend to be an authority on the topic, much less give you a complete explanation of how this is best handled. Instead you go straight to the solution that I use and provide hints on how this could be fixed in your own scenario.

    Simply put, the solution revolves around the following statement: Serve what the browser is expecting you to serve. If we are going to update the page with text that contains Unicode/UTF-8 characters then we better make the browser aware of that.

    Let's start with the simple case when you are just updating the page with text from a static HTML file that resides on your server. When you created that file, depending on which text editor you employed, it is very possible that the file was saved in ANSI (or better said, non-Unicode) format. This is the default for many text editors, especially source code editors, because the file size will be smaller and it's rather unusual to edit source code with Unicode characters in it.

    Suppose you have the following file named static-content.html on your server. You saved this file saved in ANSI format.

    <div>
    	Hi there, José. Yo no hablo español.
    </div>

    Your main page updates itself using something like the snippet below.

    <script>
    	function updateWithFile(){
    		var url = 'static-content.html';
    		var pars = '';
    		var myAjax = new Ajax.Updater(
    				'placeholder', url, 
    				{method: 'get', parameters: pars});
    	}
    </script>
    <div id="placeholder">(this will be replaced)</div>
    <input id="btn" value="Test With Static File" 
                     onclick="updateWithFile()" type="button"/>
    
    

    When you click the button the static file is retrieved but the non-English characters are replaced by question marks or some other symbol. The displayed text will look similar to "Hi there, Jos?. Yo no hablo espa?ol." or "Hi there, Jos?Yo no hablo espa?", depending on your browser.

    In this case, the solution is straightforward, simply save the static file in an appropriate format. Let's save it in UTF-8 and run the script again (any decent text editor will have an option in the Save As dialog.) You should now see the correct text (if not, your browser may have cached the old version, try using a different file name.)

    If the HTML that you are serving is not static, if it is being dynamically generated by some application framework (like ASP.NET, PHP, or even Perl,) make sure the code that generates this HTML is producing the text in the appropriate encoding and code page, and include in the HTTP response headers one header that informs this. Each platform has a different way to achieve this, but they are very similar.

    For example, in ASP.NET you can set this globally in your web.config file and the default configuration is good enough to avoid this problem in the first place. You should already have the following section in your web.config.

    <globalization requestEncoding="utf-8" responseEncoding="utf-8" />

    고전적인 ASP 3.0에서 다음의 코드를 사용하여 이 문제를 해결할수 있다.

    Response.CodePage = 65001
    Response.CharSet = "utf-8" 

    PHP에서 응답 헤더를 추가하기 위한 문법은 다음과 같을것이다.

    <?php header('Content-Type: text/html; charset=utf-8'); ?>

    어떤 경우에는, 당신이 생각하는 목표가 응답 메시지에 다음 HTTP 헤더를 보내는 것이다.

    Content-Type: text/html; charset=utf-8 

    위 예제에서는 UTF-8을 사용했지만 다른 셋팅이 필요하다면 쉽게 바꿀수 있다.

    열거(Enumerating)...

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

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

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

    toc

    루프, 루비-스타일

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

    <script>
    	function showList(){
    		var simpsons = ['Homer', 'Marge', 'Lisa', 'Bart', 'Maggie'];
    		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', 'Maggie'];
    		simpsons.each( function(familyMember){
    			alert(familyMember);
    		});
    	}
    			

    당신은 특이한 문법으로 별로 좋지않다고 생각할지도 모른다. 위 예제에서, 엉망으로 만드는 것은 아무것도 없다. After all, there's not much to be changed in such a drop-dead-simple example. But keep reading, nonetheless.

    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){
    			//we'll just assume for now that external links
    			// do not have a '#' in their url
    			return link.href.indexOf('#') >= 0;
    		});
    		//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 의 값을 반환
    keys(targetObj) static targetObj: 객체 모든 프라퍼티의 이름과 주어진 객체의 메소드를 가진 Array를 반환
    values(targetObj) static targetObj: 객체 모든 프라퍼티의 값과 주어진 객체의 메소드를 가진 Array를 반환
    clone(targetObj) static targetObj: 객체 targetObj의 얕은(shallow) 복사물을 반환

    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 [, arg1 [, arg2 [...]]]) instance object: 메소드를 소유하는 객체 함수(=메소드) 소유자 객체로 미리 묶는 함수의 인스턴스를 반환. 반환된 함수는 원래의 것과 같은 인자를 가질것이다.
    bindAsEventListener(object [, arg1 [, arg2 [...]]]) 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, ' from checkbox');
    			
    	   },
    
    	   showMessage: function(evt, extraInfo) {
    		  alert(this.message + ' (' + evt.type + ')' + extraInfo);
    	   }
    	};
    
    
    	var watcher = new CheckboxWatcher('myChk', 'Changed');
    </script>
    
    			

    toc

    String 클래스를 위한 확장

    메소드 종류 인자 상세설명
    camelize() instance (none) -(하이픈)으로 분리된 문자열을 camelCaseString으로 변환하기. 이 함수는 예를 들면, 프라퍼티 스타일을 다루는 코드를 작성할때 유용하다.
    capitalize() instance (none) 첫번째 글자를 대문자로 변환
    dasherize() instance (none) '_' 기호를 '-' 기호로 대체
    escapeHTML() instance (none) HTML마크업 문자들이 escaped된 문자열 반환
    evalScripts() instance (none) 문자열내에서 발견되는 각각의 <script />블럭을 평가하기
    extractScripts() instance (none) 문자열내에서 발견되는 모든 <script />블럭을 포함하는 Array객체 반환
    gsub(pattern, replacement) instance pattern: 검색하는 문자열이나 정규 표현식 replacement: 간단한 문자열, 템플릿 문자열 또는 대체물을 만들기 위한 Function(strings[]) 현재 문자열에서 패턴 문자열을 찾은 결과의 문자열을 반환하고 대체 문자열이나 패턴에 일치하는 문자열을 가진 배열을 전달하는 대체함수를 호출한 결과로 대체한다. 대체물이 문자열일때, #{n}과 같은 특별한 템플릿 형태의 토큰을 포함할수 있다. 여기서 n이라는 값은 정규표현식 그룹의 인덱스이다. #{0}는 완전히 일치하면 대체될것이고 #{1}는 첫번째 그룹, #{2}는 두번째이다.
    parseQuery() instance (none) toQueryParams()와 같음.
    scan(pattern, replacement) instance pattern: 검색하는 문자열이나 정규 표현식. replacement: 반복을 통해 일치하는지 보는 Function(strings[]) 반복을 통해 문자열이 일치하는 패턴을 찾기 위한 방법을 제공한다. pattern인자는 문자열이나 RegExp가 될수 있지만 RegExp는 좀더 유용하다. 유사하게도 replacement인자는 문자열이나 함수가 될수 있지만 유용한것을 만들수 있도록 함수에 전달하는것이 좋다.
    strip() instance (none) 문자열의 앞뒤로 공백 없는 문자열을 반환
    stripScripts() instance (none) 삭제된 <script /> 블럭을 가진 문자열을 반환
    stripTags() instance (none) HTML이나 XML태그가 삭제된 문자열을 반환
    sub(pattern, replacement [, count]) instance pattern: 검색하는 문자열이나 정규 표현식. replacement: 문자열 또는 대체물을 만드는 Function(strings[]) count: 숫자나 대체물 - 디폴트는 1 gsub와 매우 유사하지만 count파라미터로 지정되는 대체물의 수에 제한이 있다
    toArray() instance (none) 문자열을 이것의 문자들의 Array로 쪼개기
    toQueryParams() instance (none) 쿼리문자열(querystring)을 파라미터 이름에 의해 인덱스화되는 결합된 Array로 쪼개기
    truncate(length [, truncation]) instance length: 결과 문자열의 최대 길이 truncation: 결과 문자열의 마지막 글자를 대체하기 위해 사용되는 문자열 - 디폴트는 '...' 최대 길이의 문자열을 만들기 위해 사용. 문자열이 최대 길이를 유지하기 위해 짤릴필요가 있을 경우, truncation인자의 텍스트는 마지막의 몇개의 글자를 대체하기 위해 사용된다. (이를테면.: var s='123456790'; alert(s.truncate(5)); //displays '12...' )
    underscore() instance (none) CamelizedStringValue를 uderscore_formatted_string로 변환. (이를테면.: var s='Namespace::MyClass123'; alert(s.underscore()); //displays 'namespace/my_class123' ). 이 함수는 루비 온 레일즈 기능에서 직접 대상이 될것처럼 보인다.
    unescapeHTML() instance (none) escapeHTML()의 반대

    toc

    Array 클래스를 위한 확장

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

    메소드 종류 인자 상세설명
    clear() instance (none) 배열을 비우고 자체를 반환한다.
    compact() instance (none) null 이거나 undefined인 요소를 제외하고 배열을 반환한다. 이 메소드는 배열자체를 변경하지 않는다.
    first() instance (none) 배열의 첫번째 요소를 반환한다.
    flatten() instance (none) 기복이 없고, 1차원의 배열을 반환한다. 이 함수는 배열이고 반환된 배열내 요소를 포함하는 배열의 각 요소를 찾음으로써 수행된다.
    indexOf(value) instance value: what you are looking for. 배열에서 찾아진다면 주어진 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: 배열내 존재한다면 제외될 값 인자의 리스트에 포함된 요소를 제외한 배열을 반환. 이 메소드는 배열 자체를 변경하지는 않는다.

    이 메소드들을 사용하는 것을 보자.

    <script>
    var A = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
    alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']"
    var B = A.without('e','f');
    alert(B.inspect()); // "['a', 'b', 'c', 'd', 'g', 'h']"
    alert(A.inspect()); // did not change A: "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']"
    A.push(null);
    A.push('x');
    A.push(null);
    A.push('y');
    alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', null, 'x', null, 'y']"
    A = A.compact();
    alert(A.inspect()); // "['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'x', 'y']"
    var e = A.shift();
    alert(e); // "a" 
    alert(A.inspect()); // "['b', 'c', 'd', 'e', 'f', 'g', 'h', 'x', 'y']"
    alert(A.indexOf('c')); // 1
    alert(A.first()); // 'b'
    alert(A.last()); // 'y'
    A.clear();
    alert(A.inspect()); // "[]"
    A = ['a', 'b', 'c'];
    B = A.reverse(false);
    alert(B.inspect()); // "['c', 'b', 'a']"
    alert(A.inspect()); // A left untouched: "['a', 'b', 'c']"
    A.reverse(true);
    alert(A.inspect()); // "['c', 'b', 'a']"	
    A = ['a', 'b',  ['c1','c2','c3'] , 'd',  ['e1','e2']  ];
    B = A.flatten();
    alert(B.inspect()); // "['a','b','c1','c2','c3','d','e1','e2']"		
    alert(A.inspect()); // unchanged: "['a','b',['c1','c2','c3'],'d',['e1','e2']]"		
    </script>
    			

    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: Event객체 이벤트를 일으키는 요소를 반환
    isLeftClick(event) static event: Event객체 마우스 왼쪽 버튼을 클릭시 true값 반환
    pointerX(event) static event: Event객체 페이지에서 마우스 포인터의 x측 좌표값 반환
    pointerY(event) static event: Event객체 페이지에서 마우스 포인터의 y측 좌표값 반환
    stop(event) static event: Event객체 이벤트의 디폴트 행위를 취소하고 위임을 연기하기 위해 이 함수를 사용
    findElement(event, tagName) static event: 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: 이벤트 명 (like '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', page_loaded, false);
    
    	function page_loaded(evt) {
    	  Event.observe('parent_node', 'click', item_clicked, false);
    	}
    	
    	function item_clicked(evt){
    		var child = Event.element(evt);
    		alert('The child node with id=' + child.id + ' was clicked');
    		Event.stop(evt); //avoid another call related to 'parent_node' itself
    	}
    </script>	
    ...
    <div id="parent_node">
    	<div id="child1">First</div>
    	<div id="child2">Second</div>
    	<div id="child3">Third</div>
    </div>		
    			

    toc

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

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

    toc

    PeriodicalExecuter 객체

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

    메소드 종류 인자 상세설명
    [ctor](callback, interval) constructor callback: 오직 인자로 PeriodcalExecuter 객체 자체가 전달될 함수, interval: 초단위 시간간격 함수를 반복적으로 호출할 이 객체의 하나의 인스턴스를 생성
    registerCallback() instance (none) 타이머를 다시 셋팅한다.
    stop() instance (none) 타이머를 취소하고 콜백 실행을 하지 않도록 한다.
    onTimerEvent() instance (none) 타이머가 호출하는 메소드. 순차적으로 객체 자체를 전달하는 콜백 메소드를 호출할것이다.
    프라퍼티 타입 상세설명
    callback Function(objExecuter) 호출되기 위한 함수. objExecuter: PeriodcalExecuter가 호출을 만든다.
    timer Timer 콜백 메소드를 반복적으로 호출하기 위해 타이머 객체를 다룬다.
    frequency Number 이것은 수초내 간격으로 실질적으로 작용
    currentlyExecuting Boolean 만약 함수 호출이 진행중이라면 표시

    toc

    Prototype 객체

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

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

    toc

    Enumerable 객체

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

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

    프라퍼티 타입 상세설명
    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를 반환하는 요소가 없다면, detectnull을 반환한다.
    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를 반환한다.
    inGroupsOf(number, fillWith) instance number: 그룹별 타이머의 수, fillWith: 빈 공간을 채울 필요가 있는 값 첫번째 인자로 지정된 만큼의 항목을 포함하는 그룹별 collection을 반환. 초기 collection의 항목수가 첫번째 인자로 주어진 숫자로 나누어지지 않는다면, 마지막 그룹의 끝에 빈 항목이 null로 채워지거나 두번째 인자값으로 채워진다. 예를 들면, ['a','b','c','d'].inGroupsOf(3,'?')[ ['a','b','c'] , ['d','?','?'] ]를 생성한다.
    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호출의 가장 큰 결과를 반환한다.
    member(obj) instance obj: any object 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 object 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 implementation
    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헤더의 컨텐츠를 평가하기 위해 내부적으로 호출된다.
    evalResponse() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. AJAX응답이 text/javascriptContent-type헤더를 가진다면, 응답 몸체는 평가되고 이 메소드는 사용될것이다.
    header(name) instance name: HTTP header name 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX응답의 HTTP헤더의 컨텐츠를 가져오기 위해 내부적으로 호출된다.
    onStateChange() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 AJAX호출 상태 변경시 객체 자체에 의해 호출된다.
    request(url) instance url: url for the AJAX call 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 생성자를 호출하는 동안 벌써 호출되었다.
    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, Object) undefined 각각의 이벤트/상태가 AJAX호출이 발생하는 동안 도착할때 호출될 사용자정의 함수. 이 옵션에는 "XXXXXXXX"를 위해 Ajax.Request.Events, 와 HTTP status codes의 상태중에 다양한 대안이 있다. 예를 들어 var myOpts = {onComplete: showResponse, onLoaded: registerLoaded};. 사용되는 함수는 AJAX작업과 평가된 X-JSON응답 HTTP헤더를 포함하는 인자를 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
    onSuccess Function(XMLHttpRequest, Object) undefined AJAX호출이 성공적으로 완성될때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
    onFailure Function(XMLHttpRequest, Object) undefined AJAX호출이 에러를 가진채 끝날때 호출될 사용자정의 함수. 사용되는 함수는 AJAX작업을 가지는 XMLHttpRequest객체를 포함하는 하나의 인자를 받을것이다.
    onException Function(Ajax.Request, exception) undefined 유효하지 않은 응답이나 유효하지 않은 인자와 같이 예외적인 조건이 클라이언트 측 AJAX호출에서 발생했을때 호출될 사용자정의 함수. 사용된 함수는 AJAX작업을 포장하는 Ajax.Request 객체와 exception객체를 포함하는 두개의 인자를 받을것이다.
    insertion an Insertion class undefined 새로운 내용이 삽입될 방법을 판단할 클래스. Insertion.Before, Insertion.Top, Insertion.Bottom, 또는 Insertion.After가 될수 있다. Ajax.Updater객체에만 적용한다.
    evalScripts Boolean undefined, false 스크립트 블럭이 응답이 도착했을때 평가할지를 판단. Ajax.Updater객체에만 적용 objects.
    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 container:이것은 요소의 id, 요소객체 자체, 또는 두개의 프라퍼티(AJAX호출이 성공할때 사용될 object.success 요소(나 id), AJAX호출이 실패할때 사용할 object.failure 요소(나 id))를 가지는 객체가 될수 있다. url: 가져오기 위한 url, options: AJAX 옵션 주어진 옵션을 사용하여 주어진 url을 호출할 이 객체의 하나의 인스턴스를 생성
    start() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것의 정기적인 작업 수행을 시작하기 위해 객체 자체에 의해 호출된다.
    stop() instance (none) 주기를 가지는 작업 수행을 종료하도록 한다. 종료후, 객체는 onComplete 옵션에 주어진 콜백을 호출할것이다.
    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 클래스명을 표시하는 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명을 가진다면 true를 반환
    hide(element) instance element: 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(element) instance element: element 객체 또는 아이디 style.display''로 다시 셋팅하여 각각의 요소를 보여준다.
    toggle(element) instance element: element 객체 또는 아이디 각각의 전달된 요소의 가시성(visibility)을 토글(toggle)한다.
    undoClipping(element) instance element: element 객체 또는 아이디
    undoPositioned(element) instance element: element 객체 또는 아이디 element의 style.position''으로 초기화
    update(element, html) instance element: element 객체 또는 아이디, html: html content 주어진 html인자를 가지는 요소의 내부 html을 대체. 주어진 html이 <script>블럭을 포함한다면, 그것들은 포함되지는 않지만 평가될것이다.
    visible(element) instance element: element 객체 또는 아이디 요소가 눈에 보이는지 표시하는 Boolean값을 반환

    toc

    Element.ClassNames 클래스

    Enumerable로 부터 상속

    element에 관련된 CSS 클래스명의 collection을 표시

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

    toc

    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 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 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 객체

    This object provides some utility functions for working with input fields in forms.

    메소드 종류 인자 상세설명
    activate(field) instance field: field element 객체 또는 아이디 포커스를 이동하고 텍스트 선택을 지원하는 field내 값을 선택
    clear(field) instance field: field element 객체 또는 아이디 field요소로부터 각각 전달된 값을 지움(clear)
    disable(field) instance field: field element 객체 또는 아이디 폼 필드 요소를 사용하지 못하도록 만든다. 요소 객체를 반환한다.
    enable(field) instance field: field element 객체 또는 아이디 폼 필드 요소를 사용가능하도록 만든다. 요소 객체를 반환한다.
    focus(field) instance field: field element 객체 또는 아이디 주어진 폼 field로 입력 포커스 이동
    getValue(field) instance field: field element 객체 또는 아이디 필드에 입력되거나 선택된 값을 반환한다.
    present(field) instance field: field element 객체 또는 아이디 모든 폼 field가 빈값이 아니라면 true를 반환
    select(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 반환. 선택적으로 목록은 요소의 type이나 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: 요소가 변경될때 호출되는 함수 요소를 모니터링할 객체 생성
    getValue() instance, abstract (none) 클래스는 요소에서 모니터링이 되는 현재값이 무엇인지 판단하기 위햔 메소드를 구현해야만 한다.
    registerCallback() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소 모니터링릉 시작하기 위한 객체 자체에 의해 호출된다.
    onTimerEvent() instance (none) 이 메소드는 대개 외부적으로 호출되지 않는다. 이것은 요소를 체크하기 위해 정기적으로 객체 자체에 의해 호출된다.
    Property Type Description
    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: 초단위 간격, callback: 요소가 변경될때 호출되는 함수 Abstract.TimedObserver으로부터 상속. 요소의 value프라퍼티를 모니터링할 객체를 생성.
    getValue() instance (none) 요소의 값을 반환

    toc

    Form.Observer 클래스

    Abstract.TimedObserver로 부터 상속

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

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

    toc

    Abstract.EventObserver 클래스

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

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

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

    메소드 종류 인자 상세설명
    [ctor](element, callback) constructor element: element 객체 또는 아이디, callback: function to be called when the event happens 요소를 모니터링할 객체 생성.
    getValue() instance, abstract (none) 클래스는 요소에서 모니터링이 되는 현재값이 무엇인지 판단하기 위햔 메소드를 구현해야만 한다.
    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: 이벤트가 발생할때 호출될 함수 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' or 'horizontal', element: object within()은 이 메소드가 호출되기 전에 호출될 필요가 있다. 이 메소드는 요소에서 겹치는 것을 조정하는 세분화정도를 표현하는 0.0과 1.0사이의 10진수를 반환할것이다. 예를 들면, 만약 요소가 100px를 가지는 정사각형 DIV이고 (300,300)에 위치한다면, within(divSquare, 330, 330); overlap('vertical', divSquare);는 0.70을 반환해야만 한다. 이 값이 의미하는 것은 DIV의 아래쪽 경계에서 70%(100px - 30px = 70px)를 표시하는 지점이라는 것이다. 이해하기 가장 쉬운 방법은 다른 사각형의 위-왼쪽 구석처럼 주어진 쌍을 생각하는 것이다. 숫자값은 겹치는 넓이와 높이의 퍼센트값일 것이다.
    clone(source, target) instance source: element 객체 또는 아이디, target: element 객체 또는 아이디 source요소에 대해 똑같이 target요소의 크기를 다시 조정하고 다시 위치를 지정

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

    Posted by 1010
    반응형

    목차

    1. id로 특정 요소 가져오기[1]
    2. 폼 컨트롤러의 값을 가져오기[2]
    3. 스타일 변경하기[3]
    4. html 내용 변경하기[4]
    5. Ajax Request의 파라미터 셋팅하기[5]
    6. Ajax Request 생성하기[6]
    7. Event 추가하기[7]
    8. 각 요소별로 함수 실행하기[8]
    9. 이벤트 핸들링[9]
    10. 호출 체이닝[10]
    11. 테이블 형태의 html 내용변경하기[11]
    12. key 이벤트 감지하기[12]
    13. 이벤트 가로채기[13]
    14. insert() 메소드 제대로 사용하기[14]
    15. form 다루기[15]

    id로 특정 요소 가져오기[#1]

    이전의 방법
    document.getElementById('foo')

    추천하는 방법

    $('foo')

    폼 컨트롤러의 값을 가져오기[#2]

    이전의 방법
    var woot = document.getElementById('bar').value
    var woot = $('bar').value

    추천하는 방법

    var woot = $F('bar')

    스타일 변경하기[#3]

    이전의 방법
    $('footer').style.height = '100px';
    $('footer').style.background = '#ffc';  

    추천하는 방법

    $('footer').setStyle({
      height: '100px',
      background: '#ffc'
    })

    html 내용 변경하기[#4]

    이전의 방법
    $('coolestWidgetEver').innerHTML = 'some nifty content'

    추천하는 방법

    $('coolestWidgetEver').update('some nifty content')

    Ajax Request의 파라미터 셋팅하기[#5]

    이전의 방법
    new Ajax.Request('ninja.php?weapon1=foo&weapon2=bar')

    추천하는 방법

    new Ajax.Request('ninja.php', {
      parameters: {
        weapon1: 'foo',
        weapon2: 'bar'
      }
    })

    Ajax Request 생성하기[#6]

    이전의 방법
    new Ajax.Request('blah.php', {
      method: 'POST',
      asynchronous: true,
      contentType: 'application/x-www-form-urlencoded',
      encoding: 'UTF-8',
    })

    추천하는 방법

    new Ajax.Request('blah.php')

    여기서 위 방법이 잘못된게 아니다. 하지만 사용된 값이 모두 디폴트 값이기 때문에 굳이 표기할 필요가 없다는 것이다.

    Event 추가하기[#7]

    이전의 방법
    Event.observe('myContainer', 'click', doSomeMagic)

    추천하는 방법

    $('myContainer').observe('click', doSomeMagic)

    뒤의 방법이 좀더 객체 지향적이고 다른 이벤트를 추가하기가 용이하다.

    각 요소별로 함수 실행하기[#8]

    이전의 방법
    $$('div.hidden').each(function(el){
      el.show();
    })

    추천하는 방법

    $$('div.hidden').invoke('show')

    같은 기능을 하기 위해 첫번째 방법처럼 지나치게 많은 함수를 사용할 필요가 없다.

    이벤트 핸들링[#9]

    이전의 방법
    $$('div.collapsed').each(function(el){
      el.observe('click', expand);
    })

    추천하는 방법

    $$('div.collapsed').invoke('observe', 'click', expand)

    호출 체이닝[#10]

    이전의 방법
    $$('input.date').invoke('observe', 'focus', onFocus);
    $$('input.date').invoke('observe', 'blur', onBlur);

    추천하는 방법

    $$('input.date')
      .invoke('observe', 'focus', onFocus)
        .invoke('observe', 'blur', onBlur)

    위 두가지 모두 같은 기능을 실행하게 되지만 앞의 예제처럼 $$() 함수를 두번이나 호출해서 처리할 필요가 없다. 아래의 경우처럼 체이닝(chaining nirvana)를 사용하면 된다.

    테이블 형태의 html 내용변경하기[#11]

    이전의 방법
    $('productTable').innerHTML = 
      $('productTable').innerHTML + 
      '<tr><td>' + productId + ' '
      + productName + '</td></tr><tr><td>'
      + productId + ' ' + productPrice + 
      '</td></tr>'

    추천하는 방법

    var rowTemplate = new Template('<tr><td>#{id} #{name}</td></tr><tr><td>#{id} #{price}</td></tr>');
    $('productTable').insert(
      rowTemplate.evaluate({
        id: productId,
        name: productName,
        price: productPrice
      }))
    )

    위 두가지 모두 같은 기능을 실행하게 되지만 앞의 예제처럼 $$() 함수를 두번이나 호출해서 처리할 필요가 없다. 아래의 경우처럼 체이닝(chaining nirvana)를 사용하면 된다.

    key 이벤트 감지하기[#12]

    $('myInput').observe('keyup', function(e){
      if (e.keyCode == Event.KEY_TAB)
        doSomethingCoolWhenTabIsPressed();
    })

    keyCode는 KEY_RETURN, KEY_ESC, KEY_TAB, KEY_LEFT, KEY_UP, KEY_RIGHT, KEY_DOWN 과 같은 값들이 있다.

    이벤트 가로채기[#13]

    기본적인 방법
    Event.observe('productInfo', 'click', displayProductInfo, false); // 'false' could be skipped
    Event.observe('productInfo', 'click', displayProductInfo);

    간단한 방법

    $('productInfo').observe('click', displayProductInfo, false); // 'false' could be skipped
    $('productInfo').observe('click', displayProductInfo);

    insert() 메소드 제대로 사용하기[#14]

    new Insertion.Bottom('blogEntry',
      new Template('<div><h2>#{name}</h2><p>#{content}</p></div>')
        .evaluate({
          name: blogEntry.name,
          content: blogEntry.content
        }));
     
    // Insertion class is deprecated - it's recommended to use Element's insert method:
     
    $('blogEntry').insert(new Template('<div><h2>#{name}</h2><p>#{content}</p></div>')
        .evaluate({
          name: blogEntry.name,
          content: blogEntry.content
        }), 'bottom' ); // "bottom" can be skipped
     
    $('blogEntry').insert(new Template('<div><h2>#{name}</h2><p>#{content}</p></div>')
        .evaluate({
          name: blogEntry.name,
          content: blogEntry.content
        }));

    위치값은 top, bottom, before, after 를 사용할수 있다. 이 값을 생략한다면 디폴트는 bottom이다.

    form 다루기[#15]

    다음은 .request를 사용하는 일반적인 form이다.
    $('register').observe('submit', function(e){
      Event.stop(e);
      $(this).request();
    })

    .getInputs 는 type과 name속성에 기초하여 요소를 필터링하기 쉬도록 해준다. 여기서는 "email" 이라는 이름의 요소를 직렬화하고 폼의 "action" 이라는 속성내 포함된 URI에 결과를 서브밋한다.

    $('register').observe('submit', function(e){
      Event.stop(e);
      new Ajax.Request($(this).readAttribute('action'), {
        parameters: Form.serializeElements($(this).getInputs('', 'email'))
      })
    })

    앞서 본 .getInputs가 대부분의 경우 유용하지만 일부 속성을 제외하고자 할때는 .reject를 사용한다.

    $('register').observe('submit', function(e){
      Event.stop(e);
      new Ajax.Request(this.readAttribute('action'), {
        parameters: Form.serializeElements($(this).getElements()
          .reject(function(el){return el.hasAttribute('multiple')})
        );
      })
    })
    Posted by 1010
    반응형

    소개

    웹 도처에 사용되는 자바스크립트의 늘어가는 인기는 클라이언트측 코드가 안정성, 속도, 재사용성등이 혼합으로 구현되도록 하는것이 좀더 중요하게 되었다. 이것을 달성하기 위한 가장 좋은 방법중 하나는 간단한 라이브러리와 모든 프로젝트를 위한 기본사항처럼 사용하기 위한 문법이다. 고맙게도 Sam Stephenson 는 우리의 자바스크립트 개발을 쉽게 하기 위한 Prototype.js 라 불리는 놀라운 함수들의 라이브러리를 만들었다.

    우리의 독자들이Prototype 문법을 사용하는 문서 를 읽은 후 크게 놀랐고, 우리는 많은 개발자를 위해 좀더 쉽게 배울수 있도록 도와주는 라이브러리를 위한 참조문서를 만드는게 좋겠다는 결심을 했다. 다음의 튜토리얼은 Particletree프로젝트에서 사용된 가장 공통적인 함수들을 사용하는 간단한 예제와 함께 설명할 것이다. 이 문서는 Sergio Pereira에 의해 좀더 많은 내용을 가진 비공식적인 프로토타입 문서 와 함께 사용되었음을 의미한다. 그리고 script.aculo.us 문서 위키는 모든 자바스크립트/프로토타입 개발자들이 읽기를 매우 추천한다.

    시작하기

    파일을 다운로드 한 후에, 당신이 선호하는 디렉토리에 그 파일들을 넣어둬라. 당신이 해야할 일은 html문서에 다음처럼 추가를 하는 것이다.

    <script src="/scripts/prototype.js" type="text/javascript"></script>

    이것으로 자바 스크립트를 개발하는게 10배는 쉬워진다. 지금, 당신이 획득한 새롭고 멋진 무기를 보자.

    알림 - 이 튜토리얼은 1.3.1버전을 기반으로 작성되었다.

    $() 함수

    가장 자주 사용되고 편리한 함수인, $()는 DOM요소를 다루기 위한 쉬운 방법을 제공한다. 일반적으로, 당신이 DOM내 특정 요소에 접근하고자 한다면, 다음처럼 작성할것이다.

    node = document.getElementById("elementID");

    $()를 사용하면, 다음처럼 간단히 작성할수 있다.

    node = $("elementID");

    간단하고 멋지지만 이러한 장점보다, $()함수는 다중 요소를 함수안으로 가져오는 기능을 가지고 있기 때문에 document.getElementById()보다 좀더 강력하다.

    allNodes = $("firstDiv", "secondDiv");
    for(i = 0; i < allNodes.length; i++) {
        alert(allNodes[i].innerHTML);
    }

    이 예제에서, 우리는 루프를 통해 간단히 접근할수 있는 요소들의 배열을 가지고 오는 것을 볼수 있다.

    폼 헬퍼(Form Helper) 함수

    폼은 HTML과 CSS관점에서 근심거리일뿐 아니라, 자바스크립트의 측면에서도 그렇다. Prototype.js는 폼을 다루는 유용하고 독창적인 함수를 제공한다.

    $F() 함수 는 폼 요소의 값과 전달하는 ID를 반환한다. 만약 우리가 다음처럼 HTML필드를 둔다면,

    <input type="text" id="textfield" name="textfield" />
    <textarea rows="5" cols="5" id="areafield" name="areafield"></textarea>
    <select id="selectfield" name="selectfield">
        <option value="1" selected>One</option>
        <option value="2">Two</option>
    </select>
    <input type="checkbox" id="checkfield" name="checkfield" value="1" checked />

    우리는 $F()함수를 사용하여 폼내의 값들에 쉽게 접근할수 있다.

    $F("textfield");      // returns the value of the text input
    $F("areafield");      // returns the value of the textarea
    $F("selectfield");    // returns the selected value of the select
    $F("checkfield");     // returns undefined if not checked, or the value

    제어와는 관계없이 값을 얻는 기능은 대부분의 환경에서 좀더 쉽게 폼을 처리하도록 해준다. 여기에 이 함수를 사용할때 찾을수 있는 두가지 결점이 있다. 1) radio그룹의 선택된 값에 접근하는 쉬운 방법이 없다(하나의 radio요소의 값만 처리). 2) $()함수를 사용할때처럼 다중 ID를 전달하는 것이 불가능하다.

    *다른 함수인, Form.getElements() 는 타입에 관계없이 모든 폼 요소의 배열을 반환한다.

    allNodes = Form.getElements("myform");
    for(i = 0; i < allNodes.length; i++) {
        //do something to each form field
    }

    이 예제에서, 우리는 myform이라는 id를 가진 폼으로 부터 모든 요소를 가져온다. 만약 당신이 onclick을 추가하고 싶거나 각각의 폼필드에 도움말 팝업을 추가하기를 원한다면, 당신은 위와 같은 형식을 통해 할수 있다.

    우리가 볼 다음 메소드는 Form.serialize()이다. Ajax요청을 빌드할때, 당신은 데이터를 전달하기 위해 당신 자신만의 문자열을 포맷팅하기를 원한다. 폼이 서브밋되었을때, 문자열은 빌드되고, serialize()는 처리를 쉽게 만든다.

    allNodes = Form.serialize("myform");

    // returns field1=value1&field2=value2&field3=value3 and so on...

    우리를 돕기 위해 문자열을 빌드하라. 하지만 메소드를 좀더 좋게 만드는 것은 이것은 필드의 타입에 기초를 두지 않는 것이다. 우리는 이전에 $F()가 radio그룹에서 몇가지 문제점을 가지는 것을 봤다. 하지만 serialize()는 어떠한 필드 타입을 위해서도 값을 정확하게 처리한다. 사용가능한 폼 메소드만 있는 것은 아니다, 나머지것들을 보기 위해서는 Sergio의 문서 를 보라.

    getElementsByClassName

    getElementsByClassName()가 아직도 자바스크립트로 빌드되지 않은 이유는 뭔가.? 이것은 프로토타입이 아니고 그래서 프로토타입은 문서객체의 확장처럼 저장소(arsenal)로 이것을 추가했다. 이것은 document.getElementsByTagName()처럼 정확하게 작동한다. 단지 차이점은 className을 체크하는 것이다.

    allNodes = document.getElementsByClassName("red");
    for(i = 0; i < allNodes.length; i++) {
        alert(allNodes[i].innerHTML);
    }

    반환되는 배열은 주어진 className과 일치하는 모든 요소를 포함한다. 이것은 다중 className을 가진 요소들과도 잘 작동한다. getElementsByClassName()는 도처에서 모든 프로젝트에서 사용되는 함수가 되었다. 주로 DOM이벤트에 붙기 때문에 나는 모든 개발자가 이것을 사용하도록 제안한다.

    요소 헬퍼(Element Helper) 함수

    요소객체는 공통적으로 DOM조작을 돕는 많은 수의 헬퍼 함수를 제공한다. 몇몇 이러한 함수는 하나의 호출에 10줄 이상의 코드를 단순화하는동안 어떤 새로운 것도 생성하지 않는다. 그럼 몇몇 예제를 보자.

    헬퍼 없이 요소의 높이를 가져오자.

    $("first").offsetHeight

    그리고 지금은 헬퍼를 사용하는 경우이다.

    Element.getHeight("first")

    이 경우, 헬퍼는 어떠한 잇점도 제공하지 않는다. 지금 우리가 요소로부터 className을 제거하길 원하는가.? 이것은 (Prototype.js소스코드로 부터 얻어진) 다소 긴 방법이다.

    element = $(element);
    if (!element)
        return;
    var newClassName = '';
    var a = element.className.split(' ');
    for (var i = 0; i < a.length; i++) {
        if (a[i] != className) {
            if (i > 0)
                newClassName += ' ';
            newClassName += a[i];
        }
    }
    element.className = newClassName;

    그리고 지금은 헬퍼 함수를 사용하는 경우이다.

    Element.removeClassName("elementID", "red");

    멋진가.? 첫번째 예제와는 달리, 대부분의 헬퍼 함수는 공통적인 작업을 쉽게 수행하여 시간과 수고를 아낀다. 그리고 일관성을 위해, 이것은 프로젝트 도처에 Element문법을 사용하는 것이 가장 좋은 방법이 될것이다. 헬퍼 함수의 전체 목록과 그것들을 사용하는 방법을 보기 위해서, Sergio의 프로토타입 문서를 보라.

    Try.these 함수

    Try.these()는 다른 자바스크립트 구현물과 관계없이 브라우저를 종속되지 않고 작동하는 코드를 생성하도록 개발자를 도와주기 위한 멋진 함수이다. 객체와 브라우저 인식의 자신만의 방법대신에, 이 함수는 에러를 발생할때까지 코드의 하나의 경로를 수행하도록 시도하고 다음 경로로 교체한다.

    return Try.these(
        function() {
            alert("first");
            jkgjhgjhg        //intentional error
            alert("firsterror");
            return 1;
        },
        function() {
            alert("second");
            return 2;
        }
    );

    위 예제에서, 첫번째 경로는 내부 에러발생시 수행을 멈출것이다. 이것을 알라. 모든것은 에러가 발생되지 전에 수행되어야 하기 때문에 이것은 우리의 코드가 신중하도록 하기 위해 중요하다. 우리는 코드가 두번 수행되지 않도록 주의해야만 한다. 전체적으로, Try.these()는 우리가 종종 사용하는 함수일뿐 아니라, 이것이 존재하고 어떻게 사용해야 하는지 아는것은 멋진 일이다.

    Ajax 지원

    이 라이브러리에서 Ajax지원 함수는 부족하지 않다. 그리고 나는 Prototype.js의 도움으로 Ajax애플리케이션을 생성하는 방법을 보여줄것이다. 문서로부터 우리는 다음처럼 일반적인 Ajax요청을 볼수 있다.

    var myAjax = new Ajax.Request(
        url,
        {method: 'post', parameters: data, onComplete: ajax_response}
    );

    메소드가 post이거나 get인 지점에서, 파라미터는 이름/값 형태의 문자열이고, onComplete은 모든것이 종료되었을때 호출되어야 하는 함수이다. 핵심기능을 이해했을때, 라이브러리를 도구화하는 자신만의 함수를 생성하여 반복적인 Ajax호출을 만드는 것이 쉽다. 먼저, Ajax요청을 처리하는 간단한 함수이다.

    function ajax_request(url, data) {
        var myAjax = new Ajax.Request(
            url,
            {method: 'post', parameters: data, onComplete: ajax_response}
        );
    }

    요청이 종료된후, 이것을 ajax_response()로 보낸다.

    function ajax_response(originalRequest) {
        if(!bHasRedirect) {
            //process originalRequest.responseText;
        }
        else {
            bHasRedirect = false;
            ajax_request(originalRequest.responseText, "");
        }
    }

    당신이 Ajax요청을 만든후, 응답은 언제나 ajax-response()로 보내진다. 여기서 다른 Ajax요청은 bHasRedirect(전역변수)가 true로 셋팅된 경우에만 만들어질것이고 true가 아니라면 아마 코드는 함수와 originalRequest.responseText()의 전역 배열에 기반하여 수행될것이다.

    PeriodicalExecuter

    PeriodicalExecuter객체가 초기화되면, 이것은 주어진 기간에 특정 함수를 반복적으로 호출한다. 이것은 당신이 사이트의 Ajax부분을 자동으로 수정하길 바랄때 유용할것이다.

    function periodicalUpdate() {
        new PeriodicalExecuter(refreshNews, 10);
    }

    function refreshNews() {
        //Ajax code to grab news and update DOM
    }

    PeriodicalExecuter 생성자는 첫번째 파라미터처럼 호출하기 위한 함수를 예상한다. 그리고 이것은 시간간격(초단위)이다. 비록 공통적인 setInterval()가 밀리세컨드를 다루지만 시간을 혼동하지 말라. 하지만 이 함수에서 우리는 초 단위로 다룬다. 예제는 Ajax가 복잡하다고 가정하지만, 이것은 어떤 이유로 페이지를 수정할수 있다. Prototype.js는 또한 Ajax를 다룰때 쉽게 처리할수 있는 Ajax.PeriodicalUpdater클래스를 가진다.

    추가적인 고급기능.

    우리가 Prototype.js가 제공하는 모든 함수와 메소드를 다룰수는 없지만, 이것은 여기서 다룰수 없는 것중에 몇몇을 강조해두는 것은 중요하다고 볼수 있다.

    감독(observe) - 이 메소드 함수는 addEvent()와 비슷하고, DOM에 이벤트를 붙이기 위해 사용된다.

    사용자 상호작용(User Interaction) - 당신은 사용자를 처리하는 key가 무엇을 만드는지 알기 위해 KEY_TAB와 같은 전역값내 빌드된것을 찾을수 있다. 추가적으로, 당신은 마우스를 클릭할때 위치를 찾을수 있다.

    클래스 생성(Class Creation) - Prototype.js가 제공하는 것이 무엇인지 왜 멈추는가.? 같은 문법과 함수를 사용하여, 우리는 일관성을 유지하기 위해 자신만의 클래스를 빌드할수 있다. 생성자와 추가적인 메소드를 추가하는 것은 결코 쉽지 않다. 이것을 포장하기 위해 문서에서 Class.create() 를 보라.

    당신이 저자를 알지못하고 무엇인가 발생한것을 제대로 이해하지 못할때 일반적인 코드/라이브러리를 사용하는 것을 받아들일수 있는가.? 당신이 코드를 테스트하고 사람/커뮤니티를 신뢰하는 만큼 나의 대답은 예이다. Prototype.js의 경우, 신뢰는 두개의 소스로부터 빌드된다. 먼저, Ruby on Rails 은 프로토타입 지원과 통합되었다. Ruby on Rails이 훌륭한 개발 기본이 된 이후로, 많은 버그가 발견되었고 Prototype.js가 좀더 안정화되도록 많은 문제가 해결되었다. 두번째, 개발자는 Ruby on Rails의 creator 를 고용하는 37시그널에서 근무한다. 나는 회사의 개발 환경을 신뢰할 뿐 아니라, Prototype.js가 테스트가 지속되고 지속적으로 발전하리라고 생각한다. 주어진 것으로 나의 프로젝트를 테스트하고, 나는 나의 모든 프로젝트에 이 라이브러리를 자신있게 사용한다.

    Prototype.js는 이 튜토리얼에서 목록화된 것보다 두배 이상의 함수를 가지고 명백히 체크아웃할 가치가 있다. 만약 당신이 파일 사이즈(약 30K)가 꺼려진다면, 당신이 사용하지 않는 클래스는 뺄수 있고 사용자에게 제공하기 전에 PHP와 함께 자바스크립트 파일을 압축할수 있다는 것을 기억하라. 또한 당신이 약간의 메소드를 사용했다면 나머지는 배우기 쉽다. 그래서 배우는 과정은 매우 간단하다. 기본적으로 이것을 시도하기 위한 핑계거리는 없다. 위에서 본 예제는 Particletree에서 이것들을 다룬 방법이고 테스트없이 사용된 것은 없다. 기억하라. 이것은 Prototype.js에 대한 소개이고 그래서 비공식적인 프로토타입 문서를 참조하고 신뢰해야 하며 다양한 메소드를 찾는 어려운 작업을 위해 script.aculo.us 문서 위키 wiki를 보라. 언제나 처럼, 당신이 실수나 가능한 개선사항이 있다면, 우리에게 알려달라.

    Posted by 1010
    반응형

    현재 웹페이지의 URL의 유효성 확인

     

     

    1. Internet Explorer의 주소 표시줄에 아래 명령을 입력한 다음 Enter 키를 누릅니다.

    javascript:alert("실제 URL 주소: " + location.protocol + "//" + location.hostname + "/");

    2. 현재 방문하고 있는 웹페이지의 실제 URL 웹주소를 표시합니다.

    다음 코드를 복사해서 인터넷 익스플로어 주소창에 입력하고 Enter 키를 누르면 웹 사이트 URL의 자세한 설명을 볼 수 있습니다.

    javascript:alert("실제 URL:\t\t" + location.protocol + "//" + location.hostname + "/" + "\n주소 표시줄 URL:\t" + location.href + "\n" + "\n서버 이름이 서로 일치하지 않는다면 스푸핑 사이트일 수 있습니다.");

    실제 URL과 주소 표시줄 URL을 비교해서 일치하지 않으면 웹 사이트가 거짓 주소를 나타내는 것일 수 있습니다. 

    3. Internet Explorer의 열어본 페이지목록 창을 사용하여 현재 웹 사이트의 실제 URL 확인
    loadTOCNode(4, 'moreinformation');
    Internet Explorer의 열어본 페이지 목록 탐색 창을 사용해서 웹 페이지의 URL을 확인할 수 있습니다.
    인터넷 익스플로어에서 보기--> 탐색 창 --> 열어 본 페이지 목록을 누릅니다. 주소 표시줄의 URL을 열어본 페이지 목록에 나타나는 URL과 비교합니다. 일치하지 않으면 웹 사이트가 거짓 주소를 나타내는 것일 수 있다.


    4. 하이퍼링크가 사용하는 URL 확인하는 방법

    하이퍼링크가 사용하는 URL을 확인하려면 다음과 같이 하면 된다. 
    1) 링크를 마우스 오른쪽 단추로 누른 다음 바로 가기 복사를 누릅니다.
    2) 시작을 누르고 실행을 누릅니다.
    3) notepad를 입력한 다음 확인을 누릅니다.
    4) 메모장의 편집 메뉴에서 붙여넣기를 누릅니다.


    이렇게 하면 하이퍼링크의 전체 URL을 확인하고 Internet Explorer가 사용할 주소를 확인할 수 있습니다.
    다음은 스푸핑 웹 사이트로 이동할 수 있는 URL Spoofing에 사용되는 문자들이다.

    %00
    %01
    @


    예로, 다음 형태의 URL은 http://example.com으로 연결되지만 Internet Explorer에서 주소 표시줄이나 상태 표시줄의 URL은 http://www.wingtiptoys.com으로 나타날 수 있다.

     
     

     
    Posted by 1010
    반응형

    javascript 페이지이동명령어의 차이점

     

    javascript 로 페이지를 이동시키는 방법은 여러가지가 있다.

    그중에 가장 일반적인 방법은 아마도 location.href = "{페이지URL}" 이 아닌가 싶다.

    이 방법 말고도 location.replace("{페이지URL}") 도 가능하다.

    그럼 이 두녀석의 차이점은 무엇일까... 한번 알아보자.

    모든 답은 내가 항상 애용하는 MSDN 에 다 있다. 그럼 확인해 보자.

    일단 href 속성에는 별 특별한 설명이 없다. ㅡ,.ㅡ... 단지 "Sets or retrieves the entire URL as a string." 라고만 나와있다. 머.. 설명할게 별로 없나보다. ㅎㅎㅎ

    그럼 이번엔 replace() 이녀석을 한번 보자.

    "When a document is replaced, it is also removed from the history object. Moreover, the user interface navigation methods, such as the Back and Forward buttons, will no longer access the URL." 이라고 설명 해 놨다.

    요놈은 href 하고는 다르게 좀 특별하다.

    replace 하게되면 history에서 사라진다(removed). 브라우져의 뒤로, 앞으로 버튼을 눌러도 그 페이지로는 안간다는 말이다. history 에서 그 페이지의 정보는 사라지니 말이다.

    요놈은 권한체크나 보안쪽 관련해서 쓰면 유용할 듯 싶다.

    Posted by 1010
    반응형
    <table width="95%" cellpadding="3" cellspacing="0" align="center" border="1" bordercolor="#E0E0E0" style="border-collapse:collapse;">
      <tr bgcolor="#F7F7F7">
        <td align="center" width="6%">문항</td>
        <td align="center" width="">제목</td>
        <td align="center" width="">내용</td>
      </tr>
      <tr bgcolor="white" onmouseover="this.bgColor='#f7f7f7'" onmouseout="this.bgColor='white';">
        <td align="center"><a href="#">&nbsp;1111</a></td>
        <td align="left" style="padding-left:10px;">&nbsp;</td>
        <td align="left" style="padding-left:10px;">&nbsp;</td>
      </tr>
     </table>
    Posted by 1010
    반응형

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    <HEAD>
    <TITLE> New Document </TITLE>
    <script language='JavaScript'>
    function checkAall(oElement){
     var newtime = new Date().getTime(); 
     for(var i=0;i<document.form1.chkA.length;i++){
      document.form1.chkA[i].checked = oElement.checked;
     }
     var newtime2 = new Date().getTime();

     td1.innerHTML="걸린시간 : "+(newtime2-newtime);
    }

    function checkBall(oElement){
     var newtime = new Date().getTime();

     var len = document.form1.chkB.length;
     for(var i=0;i<len;i++){
      document.form1.chkB[i].checked = oElement.checked;
     }

     var newtime2 = new Date().getTime();

     td2.innerHTML="걸린시간 : "+(newtime2-newtime);
    }


    function checkCall(oElement){
     var newtime = new Date().getTime();

     var len = document.form1.chkC.length;
     var chkArr = document.form1.chkC;
     var boolv =  oElement.checked;

     for(var i=0;i<len;i++){
      chkArr[i].checked = boolv;
     }

     var newtime2 = new Date().getTime();

     td3.innerHTML="걸린시간 : "+(newtime2-newtime);
    }
    </script>
    </HEAD>
    <BODY>
     <form name='form1'>
      <table border='1' width='700'>
       <tr>
        <td><input type='checkbox' id='chkAall' onclick='checkAall(this)'>전체 체크/해제</td>
        <td><input type='checkbox' id='chkBall' onclick='checkBall(this)'>전체 체크/해제</td>
        <td><input type='checkbox' id='chkCall' onclick='checkCall(this)'>전체 체크/해제</td>
       </tr>
       <tr>
        <td>
         <div id="divA" style="overflow-x: hidden; overflow-y: auto; width:100%; height:200; padding: 0px; border: 1;">  <script language='JavaScript'>
           for(var i=0;i<2000;i++){
            document.write("<input type='checkbox' id='chkA' value='"+i+"'>A의 "+i+" 번째 체크박스<br>")
           }
          </script>
         <div>
        </td>
        <td>
         <div id="divB" style="overflow-x: hidden; overflow-y: auto; width:100%; height:200; padding: 0px; border: 1;">  <script language='JavaScript'>
           for(var i=0;i<2000;i++){
            document.write("<input type='checkbox' id='chkB' value='"+i+"'>B의 "+i+"번째 체크박스<br>")
           }
          </script>
         <div>    
        </td>
        <td>
         <div id="divC" style="overflow-x: hidden; overflow-y: auto; width:100%; height:200; padding: 0px; border: 1;">  <script language='JavaScript'>
           for(var i=0;i<2000;i++){
            document.write("<input type='checkbox' id='chkC' value='"+i+"'>C의 "+i+"번째 체크박스<br>")
           }
          </script>
         <div>    
        </td>
       </tr>
       <tr>
        <td id='td1'>&nbsp;</td>
        <td id='td2'>&nbsp;</td>
        <td id='td3'>&nbsp;</td>
       </tr>
      <table>
     </form>
    </BODY>
    </HTML>

    Posted by 1010