JavaScript/ExtJS2010. 2. 4. 10:41

1. document.form을 이용하는 방법

Ext.Ajax.request({
	url: 'targetUrl.jsp',
	method: 'POST',
	form: document.formname, //대상 form 객체
	success: function(result, request) {
		//code
	},
	failure: function(result, request) {
		//code
	}
});



2. json object를 이용하는 방법

var jsonData = Ext.urlDecode(Ext.Ajax.serializeForm(form));
Ext.Ajax.request({
	url: 'targetUrl.jsp',
	method: 'POST',
	params: jsonData,
	success: function(result, request) {
		//code
	},
	failure: function(result, request) {
		//code
	}
});
Posted by Jake Kim
JavaScript/Default2009. 12. 29. 10:15

참고 : http://www.crockford.com/javascript/memory/leak.html

Internet Explorer DOM 객체에 대하여 메모리 누수가 발생한다. (IE8에서는 개선 되었음)

Div Layer에 동적으로 Flash를 바꿔 낀다고 가졍한다.

1번 Flash는 작업관리자 IExplorer에서 메모리 확인 결과 100mb
2번 Flash는 작업관리자 IExplorer에서 메모리 확인 결과 200mb

이 나온다고 가정하면... 코드는 아래와 같다.


Div Layer "FlashObject"에 초기에 b.swf를 로딩하게 되면 작업관리자 IExplorer메모리는 200mb까지 할당된다.

그 상태에서 Div Layer "FlashObject"에 초기에 a.swf를 로딩하게 되면 작업관리자 IExplorer메모리는 순수 a.swf에 해당하는 메모리 100mb을 할당하지 않고 b.swf에 해당하는 메모리 + a.swf에 대항하는 메모리 총 300mb을 할당하는 모습을 볼수 있다. 이 구조를 계속 반복하게 되면 메모리 해제는 하지 못하고 누적되어 브라우저가 죽어버릴 것이다. 

위 사항을 해결할 수 있는 방법으로는 purge함수를 만들어 사용할 수 있다.

purge 함수는 DOM Element 인자로 받는다. Element의 Attributes를 루프를 돌면서, 함수를 찾으면 null로 만들어 순환구조를 끊고 메모리가 교정될 수 있도록 한다. 함수는 또한 모든 하위 Element에도 같은 작용을 해서 closure가 잘 제거 되도록 한다. purge함수는 모질라와 오페라에는 아무런 해가 없으며 IE에서만 작용한다. purge함수는 Element가 removeChild메소드나 innerHTML속성으로 삭제되기 전에 호출되어야 한다.

Posted by Jake Kim
JavaScript/Default2009. 11. 6. 00:09

자바스크립트에서 객체의 개수를 알아 오는 방법으로 object.length가 있다면 좋겠지만... 이런 방법은 없다...
대신 반복문을 돌려서 객체의 개수를 알아올수 있다.

var obj = {
	value0: {
		key: "a0",
		value: "JAVA"
	},
	value1: {
		key: "a1",
		value: "C#"
	},
	value2: {
		key: "a2",
		value: "C++"
	},
	value3: {
		key: "a3",
		value: "JSP"
	},
	value4: {
		key: "a4",
		value: "PHP"
	}
};
var size = 0;
for (var i in obj) {            
	size++;           
}
document.writeln(size);
Posted by Jake Kim
JavaScript/Default2009. 6. 23. 17:35

XMLHttpRequest Object


이번에는 웹 서버와 통신하는데 핵심 기능을 제공하는 XMLHttpRequest 객체를 사용하는 방법에 대해 알아보고,
해당 속성들을 이용하여 실제로 사용할 수 있는 예제를 만들어 보자.

XMLHttpRequest 프로그래밍 순서


XMLHttpRequest를 사용한 Ajax 프로그램은 다음과 같이 세 과정을 거치게 된다.
1. XMLHttpRequest 객체 생성
2. 웹 서버에 요청 전송하기
3. 웹 서버에서 응답이 도착하면 화면에 반영하기

위의 과정에 맞게 차례대로 살펴보자.

1) XMLHttpRequest 객체 생성


XMLHttpRequest 객체를 생성하는 방식은 브라우저마다 서로 다르다.
따라서 크로스 브라우징을 위한 코드를 작성하게 되면 아래와 같다.
var req;

if(window.XMLHttpRequest){                          // IE 이외에서  XMLHttpRequest 생성
	req = new XMLHttpRequest();
}else if(window.ActiveXObject){                     // IE에서  XMLHttpRequest 생성
	req = new ActiveXObject("Microsoft.XMLHTTP");
}



2) 웹 서버에 요청 전송하기


XMLHttpRequest 객체를 생성한 다음에는 생성한 XMLHttpRequest 객체를 사용해서 웹 서버에 요청을 전송할 수 있따.
웹 서버에 요청을 전송할 때 사용되는 함수는 다음과 같다.

•open() 함수 : 요청의 초기화. GET/POST 선택. 접속할 URL 입력
•send() 함수 : 웹 서버에 요청 전송

위의 두 함수를 이용하는 방식은 아래와 같다.
req.open("GET", "/test.txt", true);
req.send(null);


