<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<title>Insert title here</title>
<script type="text/javascript">
var xhr;
function createRequest(){
if(window.ActiveXObject)
xhr = new ActiveXObject("Microsoft.XMLHTTP");
else if(window.XMLHttpRequest)
xhr = new XMLHttpRequest();
}

function test(){
createRequest(); // 함수호출로 사용자의 브라우저를 판단한 후 XMLHttprequest객체를 얻어내었다.
xhr.onreadystatechange = res; // 서버에서 응답이 전달될 때 그 응답을 받을 함수
var str = document.all.sel.value;
var param = "sel="+escape(encodeURIComponent(str));// 한글처
xhr.open("get", "innerHTMLEx2.jsp?"+param, true); // 요청방식과 요청할 페이지 비동기식 설정
xhr.send(null); // 서버요청 수행
}

function res(){
if(xhr.readyState == 4) // 서버 데이터 처리가 완료된 경우 : 4
if(xhr.status == 200){// 정상적인 완료 : 200
var str = xhr.responseText; // 응답 문자열
var tt = document.getElementById("tt");
tt.innerHTML = str;
}
}
</script>
</head>
<body>
과정 : <select id="sel">
<option value="과정1">과정1
<option value="과정2">과정2
</select><input type="button" value="보내기" onclick="test()">
<div id="tt" style="border:1 solid lightsteelblue;width:300px;height:100px;background:#dedede">
&nbsp;
</div>
</body>
</html> <%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<%
String sel = URLDecoder.decode(
request.getParameter("sel"),"utf-8");
String code = "";
if(sel.equals("과정1"))
code = "JAVA, JSP, Ajax, Struts";
else if(sel.equals("과정2"))
code = "JAVA, XML, Flex, Struts";
else
code = "준비 중...";
%>
<%=code %>
by Anna 안나 2009. 1. 5. 13:31


<html>
<head><title>예제 9-5</title></head>
<body bgcolor="yellow"
onload="srcTxt.value=objDiv.outerHTML">
<h3>innerHTML, innerText, outerHTML, outerText 비교하는 예</h3>
<hr noshade>
<div id="objDiv" style="background-color:cyan">
<p>아래 링크와 버튼에서 액세스되는 <b>div</b> 객체입니다.
</div>
<p>
위의 div 태그는 다음과 같습니다 <br>
<textarea id="srcTxt" rows=5 cols=50>
</textarea>
<hr noshade>
다음 버튼을 클릭하면 위의 div 객체 내의 속성을 보여줍니다.<p>
<a href="javascript:alert(objDiv.innerHTML)">div의 innerHTML</a><br>
<a href="javascript:alert(objDiv.outerHTML)">div의 outerHTML</a><br>
<a href="javascript:alert(objDiv.innerText)">div의 innerText</a><br>
<a href="javascript:alert(objDiv.outerText)">div의 outerText</a><p>
<hr noshade>
아래 창에 입력하여 변경하면 위의 div 객체의
내용이 변하는 것을 확인할 수 있습니다.<p>
변경하고자 하는 innerText를 입력하세요.<br>
<input type="text" id="inText" value="테스트 innerText">
<button onClick="objDiv.innerText=inText.value;">변경</button><br>
변경하고자 하는 outerText를 입력하세요.<br>
<input type="text" id="outText" value="테스트 outerText">
<button onClick="objDiv.outerText=outText.value;">변경</button>
<!-- outerText 변경시 objDiv까지 주소값이 변경됨 -->
</body>
</html>
by Anna 안나 2009. 1. 5. 13:26
innerHTML은 매우 유용하지만 한계가 있습니다. var target = '<li id="swim" class="insertClass">수영</li><li id="soccer">축구</li>'; 이와 같이 작성한 것을 한번에 DOM 트리에 반영할 수 있는 것이 innerHTML입니다. 그런데 여기서 간과해서는 안되는 것이 innerHTML의 위치가 child Node라는 것입니다. 즉, 위치가 정해져 있다는 것입니다 만약, parent 노드의 앞과 뒤의 Sibiling Node 위치에 위의 HTML 스크립트(Fragment)를 반영하려면 어떻게 해야할까요? innerHTML만으로는 이를 처리할 수 없습니다. 따라서 DOM에서 제공하는 메소드를 사용해야 하며, 이 또한 IE와 다르므로 IE에서 제공하는 메소드를 사용해야 합니다 IE는 insertAdjacentHTML()로 처리할 수 있으며 DOM은 createRange(), setStartBefore()/setStartAfter(), createContextualFragment()로 처리할 수 있습니다. 소스 코드는 여러분이 만들어 보시기 바랍니다. 다음에 실행이 되는 소스 코드를 게재하겠습니다.
by Anna 안나 2009. 1. 5. 13:24
jQuery란 무엇인가? 2006 년 초, John Resig가 만든 jQuery는 JavaScript 코드로 작업하는 사람들에게는 훌륭한 라이브러리이다. 여러분이 JavaScript 언어 초보자라서 라이브러리가 Document Object Model (DOM) 스크립팅과 Ajax의 복잡성을 다루어주기를 원하든지, 숙련된 JavaScript 구루로서 DOM 스크립팅과 Ajax의 반복성에 지루해졌다면, jQuery가 제격이다. jQuery는 코드를 단순하고 간결하게 유지한다. 많은 반복 루프와 DOM 스크립팅 라이브러리 호출을 작성할 필요가 없다. jQuery를 사용하면 매우 적은 문자로 표현할 수 있다. jQuery 철학은 매우 독특하다. 무엇이든 단순하고 재사용 가능한 것으로 유지하기 위해 디자인 되었다. 여러분이 이러한 철학을 이해하고 여기에 편안함을 느낀다면, jQuery가 여러분의 프로그래밍 방식을 충분히 향상시킬 수 있다.
((-------IMAGE-------)) ((-------IMAGE-------))
((-------IMAGE-------))
위로