open() 함수는 세 개의 인자를 입력받는데, 다음과 같은 의미를 가지고 있다.
1번 인자는 HTTP 메소더를 지정한다.대개 "GET", "POST" 등을 사용한다. 이외에 서버에서 지원하는 HTTP 메서드인 PUT, DELETE,
HEAD 등이 되기도 한다.
2번 인자는 접속할 URL을 입력한다. 보안상 이유로 접속할 URL은 현재 페이지와 같은 도메인에 있어야 한다.
3번 인자는 동기/비동기 방식을 지정한다. 이 값이 'true'일 경우, 이 상태에서는 요청이 처리되는 도중에 사용자가 다른 작업을
할 수 있다. 반대로 'false'이면 요청은 동기적으로 처리되어서 요청이 종료될 때까지 사용자는 차단될 것이다.


3) 서버 응답 처리하기


open()함수와 send()함수를 사용하여 웹 서버에 데이터를 전송한 다음에 할 작업은 서버로부터 응답이 도착하면 알맞게 처리하는 것이다.
XMLHttpRequest 객체의 속성 중 하나인 onreadystatechange는 응답이 도착하면 특정 자바스크립트 함수를 호출하게 한다.

하지만 우선 이를 처리하기 전에 요청한 응답이 XMLHttpRequest객체에 전달 될 때까지의 상태를 나타낸 readyState에 알아보자.
각 상태에 따라 readyState 속성의 값이 아래와 같게 된다.
의미 설  명
0  UNINITIALIZED  객체만 생성되고 아직 초기화되지 않은 상태
1  LOADING  open 메서드가 호출되고 아직 send 메서드가 불리지 않은 상태
2  LOADED  send 메소드가 불렸지만 status와 해더는 도착하지 않은 상태
3  INTERACTIVE  데이터의 일부를 받은 상태
4  COMPLETED  데이터를 전부 받은 상태. 완전한 데이터의 이용 가능


이렇듯 상태에 맞는 작업을 아래의 코드처럼 사용하여 처리하는 것이 가능해진다.
function callback(){
     if(req.readyState == 1 || req.readyState == 2 || req.readyState == 3){
          // 화면에 서버에서 작업 중이라는 메시지 출력
     }else if(req.readyState == 4){
          // 서버에서 완전한 응답이 도착한 경우
          // 응답 결과에 따라 알맞은 작업 처리
     }
}


XMLHttpRequest 객체의 또 다른 속성인 status는 웹 서버에서 전달한 상태코드를 저장하게 된다.
status 속성에 저장되는 주요 상태 코드는 아래와 같다.
텍스트 설  명
200  OK  요청 성공
403  Forbidden  접근 거부
404  Not Found  페이지 없음
500  Internal Server Error  서버 오류 발생


따라서 서버로부터 응답이 도착하면 status 속성을 사용해서 요청이 성공적으로 수행되었는지 확인해야 한다.
다음과 같이 콜백 함수를 작성하는 것이 좋을 것이다.
function callback(){
     if(req.readyState == 4){
     	if(req.status == 200){
     	     // 정상적으로 수행하는 부분
     	}else{
     	     alert("문제 발생:"+req.statusText);
     	}
     }
}


마지막으로 responseText 속성에 대해 알아보자.
웹 서버로부터 정상적으로 요청이 들어오게 될 경우 웹 서브는 단순 텍스트 또는 XML의 두가지 형식으로 데이터를 전송하게 된다.
이 중 단순 텍스트로 응답이 왔을 때 사용하는 예제는 다음과 같다.
function callback(){
     if(req.readyState == 4){
     	if(req.status == 200){
     	     var txt = req.responseText;
     	     // txt 변수에 응답 데이터가 저장된다.
     	}
     }
}


이를 바탕으로 예제를 하나 살펴보자. 바로가기 소스보기


소스보기
exam.html
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="exam.js"></script>
<link rel="stylesheet" type="text/css" href="style.css" media="screen" />
<body>
입력창에 입력 후 '확인'버튼을 누르시면 글이 바뀌게 됩니다.
<a href="source.html" target="_blank">소스보기</a> 
<br/><br/>
<div id="head">Hello, Guest!</div>
<input id="name" type="text" value="이름을 입력하시오." onkeyup="change()"/>
</body>
</html>

exam.js
var req;

// input에 문장을 넣었을 때 정답을 확인하기 위한 XHR 객체 생성
function change(){
     var name = document.getElementById('name').value;
     var url = "exam.jsp?name=" + name;
     if(window.XMLHttpRequest){
          req = new XMLHttpRequest();
     }else if(window.ActiveXObject){
          req = new ActiveXObject("Microsoft.XMLHTTP");
     }
     req.open("Get",url,true);
     req.onreadystatechange = callback;
     req.send("");
}
// callback 함수
function callback(){
     if(req.readyState == 4){
          if(req.status == 200){
               var txt = req.responseText;
               document.getElementById('head').innerHTML = txt;
          }
     }
}

exam.jsp
<%@ page contentType="text/plain; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%
     String name = request.getParameter("name");
     String a = new String(name.getBytes("ISO-8859-1"),"euc-kr");
     out.print("Hello," + a + "!");
%>


출처: http://compstat.chonbuk.ac.kr/JavaScript/
Posted by Jake Kim