단순화 다 음은 jQuery가 여러분의 코드에 어떤 영향을 미치는지를 보여주는 예제이다. 페이지의 모든 링크에 클릭 이벤트를 붙이는 것 같이 단순하고 일반적인 것을 수행하려면, 플레인 JavaScript 코드와 DOM 스크립팅을 사용하는 것이 낫다. (Listing 1)
Listing 1. jQuery 없는 DOM 스크립팅
var external_links = document.getElementById('external_links'); var links = external_links.getElementsByTagName('a'); for (var i=0;i < links.length;i++) { var link = links.item(i); link.onclick = function() { return confirm('You are going to visit: ' + this.href); }; }
Listing 2는 같은 기능에 jQuery를 사용한 모습이다.
Listing 2. jQuery를 사용한 DOM 스크립팅
$('#external_links a').click(function() { return confirm('You are going to visit: ' + this.href); });
놀랍지 않은가? jQuery를 사용하면 복잡하지 않게 코드로 표현하고자 하는 것만 나타낼 수 있다. 엘리먼트를 반복할 필요가 없다. click() 함수가 이 모든 것을 관리한다. 또한, 다중 DOM 스크립팅 호출도 필요 없다. 여기에서 필요한 것은 엘리먼트가 어떻게 작동하는지를 설명하는 짧은 스트링이다. 이 코드로 어떻게 작업이 수행되는지를 이해하기는 조금 어렵다. 우선, $() 함수가 있어야 한다. 이것은 jQuery에서 가장 강력한 함수이다. 대게, 이 함수를 사용하여 문서에서 엘리먼트를 선택한다. 이 예제에서, 이 함수는 Cascading Style Sheets (CSS) 신택스를 포함하고 있는 스트링으로 전달되고, jQuery는 효율적으로 이 엘리먼트를 찾는다. CSS 셀렉터의 기본을 이해하고 있다면, 이 신택스가 익숙할 것이다. Listing 2에서, #external_links는 external_links의 id를 가진 엘리먼트를 찾는다. a 앞에 있는 공간은 jQuery에게 external_links 엘리먼트 내의 모든 <a> 엘리먼트를 찾도록 명령한다. 영어와 DOM은 장황하지만, CSS에서는 매우 간단하다. $() 함수는 CSS 셀렉터와 매치하는 모든 엘리먼트를 포함하고 있는 jQuery 객체를 리턴한다. jQuery 객체는 어레이와 비슷하지만, 수 많은 특별한 jQuery 함수들이 포함된다. 예를 들어, click 함수를 호출함으로써 클릭 핸들러 함수를 jQuery 객체의 각 엘리먼트에 할당할 수 있다. 또한, 엘리먼트나 엘리먼트의 어레이를 $() 함수로 전달하면, 이것은 엘리먼트 주위에 jQuery 객체를 래핑할 것이다. 이 기능을 사용하여 window 객체 같은 것에 jQuery 함수를 적용하고 싶을 것이다. 일반적으로 이 함수를 다음과 같이 로드 이벤트에 할당한다. window.onload = function() { // do this stuff when the page is done loading };
jQuery를 사용하면, 같은 코드도 다음과 같이 된다. $(window).load(function() { // run this when the whole page has been downloaded });
이미 알고 있었겠지만, 윈도우가 로딩하기를 기다리는 일은 매우 지루한 일이다. 전체 페이지가 로딩을 끝마쳐야 하기 때문이다. 여기에는 페이지의 모든 이미지들도 포함된다. 가끔, 이미지 로딩을 먼저 끝내고 싶지만, 대부분의 경우 Hypertext Markup Language (HTML)만 로딩해야 한다. jQuery는 문서에 특별한 ready 이벤트를 만듦으로써 이 문제를 해결한다. $(document).ready(function() { // do this stuff when the HTML is all ready });
이 코드는 document 엘리먼트 주위에 jQuery 객체를 만들고, HTML DOM 문서가 준비될 때 함수를 설정하여 인스턴스를 호출한다. 이 함수를 필요한 만큼 호출할 수 있다. 진정한 jQuery 스타일에서, 지름길은 이 함수를 호출하는 것이다. 함수를 $() 함수로 전달한다. $(function() { // run this when the HTML is done downloading });
지금까지, $() 함수를 사용하는 세 가지 방법을 설명했다. 네 번째 방법은, 스트링을 사용하여 엘리먼트를 만드는 것이다. 결과는, 그 엘리먼트를 포함하고 있는 jQuery 객체가 된다. Listing 3은 문단을 페이지에 추가하는 예제이다.
Listing 3. 간단한 문단을 생성하여 붙이기
$('<p></p>') .html('Hey World!') .css('background', 'yellow') .appendTo("body");
이전 예제에서 파악했겠지만, jQuery의 또 다른 강력한 기능은 메소드 체인(method chaining.)이다. jQuery 객체에 대해 메소드를 호출할 때마다, 이 메소드는 같은 jQuery 객체를 리턴한다. jQuery 객체에 다중 메소드를 호출하고 싶다면 셀렉터를 다시 입력하지 않고 이를 수행할 수 있다. $('#message').css('background', 'yellow').html('Hello!').show();

((-------IMAGE-------)) ((-------IMAGE-------))
((-------IMAGE-------))
위로

Ajax로 단순하게! Ajax는 jQuery를 사용하면 더 단순해 질 수 있다. jQuery에는 쉬운 것도 쉽게 복잡한 것도 가능한 단순하게 만드는 유용한 함수들이 많이 있다. Ajax에서 사용되는 방식은 HTML 청크를 페이지 영역에 로딩하는 것이다. 여러분이 필요로 하는 엘리먼트를 선택하고 load() 함수를 사용하는 것이다. 다음은 통계를 업데이트 하는 예제이다. $('#stats').load('stats.html');
일부 매개변수들을 서버 상의 페이지로 전달해야 할 경우가 종종 있다. jQuery를 사용하면 이는 매우 간단하다. 필요한 메소드가 어떤 것인지에 따라서 $.post()와 $.get() 중 선택한다. 선택적 데이터 객체와 콜백 함수를 전달할 수도 있다. Listing 4는 데이터를 보내고 콜백을 사용하는 예제이다.
Listing 4. Ajax를 사용하여 데이터를 페이지로 보내기
$.post('save.cgi', { text: 'my string', number: 23 }, function() { alert('Your data has been saved.'); });
복잡한 Ajax 스크립팅을 해야 한다면, $.ajax() 함수가 필요하다. xml, html, script, json을 지정할 수 있고, 여러분이 바로 사용할 수 있도록 jQuery가 자동으로 콜백 함수에 대한 결과를 준비한다. 또한, beforeSend, error, success, complete 콜백을 지정하여 사용자에게 Ajax에 대한 더 많은 피드백을 제공할 수 있다. 게다가, Ajax 요청의 타임아웃이나 페이지의 "최종 변경" 상태를 설정하는 매개변수들도 있다. Listing 5는 필자가 언급했던 매개변수를 사용하여 XML 문서를 검색하는 예제이다.
Listing 5. $.ajax()를 사용하여 복잡한 Ajax를 단순하게
$.ajax({ url: 'document.xml', type: 'GET', dataType: 'xml', timeout: 1000, error: function(){ alert('Error loading XML document'); }, success: function(xml){ // do something with xml } });
콜백 성공으로 XML을 받으면, jQuery를 사용하여 HTML에서 했던 것과 같은 방식으로 XML을 볼 수 있다. 이는 XML 문서 작업을 쉽게 하며 콘텐트와 데이터를 웹 사이트로 쉽게 통합시킨다. Listing 6은 리스트 아이템을 XML의 <item> 엘리먼트용 웹 페이지에 추가하는 success 함수에 대한 확장 모습이다.
Listing 6. jQuery를 사용하여 XML 작업하기
success: function(xml){ $(xml).find('item').each(function(){ var item_text = $(this).text(); $('<li></li>') .html(item_text) .appendTo('ol'); }); }

((-------IMAGE-------)) ((-------IMAGE-------))
((-------IMAGE-------))
위로

HTML 애니메이션 jQuery를 사용하여 기본적인 애니메이션과 효과를 다룰 수 있다. 애니메이션 코드의 중심에는 animate() 함수가 있는데, 이는 숫자로 된 CSS 스타일 값을 바꾼다. 예를 들어, 높이, 넓이, 폭, 위치를 움직일 수 있다. 또한, 애니메이션의 속도를 밀리초 또는 사전 정의된 속도(느림, 보통, 빠름)로 지정할 수 있다. 다음은, 엘리먼트의 높이와 넓이를 동시에 움직이게 하는 예제이다. 시작 값은 없고 종료 값만 있다. 시작 값은 엘리먼트의 현재 크기에서 가져온다. 여기에도 콜백 함수를 첨부했다. $('#grow').animate({ height: 500, width: 500 }, "slow", function(){ alert('The element is done growing!'); });
jQuery는 빌트인 함수를 사용하여 일반적인 애니메이션도 더욱 쉽게 만든다. show()와 hide() 엘리먼트를 즉각적으로 또는 지정된 속도로 사용할 수 있다. fadeIn()과 fadeOut() 또는 slideDown()과 slideUp()을 사용하여 엘리먼트를 나타나게 하거나 사라지게 할 수 있다. 다음은 네비게이션의 slidedown 예제이다. $('#nav').slideDown('slow');

((-------IMAGE-------)) ((-------IMAGE-------))
((-------IMAGE-------))
위로

DOM 스크립팅과 이벤트 핸들링 jQuery는 DOM 스크립팅과 이벤트 핸들링을 단순화하는데 제격이다. DOM의 트래버스와 조작이 쉽고, 이벤트의 첨부, 제거, 호출은 매우 자연스러운 일이며, 직접 수행하는 것보다 에러도 적게 발생한다. 기본적으로 jQuery는 DOM 스크립팅으로 수행하는 일들을 더욱 쉽게 수행할 수 있도록 해준다. 엘리먼트를 생성하고 append() 함수를 사용하여 이들을 다른 엘리먼트로 연결할 수 있고, clone()을 사용하여 엘리먼트를 중복시키고, 콘텐트를 html()로 설정하고, empty() 함수로 콘텐트를 삭제하고, remove() 함수로 엘리먼트를 삭제하고, wrap() 함수를 사용하여 또 다른 엘리먼트로 엘리먼트를 래핑한다. DOM을 트래버스 함으로써 jQuery 객체의 콘텐트를 변경할 때 여러 함수들을 사용할 수 있다. 엘리먼트의 siblings(), parents(), children()을 사용할 수 있다. 또한, next() 또는 prev() sibling 엘리먼트도 선택할 수 있다. 아마도 가장 강력한 것은 find() 함수일 것이다. jQuery 셀렉터를 사용하여 jQuery 객체의 엘리먼트 종속 관계들을 통해 검색할 수 있다. 이 함수는 end() 함수와 사용될 때 더욱 강력해진다. 이 함수는 실행 취소 함수와 비슷하고, find() 또는 parents() 또는 다른 트래버싱 함수들을 호출하기 전에 가졌던 jQuery 객체로 돌아간다. 메소드 체인과 함께 사용되면, 복잡한 연산도 단순하게 보이게 할 수 있다. Listing 7은 로그인 폼을 찾고 이와 관련한 여러 엘리먼트를 조작하는 예제이다.
Listing 7. DOM의 트래버스와 조작
$('form#login') // hide all the labels inside the form with the 'optional' class .find('label.optional').hide().end() // add a red border to any password fields in the form .find('input:password').css('border', '1px solid red').end() // add a submit handler to the form .submit(function(){ return confirm('Are you sure you want to submit?'); });
믿을 수 있는지 모르겠지만, 이 예제는, 공백을 사용한 하나의 연결된 코드 라인일 뿐이다. 우선, 로그인 폼을 선택했다. 그리고 나서, 이 안에 선택 레이블을 찾고, 이들을 숨긴 다음, end()를 호출하여 폼으로 돌아가게 하였다. 패스워드 필드를 찾았고, 보더를 빨간색으로 한 다음, 다시 end()를 호출하여 폼으로 돌아갔다. 마지막으로, 제출 이벤트 핸들러를 폼에 추가했다. 여기에서 특히 재미있는 부분은 jQuery가 모든 쿼리 연산들을 최적화 하기 때문에, 여러분은 모든 것이 서로 잘 연결될 때 엘리먼트를 두 번 찾을 필요가 없다. 공통 이벤트 핸들링은 click(), submit(), mouseover() 같은 함수를 호출하고 여기에 이벤트 핸들러 함수를 전달하는 것만큼 단순하다. 게다가, bind('eventname', function(){})을 사용하여 커스텀 이벤트 핸들러를 할당하는 옵션도 있다. unbind('eventname')를 사용하여 특정 이벤트를 제거하거나, unbind()를 사용하여 모든 이벤트를 제거할 수 있다. 이것과 기타 함수들을 사용하는 다른 방법들은, jQuery 애플리케이션 프로그램 인터페이스(API) 문서를 참조하라. (참고자료)
((-------IMAGE-------)) ((-------IMAGE-------))
((-------IMAGE-------))
위로

jQuery 셀렉터의 힘 활용하기 #myid 같은 아이디 또는 div.myclass 같은 클래스 이름으로 엘리먼트를 선택한다. 하지만, jQuery는 하나의 셀렉터에서 거의 모든 엘리먼트 조합을 선택할 수 있도록 하는 복잡하고도 완벽한 셀렉터 신택스를 갖고 있다. jQuery의 셀렉터 신택스는 CSS3과 XPath에 기반하고 있다. CSS3과 XPath 신택스를 더욱 잘 안다면, jQuery 사용이 더욱 수월해진다. CSS와 XPath를 포함하여 jQuery 셀렉터의 전체 리스트를 보려면 참고자료 섹션을 참조하라. CSS3 에는 모든 브라우저가 지원하지 않는 신택스가 포함되어 있기 때문에, 이를 자주 볼 수 없다. 하지만, jQuery에서 CSS3을 사용하여 엘리먼트를 선택한다. jQuery는 고유의 커스텀 셀렉터 엔진을 갖고 있다. 예를 들어, 테이블의 모든 빈 컬럼 안에 대시(dash)를 추가하려면, :empty pseudo-selector를 사용한다. $('td:empty').html('-');
특정 클래스를 갖고 있지 않은 모든 엘리먼트를 찾는다면? CSS3은 이를 위한 신택스도 있다. :not pseudo-selector를 사용하는 것이다. 다음은 required의 클래스를 갖고 있지 않은 모든 인풋을 숨기는 방법이다. $('input:not(.required)').hide();
또한, CSS에서처럼 다중 셀렉터를 콤마를 사용하여 하나로 연결시킬 수 있다. 다음은 이 페이지에서 모든 리스트 유형들을 동시에 숨기는 예제이다. $('ul, ol, dl').hide();
XPath는 하나의 문서에서 엘리먼트를 찾는 강력한 신택스이다. CSS와는 다르며, CSS로 수행할 수 없는 몇 가지 일을 수행할 수 있다. 보더를 모든 체크 박스의 부모 엘리먼트에 추가하려면, XPath의 /.. 신택스를 사용할 수 있다. $("input:checkbox/..").css('border', '1px solid #777');
가독성 있는 테이블을 만들려면, 다른 클래스 이름을 테이블의 모든 짝수 또는 홀수 행에 붙인다. 이를 다른 말로 테이블의 스트라이핑(striping)이라고 한다. jQuery를 사용하면 :odd pseudo-selector 덕택에 쉽게 수행할 수 있다. 아래 예제는 테이블의 모든 홀수 행의 백그라운드를 striped 클래스를 사용하여 변경한다. $('table.striped > tr:odd').css('background', '#999999');
jQuery 셀렉터로 코드를 어느 정도 단순화 할 수 있는지를 보았다. 어떤 엘리먼트를 선택하든지 간에, 하나의 jQuery 셀렉터를 사용하여 이를 정의하는 방법도 찾을 수 있다.
((-------IMAGE-------)) ((-------IMAGE-------))
((-------IMAGE-------))
위로

플러그인으로 jQuery 확장하기 대 부분의 소프트웨어와는 달리, jQuery용 플러그인 작성은 복잡한 API를 사용해야 하는 힘든 일이 아니다. 사실, jQuery 플러그인은 작성하기가 쉬워서 몇 가지만 작성하면 코드를 더욱 단순하게 유지할 수 있다. 다음은 여러분이 작성할 수 있는 가장 기본적인 jQuery 플러그인이다. $.fn.donothing = function(){ return this; };
단순하지만, 이 플러그인은 약간의 설명이 필요하다. 우선, 함수를 모든 jQuery 객체에 추가하려면, 여기에 $.fn을 할당하고, 이 함수는 this (jQuery 객체)를 리턴하여 이것이 메소드 체인을 깨트리지 않도록 해야 한다. 이 예제를 기반으로 쉽게 구현할 수 있다. css('background')를 사용하는 대신 플러그인을 작성하여 백그라운드를 바꾸려면, 다음을 사용한다. $.fn.background = function(bg){ return this.css('background', bg); };
css()에서 값을 리턴할 뿐이다. 이것은 이미 jQuery 객체를 리턴하기 때문이다. 따라서, 메소드 체인은 여전이 잘 작동한다. 여러분은 반복 작업이 있을 경우에 jQuery 플러그인을 사용하기 바란다. 예를 들어, 같은 일을 여러 번 수행하기 위해 each() 함수를 사용하고 있다면 플러그인을 사용해도 된다. jQuery 플러그인을 작성이 쉽기 때문에, 여러분이 사용할 수 있는 것도 수백 가지나 존재한다. jQuery는 탭, 곡선형 코너, 슬라이드 쇼, 툴 팁, 날짜 셀렉터, 기타 여러분이 상상하고 있는 모든 것을 위한 플러그인이 있다. 플러그인 리스트는 참고자료 섹션을 참조하기 바란다. 가 장 복잡하고 광범위하게 사용되는 플러그인은 Interface이다. 이것은 정렬, 드래그&드롭 기능, 복합 효과, 기타 복잡한 사용자 인터페이스(UI)를 핸들하는 애니메이션 플러그인이다. Interface가 jQuery를 위한 것이라면 Prototype에는 Scriptaculous가 있다. 또한 Form 플러그인도 대중적이고 유용하다. 이것으로 Ajax를 사용하여 백그라운드에서 폼을 쉽게 제출할 수 있다. 이 플러그인은 폼의 제출 이벤트를 하이재킹 하고, 다른 인풋 필드를 찾고, 이들을 사용하여 Ajax 호출을 구현하는 상황에 사용된다.
((-------IMAGE-------)) ((-------IMAGE-------))
((-------IMAGE-------))
위로

jQuery 이후의 삶 jQuery 를 사용하여 할 수 있는 것의 표면적인 부분만 다루었다. jQuery는 기분 좋게 사용할 수 있고 새로운 트릭이나 기능도 자연스럽다. jQuery는 JavaScript와 Ajax 프로그래밍을 매우 단순화 시킬 수 있다. 새로운 것을 배울 때마다 코드는 더욱 단순해 진다. jQuery를 배운 후에, 필자는 JavaScript 언어로 하는 프로그래밍에 재미를 발견했다. 지루한 부분은 알아서 처리되기 때문에, 필자는 중요한 코딩 부분에만 집중하면 된다. jQuery를 사용하게 되면서 지난날 for 루프를 작성하던 때는 거의 기억이 나지 않는다. 심지어, 다른 JavaScript 라이브러리를 사용할 생각도 거의 하지 않는다. jQuery는 JavaScript 프로그래밍 방식을 진정으로 바꿔 놓았다.

참고자료교육
한국 developerWorks XML 존: 한국 developerWorks XML 존에서 XML 관련 자료를 더 볼 수 있다.

jQuery API 문서

jQuery 튜토리얼

Visual jQuery: jQuery API 레퍼런스.

IBM XML 인증: XML 분야의 IBM 인증 개발자에 도전하십시오.

XML 기술 자료: 한국 developerWorks XML 존에서 다양한 기술 자료, 팁, 튜토리얼, 표준, IBM Redbook 참고하기.


제품 및 기술 얻기
jQuery: jQuery 메인 사이트를 방문해 소프코드 다운로드 하기.

Selectors: CSS3과 XPath 셀렉터를 포함하여 jQuery에 사용되는 모든 셀렉터들.

jQuery 플러그인

Interface

Form 플러그인


토론
jQuery 블로그: : 공식 jQuery 블로그에서 정규 뉴스와 업데이트 확인하기.

XML 존 토론 포럼
by Anna 안나 2009. 1. 5. 13:22
iframe을 부득이하게 사용하는 웹페이지를 만들다보면 iframe의 크기를 자꾸 바꿔줘야 하는 경우가 왕왕 발생한다.
다음의 예제는 iframe의 크기를 자동으로 바꿔주는 예제이다.

kurapa.com에도 적용해 보았는데, 잘 동작하는 것을 확인하였다.

<iframe id='ifrm'
frameborder=0
width=100%
height=450
scrolling=no
src='http://kurapa.com'
></iframe>

<script language='javascript'>

function getDocHeight(doc)
{
var docHt = 0, sh, oh;
if (doc.height)
{
docHt = doc.height;
}
else if (doc.body)
{
if (doc.body.scrollHeight) docHt = sh = doc.body.scrollHeight;
if (doc.body.offsetHeight) docHt = oh = doc.body.offsetHeight;
if (sh && oh) docHt = Math.max(sh, oh);
}
return docHt;
} function getReSize()
{
var iframeWin = window.frames['ifrm']; var iframeEl = window.document.getElementById? window.document.getElementById('ifrm'): document.all? document.all['ifrm']: null; if ( iframeEl && iframeWin )
{
var docHt = getDocHeight(iframeWin.document); if (docHt != iframeEl.style.height) iframeEl.style.height = docHt + 'px';
}
else
{ // firefox
var docHt = window.document.getElementById('ifrm').contentDocument.height;
window.document.getElementById('ifrm').style.height = docHt + 'px';
}
} function getRetry()
{
getReSize();
setTimeout('getRetry()',500);
}
getRetry();
</script>
by Anna 안나 2009. 1. 5. 13:21
Lot of AJAX Start Page, which one do you prefer?

Google Personalized Homepage
http://www.google.com/ig((-------IMAGE-------))

Netvibes
http://www.netvibes.com((-------IMAGE-------))

Favoor
http://www.favoor.com((-------IMAGE-------))

Start
http://www.start.com((-------IMAGE-------))

Windows Live
http://www.live.com((-------IMAGE-------))

Protopage
http://www.protopage.com/v2((-------IMAGE-------))

My Yahoo!
http://my.yahoo.com((-------IMAGE-------))

Pageflakes
http://www.pageflakes.com

My MSN
http://my.msn.com

HomePortals
http://www.cfempire.com/home

Zoozio
http://www.zoozio.com

My Potu
http://my.potu.com

eskobo
http://www.eskobo.com

ItsAStart
http://itsastart.com

OKRSS
http://www.okrss.com

dodoor
http://www.dodoor.cn

LinkedFeed
http://www.linkedfeed.com

MemeFlow
http://www.memeflow.com/goto

Fold
http://www.fold.com
by Anna 안나 2009. 1. 5. 13:20
ajax를 이용한 파일 탐색기 입니다.

처음에 트리 구조를 공부하다가 만든건데 어쩌다 보니 탐색기가 되어 버렸네요.

조금만 수정 하시면 웹하드로도 사용하실수 있을겁니다.

safari3, FF2 , IE6,7 에서 테스트해보았습니다.

사용하실때 tree.html안의 root경로만 변경하여 주시면 됩니다.

- 반드시 접근할수 있는 경로로 변경해주세요.
- 접근할수 없는 권한의 경로로 이동하면 에러가 나네요.. -.-;

<script language="javascript">
//경로(phth=불러올수 있는 서버 주소(절대경로)) , 리턴되는 값을 받을 함수
root = "접근할수 있는 경로";
xmlHttp("data.php?path="+root,tree.view);
</script>


((-------IMAGE-------)) file.zip
by Anna 안나 2009. 1. 5. 13:17
[ajax & php] PHP와 AJAX를 연동해보자

PHP와 AJAX를 연동해보자라... 참 거창합니다만 실상 알고보면 되게 허섭한 내용입니다 ^^ AJAX란 무엇인가? 복잡한 설명은 패스하고 간단하게 설명합니다.. AJAX는 어떠한 입력폼에 입력하고 전송할때 전송이 완료되어 모든 처리가 끝나기전까지 아무런 작업도 하지 못하고 기다려야 하는 부분이 해소되어 전송하면서도 계속해서 작업을 하거나 빈페이지를 보지 않고 진행상황을 직접 연출하는등 으로 지루함을 달랠수 있는 방법입니다... 간단히 예를 들어보면 우리가 게시판을 접속해서 목록을 보다가 두번째 페이지를 보려고 [2] 라는것을 클릭합니다... 이때 보통은 빈페이지가 보이거나 새로운 페이지를 불러오기 위해 리프래시(새로고침)가 되는 현상을 볼수가 있습니다.. 그러나 AJAX를 이용하게 되면 모든 처리가 완료되어 결과내용이 전달되면 바로 현재 보고있는 상태에서 내용이 바뀌어버립니다.. 그래서 기다릴 필요가 없게 되는거죠.. 그러나 이것도 단점이 있으니 지원하지 않는 브라우저나 OS가 있으며 어떤 오류가 생길때 해당 오류에 대해 정확히 파악을 할수가 없을때가 있다는것이 단점입니다.. 서론은 여기까지 하기로 하고요^^ 그럼 어떻게 연동을 하게 될까요.. 입력폼등 출력페이지를 제작할때 xmlHttpRequest 를 이용해서 하실수 있는데 이를 구성하는 방법이 쉽지많은 않습니다... 해서 간단한 소스를 보겠습니다... function createHttpRequest()
{ if(window.ActiveXObject) {
//Win e4,e5,e6용

try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) { // 위 부분이 실패하게 되면
try { // 여기로 넘어옵니다..
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (e2) { // 이마저도 실패되면 아무값도 리턴하지 않습니다..
return null;
}
}
}
else if(window.XMLHttpRequest) { //그밖에 브라우저
// Win Max Linux m1,f1,o8,Mac s1 Linux k3 용 return new XMLHttpRequest();
}
else {
return null;
}
}
이렇게 함수로 묶었습니다.. 요것을 <script> 와 </script> 사이의 필요에 의해서 불러서 사용할수 있습니다.. ajax = createHttpRequest(); // 이런식으로 연결해서 사용할수 있습니다.. 그러나 요렇게만 해서 사용하게 되면 한글의 경우는 전송시 깨져서 나가기때문에 UTF-8 로 변경하는 작업이 필요하게 됩니다... 그부분을 함수로 묶어봤습니다... function sendRequest(callback,data,method,url,async,sload,user,password)
{ //callback 인자는 전송후 전달받은 값이 있을경우 처리할 곳을 의미합니다.. //data 는 전달시 필요한 데이터가 있으면 붙여주는곳이며 //method 는 POST 또는 GET 방식중 선택합니다.. //url 은 전송할 주소를 지정하는 곳이며 //async 비동기식이면 true 동기라면 false 로 지정합니다.. //sload 는 수퍼로드로 강제로드(true) 혹은 생략 false 로 사용할수 있습니다. //user 와 password 는 인증페이지인경우 전달하여 접근하도록 하는 인자입니다.. //XMLHttpRequest 오브젝트 생성 var oj = createHttpRequest();
if( oj == null ) return null; //강제 로드의 설정 var sload = (!!sendRequest.arguments[5])? sload:false;
if(sload || method.toUpperCase() == 'GET') url += "?"; // 메소드가 GET 이면 주소에 ?를 붙여주어 data 값을 전달하도록 합니다..
if(sload) url = url+"t="+(new Date()).getTime(); oj.onreadystatechange = function ()
{ // 전달된 값이 존재하면 콜백함수로 넘겨줍니다...
if ( oj.readyState == 4 ){ // 이부분은 상태가 전송완료인경우에 해당됩니다..
callback(oj);
}
}

// URL 인코딩
data = uriEncode(data); // 넘겨주는 data 값에 한글이 있을수 있으므로 utf-8 형식으로 포멧합니다..
if(method.toUpperCase() == 'GET') {
url += data;
} oj.open(method,url,async,user,password); //전송합니다.. //해더 application/x-www-form-urlencoded 설정 setEncHeader(oj); //헤더 설정하는 부분으로 케릭터셋도 함께 설정됩니다..
//send 메소드 oj.send(data); //전송할 data 값이 있으면 전송합니다.. //URI 인코딩 헤더 설정 function setEncHeader(oj) {
var contentTypeUrlenc = 'application/x-www-form-urlencoded; charset=UTF-8'; if(!window.opera) {
oj.setRequestHeader('Content-Type',contentTypeUrlenc);
} else {
if((typeof oj.setRequestHeader) == 'function')
oj.setRequestHeader('Content-Type',contentTypeUrlenc);
}
return oj;
}
//URL 인코딩
function uriEncode(data) { if(data!= "") {
//&와 = 로 일단 분해해서 encode

var encdata = '';
var datas = data.split('&');
for(i=1;i<datas.length;i++) {
var dataq = datas[i].split('=');
encdata += '&'+encodeURIComponent(dataq[0])+'='+encodeURIComponent(dataq[1]);
}
} else {
encdata = "";
}
return encdata; }
return oj; } 본 소스는 AJAX 입문이라는 책에서 참고한 내용입니다.. 실질적으로 사용할때는 onclick 또는 링크에 sendRequest("콜백함수명","전달할 데이터명","전송방식","전송할 주소","엔씽크","수퍼로드"); 형식이 되겠습니다... 콜백함수가 onloadl 이라면 function on_loadedl(oj) {
var res = decodeURIComponent(oj.responseText); document.all.testview.innerHTML = res;
} 이런식으로 전달받은 값을 사용하여 출력해줄수 있겠습니다... testview 는 전달받은 내용을 출력해줄 Div(레이어)나 테이블의 ID값등으로 지정하시면 되겠습니다.. 상당히 힘들수도 있는 부분임에도 끝까지 읽어주셔서 감사합니다..^^ 출처 : 우 린친구닷컴 - [ajax & php] PHP와 AJAX를 연동해보자 - http://urin79.com/zb/?mid=blog&category=100313&page=5&document_srl=375257
by Anna 안나 2009. 1. 5. 13:16
출처: http://sodumarvin.tistory.com/5 (1) test.php <!doctype html public "-//w3c//dtd xhtml 1.0 strict//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
<html>
<head>
<title> javascript와 xml을 이용한 트리만들기 </title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script language="javascript">
<!--
var XMLConst =
{
ELEMENT_NODE :1,
ATTRIBUTE_NODE :2,
TEXT_NODE :3,
CDATA_SECTION_NODE :4,
ENTITY_REFERENCE_NODE :5,
ENTITY_NODE :6,
PROCESSING_INSTRUCTION_NODE :7,
COMMENT_NODE :8,
DOCUMENT_NODE :9,
DOCUMENT_TYPE_NODE :10,
DOCUMENT_FRAGMENT_NODE :11,
NOTATION_NODE :12
}
var favoriteGen =
{
xmlDoc : null,
Tree : null, importXML : function()
{

if (document.implementation && document.implementation.createDocument)
{
xmlDoc = document.implementation.createDocument("", "", null);
xmlDoc.onload = favoriteGen.generateXML;
}
else if (window.ActiveXObject)
{
xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.onreadystatechange = function () {
if (xmlDoc.readyState == 4) favoriteGen.generateXML()
};
}
else
{
alert('브라우저가 스크립트를 지원하지 않습니다.');
}

xmlDoc.load("tree.xml");
},
generateXML : function()
{
if(xmlDoc != null)
{
if(xmlDoc.hasChildNodes())
{
var xChildNodes = "";

// 이크.. 참.. 별게 다 틀리네.
if(document.all)
xChildNodes = xmlDoc.childNodes[1].childNodes;
else
xChildNodes = xmlDoc.childNodes[0].childNodes; for(var i=0 ; i < xChildNodes.length ; i++)
{
var node = xChildNodes[i];

if(node.nodeType == XMLConst.ELEMENT_NODE)
{
var title = getAttribute(node,"title");

if(node.nodeName == "folder")
{
// recursive
var folderNode = getFolder("true",title);
favoriteGen.Tree.appendChild(folderNode); favoriteGen.generateXML_R(node,folderNode);
}
else
{
var url = getAttribute(node,"url");
var docNode = getDoc(title,url);
favoriteGen.Tree.appendChild(docNode);
}
}
}
}
}
},
generateXML_R : function(pNode,pAppendNode)
{
if(pNode.hasChildNodes())
{
var xChildNodes = pNode.childNodes; for(var i=0 ; i < xChildNodes.length ; i++)
{
var node = xChildNodes[i];

if(node.nodeType == XMLConst.ELEMENT_NODE)
{
var title = getAttribute(node,"title");

if(node.nodeName == "folder")
{
// recursive
var folderNode = getFolder("true",title);
pAppendNode.appendChild(folderNode); favoriteGen.generateXML_R(node,folderNode);
}
else
{
var url = getAttribute(node,"url");
var docNode = getDoc(title,url);
pAppendNode.appendChild(docNode);
}
}
}
}
}
};
function getFolder(pIsOpen,pText)
{
var div = document.createElement("div");

var isOpenAtt = document.createAttribute("isOpen");
isOpenAtt.value = "true";

var classNameAtt = document.createAttribute("class");
classNameAtt.value = "folder_node_visible"; div.setAttributeNode(isOpenAtt);
div.setAttributeNode(classNameAtt);

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

div.innerHTML = spanHTML; return div;
}
function getDoc(pText,pUrl)
{
var div = document.createElement("div");

var classNameAtt = document.createAttribute("class");
classNameAtt.value = "doc_node_visible";

div.setAttributeNode(classNameAtt);
div.innerHTML = "[문서]<a href=\"" + pUrl + "\">" + pText + "</a>";

return div;
}
function setOpen(pObj)
{
var folderNode = pObj.parentNode;
var isOpen = getAttribute(folderNode,"isOpen");

if(folderNode.hasChildNodes())
{
var xChildNodes = folderNode.childNodes; for(var i=0 ; i < xChildNodes.length ; i++)
{
var node = xChildNodes[i];

if(node.nodeType == XMLConst.ELEMENT_NODE)
{
if(node.nodeName == "DIV")
{
var className = getAttribute(node,"class");
if(isOpen == "true")
{
if(className.substr(0,3) == "doc")
setAttribute(node,"class","doc_node_hidden");
else
setAttribute(node,"class","folder_node_hidden");
}
else
{
if(className.substr(0,3) == "doc")
setAttribute(node,"class","doc_node_visible");
else
setAttribute(node,"class","folder_node_visible");
}
}
}
}
}
setAttribute(pObj,"class",(isOpen=="true" ? "folder_closed" : "folder_open"));
setAttribute(folderNode,"isOpen",(isOpen=="true" ? "false" : "true"));
} function getAttribute(pNode,pAttributeName)
{
var attributes = pNode.attributes; var attNode = attributes.getNamedItem(pAttributeName); return attNode != null ? attNode.nodeValue: null;
}
function setAttribute(pNode,pAttributeName,pValue)
{
var attributes = pNode.attributes; var attNode = attributes.getNamedItem(pAttributeName); if(attNode != null)
attNode.value = pValue;
} //-->
</script>
<style type="text/css" media="all">
.folder_node_visible
{
margin-top:3px;
margin-left:20px;
display:block;
font-size:12px;
}
.doc_node_visible
{
margin-top:3px;
margin-left:20px;
padding:2px 2px 2px 20px;
/*background:url("/image/doc.gif") no-repeat;*/
cursor:pointer;
display:block;
font-size:12px;
}
.folder_node_hidden
{
margin-left:20px;
display:none;
font-size:12px;
}
.doc_node_hidden
{
margin-left:20px;
padding:2px 2px 2px 20px;
/*background:url("/image/doc.gif") no-repeat;*/
cursor:pointer;
display:none;
font-size:12px;
}
.folder_closed
{
padding:2px 2px 2px 20px;
/*background:url("/image/closed.gif") no-repeat;*/
cursor:pointer;
display:block;
font-size:12px;
}
.folder_open
{
padding:2px 2px 2px 20px;
/*background:url("/image/open.gif") no-repeat;*/
cursor:pointer;
display:block;
font-size:12px;
}
</style>
</HEAD> <BODY>
<div id="treeView" name="treeView"></div>
<script language="javascript">
favoriteGen.Tree = document.getElementById("treeView");
favoriteGen.importXML();
</script>
</BODY>
</HTML> ======================================================================================= (2) tree.xml <?xml version="1.0" encoding="utf-8" ?>
<tree>
<folder title="포탈">
<doc url="http://www.daum.net" title="다음"/>
<doc url="http://www.naver.com" title="네이버"/>
<doc url="http://yahoo.co.kr" title="야후"/>
<doc url="http://empas.com" title="엠파스"/>
<folder title="검색">
<doc url="http://www.google.co.kr" title="구글"/>
</folder>
</folder>
<doc url="http://mar.gar.in" title="마가린"/>
<doc url="http://blog.mar.gar.in" title="마가린 블로그"/>
<doc url="http://sodumarvin.tistory.com" title="소두마빈 블로그"/>
</tree>[출처] xml & javascript로 트리 메뉴 만들기|작성자 없음
by Anna 안나 2008. 10. 24. 20:24
| 1 |