<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NARADESIGN:BLOG &#187; 자바스크립트</title>
	<atom:link href="http://naradesign.net/wp/category/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://naradesign.net/wp</link>
	<description>웹표준, 웹접근성, 유니버설디자인, HTML, CSS, UI, UX, UD</description>
	<lastBuildDate>Thu, 10 May 2012 15:12:58 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>iPhone에서 HTML(CSS, JS) 소스 보기.</title>
		<link>http://naradesign.net/wp/2012/02/22/1754/</link>
		<comments>http://naradesign.net/wp/2012/02/22/1754/#comments</comments>
		<pubDate>Tue, 21 Feb 2012 15:37:17 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[생활의 발견]]></category>
		<category><![CDATA[웹 표준]]></category>
		<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[view-source]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/?p=1754</guid>
		<description><![CDATA[가끔은 아이폰에서 블로깅도 하고 싶고 웹 페이지 소스 코드를 보고 싶을 때가 있습니다. 제가 오늘 그 둘을 모두 해보려고 해요. 몇 글자 쓰지도 않았는데 벌써 손가락에 쥐가 나네요. 아래 코드를 아이폰 사파리에 북마크 해보세요. javascript:location=&#39;http://shauninman.com/vs/?url=&#39;+escape(location) 북마클릿은 원래 책갈피 등록이 되지 않기 때문에 아무 주소나 먼저 즐겨찾기에 추가한 다음 등록된 URL을 이 북마클릿 코드로 교체하면 됩니다. [...]]]></description>
			<content:encoded><![CDATA[<p>가끔은 아이폰에서 블로깅도 하고 싶고 웹 페이지 소스 코드를 보고 싶을 때가 있습니다. 제가 오늘 그 둘을 모두 해보려고 해요. 몇 글자 쓰지도 않았는데 벌써 손가락에 쥐가 나네요. 아래 코드를 아이폰 사파리에 북마크 해보세요.</p>
<blockquote>
<p>javascript:location=&#39;http://shauninman.com/vs/?url=&#39;+escape(location)</p>
</blockquote>
<p>북마클릿은 원래 책갈피 등록이 되지 않기 때문에 아무 주소나 먼저 즐겨찾기에 추가한 다음 등록된 URL을 이 북마클릿 코드로 교체하면 됩니다. 그 다음 소스 보기를 원하는 페이지에서 이 북마클릿을 실행합니다.</p>
<p>스크린샷은 데스크탑에서 넣어야겠네요. 이런 짓을 왜 하냐고 물으신다면 다른 사람의 소스 코드가 미치도록 궁금해서 애달아 그럽니다.</p>
<p><strong>단계1</strong>: 북마클릿을 아이폰 사파리 책갈피에 추가</p>
<p><img alt="" height="480" src="http://naradesign.net/wp/wp-content/uploads/iPhoneViewSource1.png" width="320" /></p>
<p><strong>단계2</strong>: 소소 보기를 원하는 페이지에 접속</p>
<p><img alt="" height="480" src="http://naradesign.net/wp/wp-content/uploads/iPhoneViewSource2.png" width="320" /></p>
<p><strong>단계3</strong>: 책갈피에서 북마클릿 실행</p>
<p><img alt="" height="480" src="http://naradesign.net/wp/wp-content/uploads/iPhoneViewSource3.png" width="320" /></p>
<p><strong>단계4</strong>: HTML 소스를 볼 수 있다</p>
<p><img alt="" height="480" src="http://naradesign.net/wp/wp-content/uploads/iPhoneViewSource4.png" width="320" /></p>
<p><strong>단계5</strong>: CSS 소스를 볼 수 있다</p>
<p><img alt="" height="480" src="http://naradesign.net/wp/wp-content/uploads/iPhoneViewSource5.png" width="320" /></p>
<p>참고: <a href="http://goo.gl/LyRxH">http://goo.gl/LyRxH</a></p>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2012/02/22/1754/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>jQuery 입문: form 데이터 유효성 검사.</title>
		<link>http://naradesign.net/wp/2011/07/20/1663/</link>
		<comments>http://naradesign.net/wp/2011/07/20/1663/#comments</comments>
		<pubDate>Wed, 20 Jul 2011 01:32:20 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[Form Validation]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Regular Expression]]></category>
		<category><![CDATA[정규 표현식]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/?p=1663</guid>
		<description><![CDATA[사용자가 form 안에서 올바른 값을 입력했는지 여부(데이터 유효성)는 기본적으로 서버측 스크립트로 확인해야 합니다. 사용자가 입력한 form을 서버로 전송하면 서버측 스크립트는 사용자 값을 받아서 맞는지 틀린지 확인하고 틀린 경우 다시 입력 페이지를 내놓습니다. 이 과정의 문제는 서버측 스크립트로부터 데이터 유효성 검사를 받으려면 네트웍 환경이 좋지 못한 환경에서 너무 오랜 시간을 기다려야한다는 점입니다. 사실 네트웍 환경이 좋아도 [...]]]></description>
			<content:encoded><![CDATA[<p>사용자가 form 안에서 올바른 값을 입력했는지 여부(데이터 유효성)는 기본적으로 서버측 스크립트로 확인해야 합니다. 사용자가 입력한 form을 서버로 전송하면 서버측 스크립트는 사용자 값을 받아서 맞는지 틀린지 확인하고 틀린 경우 다시 입력 페이지를 내놓습니다. 이 과정의 문제는 서버측 스크립트로부터 데이터 유효성 검사를 받으려면 네트웍 환경이 좋지 못한 환경에서 너무 오랜 시간을 기다려야한다는 점입니다. 사실 네트웍 환경이 좋아도 같은 페이지를 자꾸 갱신하는 것은 짜증스러운 일이죠. form이 포함된 페이지를 아무런 실수 없이 한번에 유효하게 작성해서 전송 OK! 하는 사람들이 얼마나 많을까요?</p>
<p>그래서 웹 개발자는 언제부터인가 이런 불편을 개선할 목적으로 데이터 유효성 확인과 같은 핵심 기능을 자바스크립트에 의존하기 시작했습니다. 데이터 유효성 검사를 자바스크립트로 처리하면 서버에 한번 다녀오지 않아도 데이터 유효성 확인이 가능하기 때문에 잘못된 데이터를 페이지 갱신 없이 즉석에서 정정할 수 있습니다. 자바스크립트에 의존한 것은 창의적으로 UX를 개선한 일로써 전혀 문제가 되지 않는데요. 문제는 자바스크립트에만 의존하는 것입니다. 개발자가 작성한 자바스크립트 가운데 전부 또는 일부를 해석하지 못하는 브라우저는 현재도 존재하고 앞으로도 존재할지 모릅니다. 대중적인 브라우저만 지원하면 그만이라는 생각은 학생증이 있는 청소년에게만 책을 빌려주는 도서관 운영 방침과 같은 겁니다.</p>
<p>자바스크립트를 지원하는 환경에서는 자바스크립트에 의존하여 사용성(만족, 효율)을 높이고, 자바스크립트를 지원하지 않는 환경에서는 HTML, CSS, 서버측 스크립트에 의존하도록 양쪽 방향을 모두 고려하여 설계함으로써 상호 운용성(JS 지원 여무에 무관한 운용성)을 확보할 수 있습니다. 이런 설계 기법을 겸손한 자바스크립트(Unobtrusive Javasript)라고 합니다. <a href="http://miya.pe.kr/2007/11/25/%EA%B2%B8%EC%86%90%ED%95%9C-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%9D%98-%EA%B8%B0%EB%B3%B8/">겸손한 자바스크립트 관련글 하나</a>, <a href="http://hyeonseok.com/docs/accessible-javascript/">겸손한 자바스크립트 관련글 둘</a>. 이런 개념을 탑재하고 나서 자바스크립트 실력을 향상시켜도 늦지 않습니다.</p>
<p>오늘의 주제는 jQuery를 이용한 데이터 유효성 검사 입니다. 서버측 유효성 검사 방법은 다루지 않겠지만 서버측 스크립트에 의한 데이터 유효성 검사 또한 진행할 것이라는 전제 아래 자바스크립트로 데이터 유효성 검사 기능을 구현해 봤습니다.</p>
<h2>데이터 유효성 검사 예제 미리보기&nbsp;</h2>
<form action="" class="form">
<p>(*) 항목은 반드시 입력해 주세요.</p>
<ul>
<li><label for="uid">ID(*):</label><br />
<input id="uid" /> 영문, 숫자, 언더스코어(_), 하이픈(-)이 포함 3~16 문자.</li>
<li><label for="upw">PW(*):</label><br />
<input id="upw" type="password" /> 영문, 숫자, 언더스코어(_), 하이픈(-) 포함 6~18 문자.</li>
<li><label for="mail">Email(*):</label><br />
<input id="mail" value="@" /></li>
<li><label for="url">Web(*):</label><br />
<input id="url" value="http://" /></li>
<li><label for="tel">Tel(*):</label><br />
<input id="tel" /> 하이픈(-)은 입력하지 마세요.</li>
</ul>
<input type="submit" value="전송" /></form>
<div><script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script><script type="text/javascript">
// <![CDATA[
jQuery( function($) { // HTML 문서를 모두 읽으면 포함한 코드를 실행
	// 정규식을 변수에 할당
	// 정규식을 직접 작성할 줄 알면 참 좋겠지만
	// 변수 우측에 할당된 정규식은 검색하면 쉽게 찾을 수 있다 
	// 이 변수들의 활약상을 기대한다
	// 변수 이름을 're_'로 정한것은 'Reguar Expression'의 머릿글자
	var re_id = /^[a-z0-9_-]{3,16}$/; // 아이디 검사식
	var re_pw = /^[a-z0-9_-]{6,18}$/; // 비밀번호 검사식
	var re_mail = /^([\w\.-]+)@([a-z\d\.-]+)\.([a-z\.]{2,6})$/; // 이메일 검사식
	var re_url = /^(https?:\/\/)?([a-z\d\.-]+)\.([a-z\.]{2,6})([\/\w\.-]*)*\/?$/; // URL 검사식
	var re_tel = /^[0-9]{8,11}$/; // 전화번호 검사식
	// 선택할 요소를 변수에 할당
	// 변수에 할당하지 않으면 매번 HTML 요소를 선택해야 하기 때문에 귀찮고 성능에도 좋지 않다
	// 쉼표를 이용해서 여러 변수를 한 번에 선언할 수 있다
	// 보기 좋으라고 쉼표 단위로 줄을 바꿨다 
	var 
		form = $('.form'), 
		uid = $('#uid'), 
		upw = $('#upw'), 
		mail = $('#mail'), 
		url = $('#url'), 
		tel = $('#tel');
	// 선택한 form에 서밋 이벤트가 발생하면 실행한다
	// if (사용자 입력 값이 정규식 검사에 의해 참이 아니면) {포함한 코드를 실행}
	// if 조건절 안의 '정규식.test(검사할값)' 형식은 true 또는 false를 반환한다
	// if 조건절 안의 검사 결과가 '!= true' 참이 아니면 {...} 실행
	// 사용자 입력 값이 참이 아니면 alert을 띄운다
	// 사용자 입력 값이 참이 아니면 오류가 발생한 input으로 포커스를 보낸다
	// 사용자 입력 값이 참이 아니면 form 서밋을 중단한다
	form.submit( function() {
		if (re_id.test(uid.val()) != true) { // 아이디 검사
			alert('[ID 입력 오류] 유효한 ID를 입력해 주세요.');
			uid.focus();
			return false;
		} else if(re_pw.test(upw.val()) != true) { // 비밀번호 검사
			alert('[PW 입력 오류] 유효한 PW를 입력해 주세요.');
			upw.focus();
			return false;
		} else if(re_mail.test(mail.val()) != true) { // 이메일 검사
			alert('[Email 입력 오류] 유효한 이메일 주소를 입력해 주세요.');
			mail.focus();
			return false;
		} else if(re_url.test(url.val()) != true) { // URL 검사
			alert('[Web 입력 오류] 유효한 웹 사이트 주소를 입력해 주세요.');
			url.focus();
			return false;
		} else if(re_tel.test(tel.val()) != true) { // 전화번호 검사
			alert('[Tel 입력 오류] 유효한 전화번호를 입력해 주세요.');
			tel.focus();
			return false;
		}
	});
	// #uid, #upw 인풋에 입력된 값의 길이가 적당한지 알려주려고 한다
	// #uid, #upw 다음 순서에 경고 텍스트 출력을 위한 빈 strong 요소를 추가한다
	// 무턱대고 자바스크립트를 이용해서 HTML 삽입하는 것은 좋지 않은 버릇
	// 그러나 이 경우는 strong 요소가 없어도 누구나 form 핵심 기능을 이용할 수 있으니까 문제 없다
	$('#uid, #upw').after('<strong></strong>');
	// #uid 인풋에서 onkeyup 이벤트가 발생하면
	uid.keyup( function() {
		var s = $(this).next('strong'); // strong 요소를 변수에 할당
		if (uid.val().length == 0) { // 입력 값이 없을 때
			s.text(''); // strong 요소에 포함된 문자 지움
		} else if (uid.val().length < 3) { // 입력 값이 3보다 작을 때
			s.text('너무 짧아요.'); // strong 요소에 문자 출력
		} else if (uid.val().length > 16) { // 입력 값이 16보다 클 때
			s.text('너무 길어요.'); // strong 요소에 문자 출력
		} else { // 입력 값이 3 이상 16 이하일 때
			s.text('적당해요.'); // strong 요소에 문자 출력
		}
	});
	// #upw 인풋에서 onkeyup 이벤트가 발생하면
	upw.keyup( function() {
		var s = $(this).next('strong'); // strong 요소를 변수에 할당
		if (upw.val().length == 0) { // 입력 값이 없을 때
			s.text(''); // strong 요소에 포함된 문자 지움
		} else if (upw.val().length < 6) { // 입력 값이 6보다 작을 때
			s.text('너무 짧아요.'); // strong 요소에 문자 출력
		} else if (upw.val().length > 18) { // 입력 값이 18보다 클 때
			s.text('너무 길어요.'); // strong 요소에 문자 출력
		} else { // 입력 값이 6 이상 18 이하일 때
			s.text('적당해요.'); // strong 요소에 문자 출력
		}
	});
	// #tel 인풋에 onkeydown 이벤트가 발생하면
	// 하이픈(-) 키가 눌렸는지 확인
	// 하이픈(-) 키가 눌렸다면 입력 중단
	tel.keydown( function() {
		if(event.keyCode==109 || event.keyCode==189) {
			return false;
		}
	});
});
// ]]&gt;
</script></div>
<h2>데이터 유효성 검사 예제 코드</h2>
<blockquote><pre>&lt;form action=&quot;&quot; class=&quot;form&quot;&gt;
	&lt;p&gt;(*) 항목은 반드시 입력해 주세요.&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;
			&lt;label for=&quot;uid&quot;&gt;ID(*):&lt;/label&gt;
			&lt;input id=&quot;uid&quot; /&gt;
			영문, 숫자, 언더스코어(_), 하이픈(-)이 포함된 3~16 문자.
		&lt;/li&gt;
		&lt;li&gt;
			&lt;label for=&quot;upw&quot;&gt;PW(*):&lt;/label&gt;
			&lt;input id=&quot;upw&quot; type=&quot;password&quot; /&gt;
			영문, 숫자, 언더스코어(_), 하이픈(-)이 포함된 6~18 문자.
		&lt;/li&gt;
		&lt;li&gt;
			&lt;label for=&quot;mail&quot;&gt;Email(*):&lt;/label&gt;
			&lt;input id=&quot;mail&quot; value=&quot;@&quot; /&gt;
		&lt;/li&gt;
		&lt;li&gt;
			&lt;label for=&quot;url&quot;&gt;Web(*):&lt;/label&gt;
			&lt;input id=&quot;url&quot; value=&quot;http://&quot; /&gt;
		&lt;/li&gt;
		&lt;li&gt;
			&lt;label for=&quot;tel&quot;&gt;Tel(*):&lt;/label&gt;
			&lt;input id=&quot;tel&quot; /&gt;
			하이픈(-)은 입력하지 마세요.
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;input type=&quot;submit&quot; value=&quot;전송&quot; /&gt;
&lt;/form&gt;

&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot;&gt;
// &lt;![CDATA[
jQuery( function($) { // HTML 문서를 모두 읽으면 포함한 코드를 실행

	// 정규식을 변수에 할당
	// 정규식을 직접 작성할 줄 알면 참 좋겠지만
	// 변수 우측에 할당된 정규식은 검색하면 쉽게 찾을 수 있다
	// 이 변수들의 활약상을 기대한다
	// 변수 이름을 &#39;re_&#39;로 정한것은 &#39;Reguar Expression&#39;의 머릿글자
	var re_id = /^[a-z0-9_-]{3,16}$/; // 아이디 검사식
	var re_pw = /^[a-z0-9_-]{6,18}$/; // 비밀번호 검사식
	var re_mail = /^([\w\.-]+)@([a-z\d\.-]+)\.([a-z\.]{2,6})$/; // 이메일 검사식
	var re_url = /^(https?:\/\/)?([a-z\d\.-]+)\.([a-z\.]{2,6})([\/\w\.-]*)*\/?$/; // URL 검사식
	var re_tel = /^[0-9]{8,11}$/; // 전화번호 검사식

	// 선택할 요소를 변수에 할당
	// 변수에 할당하지 않으면 매번 HTML 요소를 선택해야 하기 때문에 귀찮고 성능에도 좋지 않다
	// 쉼표를 이용해서 여러 변수를 한 번에 선언할 수 있다
	// 보기 좋으라고 쉼표 단위로 줄을 바꿨다
	var
		form = $(&#39;.form&#39;),
		uid = $(&#39;#uid&#39;),
		upw = $(&#39;#upw&#39;),
		mail = $(&#39;#mail&#39;),
		url = $(&#39;#url&#39;),
		tel = $(&#39;#tel&#39;);

	// 선택한 form에 서밋 이벤트가 발생하면 실행한다
	// if (사용자 입력 값이 정규식 검사에 의해 참이 아니면) {포함한 코드를 실행}
	// if 조건절 안의 &#39;정규식.test(검사할값)&#39; 형식은 true 또는 false를 반환한다
	// if 조건절 안의 검사 결과가 &#39;!= true&#39; 참이 아니면 {...} 실행
	// 사용자 입력 값이 참이 아니면 alert을 띄운다
	// 사용자 입력 값이 참이 아니면 오류가 발생한 input으로 포커스를 보낸다
	// 사용자 입력 값이 참이 아니면 form 서밋을 중단한다
	form.submit( function() {
		if (re_id.test(uid.val()) != true) { // 아이디 검사
			alert(&#39;[ID 입력 오류] 유효한 ID를 입력해 주세요.&#39;);
			uid.focus();
			return false;
		} else if(re_pw.test(upw.val()) != true) { // 비밀번호 검사
			alert(&#39;[PW 입력 오류] 유효한 PW를 입력해 주세요.&#39;);
			upw.focus();
			return false;
		} else if(re_mail.test(mail.val()) != true) { // 이메일 검사
			alert(&#39;[Email 입력 오류] 유효한 이메일 주소를 입력해 주세요.&#39;);
			mail.focus();
			return false;
		} else if(re_url.test(url.val()) != true) { // URL 검사
			alert(&#39;[Web 입력 오류] 유효한 웹 사이트 주소를 입력해 주세요.&#39;);
			url.focus();
			return false;
		} else if(re_tel.test(tel.val()) != true) { // 전화번호 검사
			alert(&#39;[Tel 입력 오류] 유효한 전화번호를 입력해 주세요.&#39;);
			tel.focus();
			return false;
		}
	});

	// #uid, #upw 인풋에 입력된 값의 길이가 적당한지 알려주려고 한다
	// #uid, #upw 다음 순서에 경고 텍스트 출력을 위한 빈 strong 요소를 추가한다
	// 무턱대고 자바스크립트를 이용해서 HTML 삽입하는 것은 좋지 않은 버릇
	// 그러나 이 경우는 strong 요소가 없어도 누구나 form 핵심 기능을 이용할 수 있으니까 문제 없다
	$(&#39;#uid, #upw&#39;).after(&#39;&lt;strong&gt;&lt;/strong&gt;&#39;);

	// #uid 인풋에서 onkeyup 이벤트가 발생하면
	uid.keyup( function() {
		var s = $(this).next(&#39;strong&#39;); // strong 요소를 변수에 할당
		if (uid.val().length == 0) { // 입력 값이 없을 때
			s.text(&#39;&#39;); // strong 요소에 포함된 문자 지움
		} else if (uid.val().length &lt; 3) { // 입력 값이 3보다 작을 때
			s.text(&#39;너무 짧아요.&#39;); // strong 요소에 문자 출력
		} else if (uid.val().length &gt; 16) { // 입력 값이 16보다 클 때
			s.text(&#39;너무 길어요.&#39;); // strong 요소에 문자 출력
		} else { // 입력 값이 3 이상 16 이하일 때
			s.text(&#39;적당해요.&#39;); // strong 요소에 문자 출력
		}
	});

	// #upw 인풋에서 onkeyup 이벤트가 발생하면
	upw.keyup( function() {
		var s = $(this).next(&#39;strong&#39;); // strong 요소를 변수에 할당
		if (upw.val().length == 0) { // 입력 값이 없을 때
			s.text(&#39;&#39;); // strong 요소에 포함된 문자 지움
		} else if (upw.val().length &lt; 6) { // 입력 값이 6보다 작을 때
			s.text(&#39;너무 짧아요.&#39;); // strong 요소에 문자 출력
		} else if (upw.val().length &gt; 18) { // 입력 값이 18보다 클 때
			s.text(&#39;너무 길어요.&#39;); // strong 요소에 문자 출력
		} else { // 입력 값이 6 이상 18 이하일 때
			s.text(&#39;적당해요.&#39;); // strong 요소에 문자 출력
		}
	});

	// #tel 인풋에 onkeydown 이벤트가 발생하면
	// 하이픈(-) 키가 눌렸는지 확인
	// 하이픈(-) 키가 눌렸다면 입력 중단
	tel.keydown( function() {
		if(event.keyCode==109 || event.keyCode==189) {
			return false;
		}
	});
});
// ]]&gt;
&lt;/script&gt;
</pre>
</blockquote>
<h2>jQuery 코드 해설</h2>
<ul>
<li>변수 할당은 &#39;var 변수이름 = 할당 값&#39; &nbsp;형식으로 작성한다. re_* 라는 변수에 다양한 정규식을 할당했다. 정규식 표현은 사용자 입력 값이 유효한지 검사해 줄 것이다.</li>
<li>정규 표현식을 어떤 값과 비교하면 true 또는 false 값을 얻을 수 있다. true라면 form을 서밋하고 false라면 form 서밋을 중단한다. 정규 표현식으로 데이터 유효성을 확인하려면 &#39;정규식.test(어떤값)&#39; 형식으로 작성한다.&nbsp;</li>
<li>.val() 메소드는 선택한 input 또는 select 요소의 value 값을 구한다. uid.val()은 $(&#39;#uid&#39;).val()과 같다. 이렇게 val() 괄호 안쪽이 비어있으면 값을 구해온다. 만약&nbsp;val()&nbsp;괄호 안쪽에 명시적으로 어떤 값이 있으면 값을 구해오는 것이 아니라 값을 넣는다. 여기서 val() 값은 사용자가 #uid 인풋에 입력한 값이다.</li>
<li>if(좌변의 정규식과 != 우변의 사용자 입력 값이 같지 않으면) 사용자가 입력한 값은 오류이다. 이 조건문은 사용자 입력 값이 올바르지 않은 경우 {실행문}을 실행한다. 조건문 안에서는 ==(같음), !=(같지않음), !(아님), &gt;(보다큰), &lt;(보다작은), &gt;=(같거나 큰), &lt;=(같거나 작은) 이런 등호가 자주 쓰인다. 등호는 어떤 값을 true, false와 같은 참 거짓 또는 숫자와 자주 비교한다.&nbsp;</li>
<li>.after() 메소드는 선택한 요소의 다음(형제 노드) 순서에 문자열이나 HTML 요소를 넣는다. 이 예제는&nbsp;$(&#39;#uid, #upw&#39;).after(&#39;&lt;strong&gt;&lt;/strong&gt;&#39;) 두 요소를 선택하고 두 요소의 다음에 strong 요소를 넣었다. 반대 개념의 메소드 .before()는 선택한 요소의 이전 형제노드에 문자열을 넣는다.&nbsp;</li>
<li>.length 메소드는 선택한 HTML 요소의 개수 또는 val() 값의 문자 개수를 구해온다. 이 경우는 선택한 HTML 요소의 개수를 구한 것이 아니라 val() 값의 문자 개수를 구했다.</li>
<li>.next() 메소드는 선택한 요소의 바로 다음에 등장하는 형제를 선택한다.&nbsp;$(this).next(&#39;strong&#39;) 예제는 선택된 본인의 다음에 등장하는 strong 요소를 선택한다. 반대 개념의 메소드 .prev()는 이전 형제 요소를 선택한다.&nbsp;</li>
<li>.text() 메소드는 .val() 메소드와 사용법이 유사하다. HTML 요소 내부에 포함된 문자열을 구하거나 셋팅한다. 값이 비어있으면 값을 구해오지만 값이 설정되어 있으면 값을 셋팅한다. 이 코드는 값을 셋팅하는 예제만 포함하고 있다.</li>
<li>event.keyCode는 사용자가 누른 키의 값을 구한다. 키 값은 숫자를 반환하는데. 109, 189는 하이픈(-)의 키 값이다. 즉 하이픈(-) 키가 눌리면 keydown 동작을 취소함으로써 하이픈(-) 입력을 제한한다.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2011/07/20/1663/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>jQuery 입문: 네비게이션 만들기.</title>
		<link>http://naradesign.net/wp/2011/07/02/1634/</link>
		<comments>http://naradesign.net/wp/2011/07/02/1634/#comments</comments>
		<pubDate>Fri, 01 Jul 2011 18:48:25 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Navigation]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/?p=1634</guid>
		<description><![CDATA[오늘은 jQuery를 이용해서 네비게이션(div&#62;ul&#62;li&#62;ul&#62;li) 만들기를 해볼까 합니다. 수직 형태의 네비게이션과 수평 형태의 네비게이션 동작이 약간 달라서 예제를 두 개 준비 했습니다. 예제의 마크업은 같지만 수직, 수평 네비게이션을 구분하기 위해 클래스 이름을 다르게 지정하고 각각 다른 동작을 입혔습니다. CSS를 사용해서 수직 수평 모양을 지정할 수 있지만 적용하지 않았습니다. 수직 네비게이션 만들기 수직 네비게이션의 요구 조건은 다음과 [...]]]></description>
			<content:encoded><![CDATA[<p>오늘은 jQuery를 이용해서 네비게이션(div&gt;ul&gt;li&gt;ul&gt;li) 만들기를 해볼까 합니다. 수직 형태의 네비게이션과 수평 형태의 네비게이션 동작이 약간 달라서 예제를 두 개 준비 했습니다. 예제의 마크업은 같지만 수직, 수평 네비게이션을 구분하기 위해 클래스 이름을 다르게 지정하고 각각 다른 동작을 입혔습니다. CSS를 사용해서 수직 수평 모양을 지정할 수 있지만 적용하지 않았습니다.</p>
<h2>수직 네비게이션 만들기</h2>
<p>수직 네비게이션의 요구 조건은 다음과 같습니다.</p>
<ul>
<li>큰 메뉴를 클릭하면&nbsp;
<ul>
<li>열려있는 서브 메뉴가 모두 닫히고</li>
<li>클릭한 메뉴의 하위 메뉴가 열리며</li>
<li>클릭한 메뉴의 글꼴이 굵어진다&nbsp;</li>
</ul>
</li>
<li>포커스가 맺히면 클릭한 것처럼 동작한다</li>
</ul>
<h3>수직 네비게이션 예제</h3>
<p><script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<div class="gnbVr">
<ul>
<li><a href="#">#1</a>
<ul>
<li><a href="#">#1-1</a></li>
<li><a href="#">#1-2</a></li>
</ul>
</li>
<li><a href="#">#2</a>
<ul>
<li><a href="#">#2-1</a></li>
<li><a href="#">#2-2</a></li>
</ul>
</li>
<li><a href="#">#3</a>
<ul>
<li><a href="#">#3-1</a></li>
<li><a href="#">#3-2</a></li>
</ul>
</li>
</ul>
</div>
<p><script type="text/javascript">
$(function(){
	var gnbVr = $('.gnbVr');
	gnbVr.find('>ul>li>ul').hide();
	gnbVr.find('>ul>li>a[href=#]')
		.click(function(){
			gnbVr
				.find('>ul>li>ul:visible')
				.slideUp(200).parent('li')
				.removeClass('active')
				.find('>a')
				.css('fontWeight','');
			$(this)
				.next('ul:hidden')
				.slideDown(200)
				.parent('li')
				.addClass('active')
				.find('>a')
				.css('fontWeight','bold');
			return false;
		})
		.focus(function(){
			$(this).click();
		});
});
</script><br />
<h3>수직 네비게이션 HTML</h3>
<blockquote><pre>&lt;div class=&quot;<strong>gnbVr</strong>&quot;&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#1&lt;/a&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#1-1&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#1-2&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#2&lt;/a&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#2-1&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#2-2&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#3&lt;/a&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#3-1&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#3-2&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
&lt;/div&gt;
</pre>
</blockquote>
<h3>수직 네비게이션 JS</h3>
<blockquote><pre>&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	var gnbVr = $(&#39;.gnbVr&#39;);
	gnbVr.find(&#39;&gt;ul&gt;li&gt;ul&#39;).hide();
	gnbVr.find(&#39;&gt;ul&gt;li&gt;a[href=#]&#39;)
		.click(function(){
			gnbVr
				.find(&#39;&gt;ul&gt;li&gt;ul:visible&#39;)
				.slideUp(200)
				.parent(&#39;li&#39;)
				.removeClass(&#39;active&#39;)
				.find(&#39;&gt;a&#39;)
				.css(&#39;fontWeight&#39;,&#39;&#39;);
			$(this)
				.next(&#39;ul:hidden&#39;)
				.slideDown(200)
				.parent(&#39;li&#39;)
				.addClass(&#39;active&#39;)
				.find(&#39;&gt;a&#39;)
				.css(&#39;fontWeight&#39;,&#39;bold&#39;);
			return false;
		})
		.focus(function(){
			$(this).click();
		});
});
&lt;/script&gt;
</pre>
</blockquote>
<h2>수평 네비게이션 만들기</h2>
<p>수평 네비게이션의 요구 조건은 다음과 같습니다.</p>
<ul>
<li>큰 메뉴를 마우스 오버 하면&nbsp;
<ul>
<li>열려있는 서브 메뉴가 모두 닫히고</li>
<li>마우스 오버 메뉴의 하위 메뉴가 열리며</li>
<li>마우스 오버 메뉴의 글꼴이 굵어진다</li>
</ul>
</li>
<li>포커스가 맺히면 마우스 오버한 것처럼 동작한다</li>
<li>메뉴 영역에서 마우스가 떠나면
<ul>
<li>서브 메뉴가 모두 닫히고</li>
<li>굵은 글꼴을 제거한다</li>
</ul>
</li>
</ul>
<h3>수평 네비게이션 예제</h3>
<div class="gnbHr">
<ul>
<li><a href="#">#1</a>
<ul>
<li><a href="#">#1-1</a></li>
<li><a href="#">#1-2</a></li>
</ul>
</li>
<li><a href="#">#2</a>
<ul>
<li><a href="#">#2-1</a></li>
<li><a href="#">#2-2</a></li>
</ul>
</li>
<li><a href="#">#3</a>
<ul>
<li><a href="#">#3-1</a></li>
<li><a href="#">#3-2</a></li>
</ul>
</li>
</ul>
</div>
<p><script type="text/javascript">
$(function(){
	var gnbHr = $('.gnbHr');
	gnbHr.find('>ul>li>ul').hide();
	gnbHr.find('>ul>li>a')
		.mouseover(function(){
			gnbHr
				.find('>ul>li>ul:visible')
				.slideUp(200)
				.parent('li')
				.removeClass('active')
				.find('>a')
				.css('fontWeight','');
			$(this)
				.next('ul:hidden')
				.slideDown(200)
				.parent('li')
				.addClass('active')
				.find('>a')
				.css('fontWeight','bold');
		})
		.focus(function(){
			$(this).mouseover();
		})
		.end()
		.mouseleave(function(){
			gnbHr
				.find('>ul>li>ul')
				.slideUp(200)
				.prev('a')
				.css('fontWeight','');
		});
});
</script><br />
<h3>수평 네비게이션 HTML</h3>
<blockquote><pre>&lt;div class=&quot;<strong>gnbHr</strong>&quot;&gt;
	&lt;ul&gt;
		&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#1&lt;/a&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#1-1&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#1-2&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#2&lt;/a&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#2-1&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#2-2&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
		&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#3&lt;/a&gt;
			&lt;ul&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#3-1&lt;/a&gt;&lt;/li&gt;
				&lt;li&gt;&lt;a href=&quot;#&quot;&gt;#3-2&lt;/a&gt;&lt;/li&gt;
			&lt;/ul&gt;
		&lt;/li&gt;
	&lt;/ul&gt;
&lt;/div&gt;
</pre>
</blockquote>
<h3>수평 네비게이션 JS</h3>
<blockquote><pre>&lt;script type=&quot;text/javascript&quot;&gt;
$(function(){
	var gnbHr = $(&#39;.gnbHr&#39;);
	gnbHr.find(&#39;&gt;ul&gt;li&gt;ul&#39;).hide();
	gnbHr.find(&#39;&gt;ul&gt;li&gt;a&#39;)
		.mouseover(function(){
			gnbHr
				.find(&#39;&gt;ul&gt;li&gt;ul:visible&#39;)
				.slideUp(200)
				.parent(&#39;li&#39;)
				.removeClass(&#39;active&#39;)
				.find(&#39;&gt;a&#39;)
				.css(&#39;fontWeight&#39;,&#39;&#39;);
			$(this)
				.next(&#39;ul:hidden&#39;)
				.slideDown(200)
				.parent(&#39;li&#39;)
				.addClass(&#39;active&#39;)
				.find(&#39;&gt;a&#39;)
				.css(&#39;fontWeight&#39;,&#39;bold&#39;);
		})
		.focus(function(){
			$(this).mouseover();
		})
		.end()
		.mouseleave(function(){
			gnbHr
				.find(&#39;&gt;ul&gt;li&gt;ul&#39;)
				.slideUp(200)
				.prev(&#39;a&#39;)
				.css(&#39;fontWeight&#39;,&#39;&#39;);
		});
});
&lt;/script&gt;
</pre>
</blockquote>
<p>오늘은 자세한 설명을 생략하겠습니다. 코드가 너무 길죠? 이렇게 메소드 체이닝이 길어지면 메소드 기준으로 줄을 바꿈으로써 코드 가독성을 높일 수 있습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2011/07/02/1634/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>jQuery 입문: 콘텐츠 로테이션 기능 만들기.</title>
		<link>http://naradesign.net/wp/2011/06/30/1593/</link>
		<comments>http://naradesign.net/wp/2011/06/30/1593/#comments</comments>
		<pubDate>Wed, 29 Jun 2011 17:18:32 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Rotation]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/?p=1593</guid>
		<description><![CDATA[저는 지난 포스팅에서 자바스크립트에 익숙하지 않다면서 &#8216;객체, 함수, 변수, 할당&#8217;이라는 용어를 사용했습니다. 솔직히 말해 저 용어들의 정확한 정의를 아직 모릅니다. &#160;&#8217;나중에 언젠가는 이해하게 되겠지&#8217;라는 막연한 기대를 하고 있을 뿐이예요. 기초부터 튼튼히 배우고 싶은 분들은 책을 찾아 보세요.(저도 책을 찾아 볼께요) 하지만 저런 용어들을 몰라도 jQuery를 시작할 수 있다는 이야기를 하고 싶습니다. 일단 흥미가 생겨야 책을 [...]]]></description>
			<content:encoded><![CDATA[<p>저는 지난 포스팅에서 자바스크립트에 익숙하지 않다면서 &#8216;객체, 함수, 변수, 할당&#8217;이라는 용어를 사용했습니다. 솔직히 말해 저 용어들의 정확한 정의를 아직 모릅니다. &nbsp;&#8217;나중에 언젠가는 이해하게 되겠지&#8217;라는 막연한 기대를 하고 있을 뿐이예요. 기초부터 튼튼히 배우고 싶은 분들은 책을 찾아 보세요.(저도 책을 찾아 볼께요) 하지만 저런 용어들을 몰라도 jQuery를 시작할 수 있다는 이야기를 하고 싶습니다. 일단 흥미가 생겨야 책을 볼 욕심도 날테니까요. 저는 HTML/CSS를 처음 배울 때에도 &#8216;요소, 선택자, 속성, 값&#8217;이 무엇을 의미하는지 몰랐습니다. 기초는 나중에 배우기로 하구요. 간단하게 지난 포스팅을 복습해 볼께요.</p>
<ul>
<li><a href="http://jquery.com/">jQuery 최신 버전 라이브러리</a>를 다운받아 서버에 올리거나 또는 <a href="http://code.jquery.com/jquery-latest.min.js">CDN 서버에 있는 최신 버전 jQuery 라이브러리</a>를 직접 링크할 수 있다.</li>
<li>jQuery 라이브러리는 문서 body가 닫히기 직전에 삽입하는 것이 사용자의 체감 성능(속도)을 높이는데 도움이 된다.</li>
<li>웹 브라우저가 jQuery 라이브러리를 모두 해석한 후에 직접 작성한&nbsp;jQuery 코드를 해석할 수 있도록 라이브러리 참조 코드 &lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt; 를 먼저 작성한다.</li>
<li>직접 작성할 jQuery 코드는 웹 브라우저가 HTML을 모두 해석한 이후에 실행하도록 준비 $(&#8216;document&#8217;).ready(function(){ &#8230; }) 또는 $(function(){ &#8230; }) 한다.</li>
<li>달러($) 기호 사용 때문에 다른 라이브러리와 충돌할 우려가 있다면 jQuery.noConflict(); 를 선언해서 충돌을 방지할 수 있다.</li>
<li>코드를 작성하는 보통의 순서는 &#8216;HTML 요소를 선택하고, 이벤트를 설정하고, 동작을 실행하기&#8217; 이다.</li>
<li>$(&#8216;&#8230;&#8217;) 괄호 안에 CSS 선택자를 넣어서 HTML 요소를 선택할 수 있다. HTML 요소, ID, CLASS를 포함할 수 있고 문자열(string)로 해석해야 하기 때문에 따옴표를 빼먹으면 안된다. JS 변수를 넣을 때는 따옴표를 사용하지 않는다.</li>
<li>점(.)을 찍어서 선택한 객체(요소)와 이벤트(클릭 등)를 연결할 수 있다. 이를 메소드 체이닝이라고 하는데 용어 설명은 생락할께요.(궁금하면 책을 ^^)</li>
</ul>
<p>지난 포스팅에서 확실하게 기억하고 넘어가야 할 것은&nbsp;jQuery의 일반적인 코드 작성 순서입니다. 아래와 같은 패턴이 자주 등장하므로 익혀 두는게 좋겠습니다.</p>
<blockquote>
<p>//&nbsp;한 줄로 작성하면&#8230;<br />
$(&#8216;<b>선택한요소에</b>&#8216;).<b>이벤트가발생하면</b>(<b>기능을</b>(){<b>실행한다</b>});</p>
<p>// 코드 가독성을 위해 여러 줄로 작성하면&#8230;<br />
$(&#8216;<b>선택한요소에</b>&#8216;).<b>이벤트가발생하면</b>(<b>기능을</b>(){&nbsp;<br />
&nbsp; &nbsp; <b>실행한다</b><br />
});</p>
<p>// 실제 코드는&#8230;<br />
$(&#8216;<b>button.red</b>&#8216;).<b>click</b>(<b>function</b>(){ // 선택한 요소에 이벤트가 발생하면 기능을<br />
&nbsp; &nbsp;&nbsp;$(&#8216;body&#8217;).css(&#8216;background&#8217;,'red&#8217;); // 실행한다<br />
});<span class="Apple-tab-span" style="white-space:pre">	</span></p>
</blockquote>
<p>오늘 학습 목표는 &#8216;콘텐츠 로테이션&#8217; 기능입니다. 일단 다음과 같은 HTML을 작성해 봅니다.</p>
<blockquote>
<p>&lt;ul&nbsp;class=&quot;<b>rotation</b>&quot;&gt;<br />
&nbsp; &nbsp; &lt;li&gt;#1&lt;/li&gt;<br />
&nbsp; &nbsp; &lt;li&gt;#2&lt;/li&gt;<br />
&nbsp; &nbsp; &lt;li&gt;#3&lt;/li&gt;<br />
&nbsp; &nbsp; &lt;li&gt;#4&lt;/li&gt;<br />
&lt;/ul&gt;<br />
&lt;button type=&quot;button&quot; class=&quot;<b>prev</b>&quot;&gt;PREV&lt;/button&gt;<br />
&lt;button type=&quot;button&quot; class=&quot;<b>next</b>&quot;&gt;NEXT&lt;/button&gt;</p>
</blockquote>
<p>li 항목 4개를 모두 노출하지 않고 첫 번째 li 항목만 화면에 보이도록 설정할 예정입니다. 그리고 PREV/NEXT 가운데 어떤 버튼을 누르는지에 따라서 정방향 또는 역방향의 li 항목을 로테이션 형식으로 표시합니다. 저는 다음과 같은 순서로 코드를 작성할 계획을 세웁니다.</p>
<ol>
<li>첫 번째 li를 제외한 나머지 li를 감춘다.</li>
<li>.prev 버튼을 누르면; 마지막 li 항목의 위치를 첫 번째로 옮기고;&nbsp;모든 li를 감춘 다음&nbsp;첫 번째 li만 표시한다.</li>
<li>.next 버튼을 누르면; 첫 번째 li 항목의 위치를 마지막으로 옮기고;&nbsp;모든 li를 감춘 다음&nbsp;첫 번째 li만 표시한다.</li>
</ol>
<p>얻고자 하는 표현은 다음과 같습니다.</p>
<div style="border:1px solid #ccc; padding:0 2em">
<ul class="rotation">
<li>#1</li>
<li>#2</li>
<li>#3</li>
<li>#4</li>
</ul>
<p><button type="button" class="prev">PREV</button> <button type="button" class="next">NEXT</button></p>
</div>
<p><script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script> <script type="text/javascript">
$(function(){
	$('.rotation>li:gt(0)').hide();
	function onlyFirst(){
		$('.rotation>li').hide().eq(0).show();
	}
	$('.prev').click(function(){
		$('.rotation>li:last').prependTo('.rotation');
		onlyFirst();
	});
	$('.next').click(function(){
		$('.rotation>li:first').appendTo('.rotation');
		onlyFirst();
	});
});
</script></p>
<p>생각을 코드로 옮기면 다음과 같습니다. 코드가 낮설더라도 두려워 할 필요는 없으니 일단 주석 위주로 봐주세요. 코드 해설은 아래에서 추가할께요.</p>
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
$(function(){ // HTML 문서가 완전히 해석되면 포함한 코드를 실행한다.<br />
<span style="white-space:pre">	</span>$(&#8216;.rotation&gt;li:gt(0)&#8217;).hide(); //&nbsp;첫 번째 li를 제외한 나머지 li를 감춘다.<br />
<span style="white-space:pre">	</span>$(&#8216;.prev&#8217;).click(function(){ //&nbsp;.prev 버튼을 누르면<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>$(&#8216;.rotation&gt;li:last&#8217;).prependTo(&#8216;.rotation&#8217;); //&nbsp;마지막 li를 첫 번째로 옮기고<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>$(&#8216;.rotation&gt;li&#8217;).hide().eq(0).show();&nbsp;//&nbsp;모든 li를 감추고 첫 번째 li만 표시한다.<br />
<span style="white-space:pre">	</span>});<br />
<span style="white-space:pre">	</span>$(&#8216;.next&#8217;).click(function(){ //&nbsp;.next 버튼을 누르면<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>$(&#8216;.rotation&gt;li:first&#8217;).appendTo(&#8216;.rotation&#8217;); //&nbsp;첫 번째 li를 마지막으로 옮기고<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>$(&#8216;.rotation&gt;li&#8217;).hide().eq(0).show(); //&nbsp;모든 li를 감추고 첫 번째 li만 표시한다.<br />
<span style="white-space:pre">	</span>});<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>그런데 이 코드에는 반복이 존재합니다.&nbsp;&nbsp;.prev .next 버튼을 눌렀을 때&nbsp;&#8217;모든 li를 감춘 다음 첫 번째 li만 표시한다&#8217;&nbsp;$(&#8216;.rotation&gt;li&#8217;).hide().eq(0).show();&nbsp;부분을 똑같이 반복하죠. 개발자라면 본능적으로 이렇게 반복하는 코드가 나올 때 간결하게 만들어야 합니다. 반복되는 동작을 onlyFirst() 라는 함수에 담겠습니다. onlyFirst() 라는 함수에는 &#8216;모든 li를 감춘 다음 첫 번째 li만 표시한다&#8217; 라는 명령이 포함되어 있고 이 함수를 어디선가 호출하기 전까지는 스스로 실행하지 않습니다. 함수는 한번 만들어 두면 어디서 몇 번이든 호출할 수 있습니다. 그래서 바꾼 코드는 다음과 같습니다.</p>
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;<br />
&lt;script type=&quot;text/javascript&quot;&gt;<br />
$(function(){<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>$(&#8216;.rotation&gt;li:gt(0)&#8217;).hide();<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>function onlyFirst(){ // onlyFirst라는 함수를 선언하고 호출하기 전까지 실행하지 않는다.<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>$(&#8216;.rotation&gt;li&#8217;).hide().eq(0).show(); //&nbsp;모든 li를 감춘 다음 첫 번째 li만 표시한다.<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>}<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>$(&#8216;.prev&#8217;).click(function(){<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>$(&#8216;.rotation&gt;li:last&#8217;).prependTo(&#8216;.rotation&#8217;);<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>onlyFirst(); // onlyFirst 함수를 호출한다.<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>});<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>$(&#8216;.next&#8217;).click(function(){<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>$(&#8216;.rotation&gt;li:first&#8217;).appendTo(&#8216;.rotation&#8217;);<br />
<span class="Apple-tab-span" style="white-space:pre">		</span>onlyFirst();&nbsp;// onlyFirst 함수를 호출한다.<br />
<span class="Apple-tab-span" style="white-space:pre">	</span>});<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>jQuery 초보인 분을 위해 낮설 수도 있는 코드를 해설해 드리겠습니다. HTML이나 CSS에서 다양한 요소, 속성, 값, 선택자 사용법을 기억해 두어야 많은 표현이 가능한데요. jQuery도 똑같습니다. 많은 메소드를 알아두면 표현 능력이 향상되겠죠.</p>
<ul>
<li>$(&#8216;.rotation&gt;li:gt(0)&#8217;).hide();&nbsp;// .rotation 요소의 자식 li를 찾아 숨깁니다. 그런데 조건이 있습니다. 첫 번째 li를 제외한 모든 li를 찾습니다. <a href="http://api.jquery.com/gt-selector/">:gt()</a> 라는 선택자는 CSS에는 존재하지 않는 선택자입니다. jQuery에서 확장한 <b>G</b>reater <b>T</b>han 선택자 입니다. JS에서는 특별한 경우를 제외하고 순서(index)를 0부터 세기 때문에 li:gt(0)은 곧 &#8216;첫 번째 li보다 큰 li를 선택&#8217;하는 것입니다. 결과는 #2, #3, #4 항목을 선택해서 <a href="http://api.jquery.com/hide/">.hide()</a> 숨깁니다. :gt() 선택자는 반대의 개념인 <a href="http://api.jquery.com/lt-selector/">:lt()</a> 선택자도 있습니다. <b>L</b>ess <b>T</b>han 이겠죠.</li>
<li>function onlyFirst() { &#8230; } // 반복하는 기능을 이 함수에 담아두면 필요할 때 호출(재 사용)할 수 있습니다. 모든 li를 숨긴 다음 첫 번째 li만 표시하는 기능을 담으려고 합니다.</li>
<li>$(&#8216;.rotation&gt;li&#8217;).hide().eq(0).show(); //&nbsp;.rotation 요소의 자식 li를 모두 찾아내어 숨깁니다.&nbsp;<a href="http://api.jquery.com/eq/">.eq()</a> 메소드를 이용하여 index가 (0)인 li를 선택해서 <a href="http://api.jquery.com/show/">.show()</a> 보여줍니다. .show() 메소드는 .hide()의 반대 동작입니다.</li>
<li>$(&#8216;.prev&#8217;).click(function(){ &#8230; }); // .prev 요소를 선택하고 선택한 요소에 .click() 이벤트가 발생하면 function(){ &#8230; } 함수를 실행합니다.</li>
<li>$(&#8216;.next&#8217;).click(function(){ &#8230; }); //&nbsp;.next 요소를 선택하고 선택한 요소에 .click() 이벤트가 발생하면 function(){ &#8230; } 함수를 실행합니다.</li>
<li>$(&#8216;.rotation&gt;li:last&#8217;).prependTo(&#8216;.rotation&#8217;); // .rotation 요소의 자식 li 중에서 마지막 li:last를 선택합니다. <a href="http://api.jquery.com/last-selector/">:last</a> 가상 선택자는 CSS에는 존재하지 않는 jQuery에서 확장한 선택자입니다. <a href="http://api.jquery.com/first-selector/">:first</a>는 :last와 반대 개념입니다. <a href="http://api.jquery.com/prependTo/">.prependTo()</a> 메소드는 선택한 마지막 li를 잘라낸 다음 .rotation 요소의 첫 번째 자식 위치로 붙여 넣습니다. 반대의 개념으로 <a href="http://api.jquery.com/appendTo/">.appendTo()</a> 메소드는 선택한 요소를 지정한 요소의 마지막 자식 위치로 옮깁니다.</li>
<li>onlyFirst(); // onlyFirst() 함수를 호출합니다.</li>
</ul>
<p>당장 뭔가 할 수 있다는 것을 보여주면서 jQuery 학습 동기를 유발하면 좋겠다고 생각했습니다. 구미가 좀 당기시는지 모르겠네요.</p>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2011/06/30/1593/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>jQuery 입문: 레이어 토글 기능 만들기.</title>
		<link>http://naradesign.net/wp/2011/06/18/1536/</link>
		<comments>http://naradesign.net/wp/2011/06/18/1536/#comments</comments>
		<pubDate>Fri, 17 Jun 2011 19:41:10 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[자바스크립트]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/?p=1536</guid>
		<description><![CDATA[아직 자바스크립트에 익숙하지 않지만 jQuery 이야기를 해 보려고 합니다. 제가 jQuery를 잘 다루게 된다면 이미 잘 알고 있는 것에 흥미를 잃어버리는 습성 때문에 jQuery 글쓰기를 시도하지 않을것 같아요. 그래서 초심자인 지금이 가장 좋은 타이밍이라고 생각합니다. jQuery를 잘 다루려면 초급 수준의 HTML/CSS 지식이 필요합니다. jQuery는 지구상에서 가장 인기있는 자바스크립트 라이브러리입니다. 2011년 6월 현재 w3techs.com 통계에 따르면 [...]]]></description>
			<content:encoded><![CDATA[<p><!-- jQuery 예제 실행을 위한 --><script src="http://code.jquery.com/jquery-latest.min.js"><!-- /jQuery 예제 실행을 위한 --></script></p>
<p>아직 자바스크립트에 익숙하지 않지만 jQuery 이야기를 해 보려고 합니다. 제가 jQuery를 잘 다루게 된다면 이미 잘 알고 있는 것에 흥미를 잃어버리는 습성 때문에 jQuery 글쓰기를 시도하지 않을것 같아요. 그래서 초심자인 지금이 가장 좋은 타이밍이라고 생각합니다. jQuery를 잘 다루려면 초급 수준의 HTML/CSS 지식이 필요합니다.</p>
<p><a href="http://jquery.com/">jQuery</a>는 지구상에서 가장 인기있는 자바스크립트 라이브러리입니다. 2011년 6월 현재 <a href="http://w3techs.com/technologies/overview/javascript_library/all">w3techs.com</a> 통계에 따르면 지구촌 1/3 웹 사이트가 jQuery를 사용하고 있고, 자바스크립트 라이브러리를 사용하는 사이트 중 4/5 웹 사이트가 jQuery를 사용하고 있습니다. 이 정도면 대세라 부를만 하지요.</p>
<p>책을 통해서 자바스크립트나 jQuery를 배우려고 할 때 가장 불만인것은 거의 모든 책들이 기초부터 가르치려고 한다는 점입니다. 물론 저도 책을 쓴다면 그럴것 같긴 해요. 하지만 제가 성질이 급한건지 &quot;당장 써먹을 수 있는 것을 알려주면 참 좋을텐데&quot; 라는 생각을 항상 합니다. 블로그는 당장 써먹을 수 있는 것을 알려주기 참 좋은 도구 입니다. 누군가 궁금해 하는 것을 콕 짚어서 짧게 쓸 수 있고 실행 코드와 예제를 눈앞에 보여줄 수 있으니까요.</p>
<p>오늘의 목표는 자바스크립트를 통해 가장 빈번하게 구현하는 레이어 토글(열고 닫기)을 구현해 볼까 합니다. 아무리 급해도 jQuery 라이브러리를 불러오는 방법 정도는 설명하고 넘어갈께요.</p>
<h2>jQuery 라이브러리 참조하기</h2>
<p>jQuery 라이브러리는&nbsp;<a href="http://jquery.com/">http://jquery.com/</a>&nbsp;웹 사이트를 통해서 최신 버전을 내려받을 수 있습니다. 그러나 jQuery 라이브러리 파일을 다운받지 않고 CDN 서버가 제공하는 파일을 직접 링크해도 됩니다. 저는 jQuery 버전이 올라갈 때마다 업데이트 하는일이 귀찮아서 아예 항상 최신 버전으로 업데이트 되는 경로의 파일 <a href="http://code.jquery.com/jquery-latest.min.js">http://code.jquery.com/jquery-latest.min.js</a>&nbsp;를 링크해서 사용합니다. 다음과 같이 jQuery 라이브러리를 참조할 수 있습니다.</p>
<blockquote>
<p>&lt;head&gt;<br />
&nbsp; &nbsp; &#8230;<br />
&nbsp; &nbsp; &lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;<br />
&lt;/head&gt;<br />
&lt;body&gt;<br />
&nbsp; &nbsp; &#8230;<br />
&nbsp; &nbsp;&nbsp;&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.min.js&quot;&gt;&lt;/script&gt;<br />
&lt;/body&gt;</p>
</blockquote>
<p>일부러 head와 body에 jQuery를 두 번 로드했는데요. 실제로는 이렇게 사용하면 안됩니다. head 또는 body 안쪽의 원하는 위치에 넣을 수 있다는 것을 보여준 것 뿐입니다. head 또는 body 안쪽에 포함할 수 있지만 head, body 밖에서 작성하면 HTML 문법 오류입니다. 자바스크립트를 head에 포함하면 웹 브라우저가 자바스크립트 파일을 해석하는 동안 아직 body 부분을 해석하기 못했기 때문에 사용자는 빈 페이지를 보고 있어야 합니다. 웹 브라우저는 HTML 코드를 작성 순서대로 해석한다는 사실을 잊지 마세요. 물론 순식간에 일어날 일이겠지만 웹 페이지 체감 속도가 느려진다는 뜻입니다. 따라서 body에 넣는 것을 권장하며 body 중에서도 body 가장 아래쪽 body가 끝나기 직전에 삽입하는 것이 좋습니다. body가 로드되기 전에 자바스크립트를 먼저 해석해야만 하는 경우도 간혹 있는데요. 그런 상황이 오면 그 때 head로 옮겨도 늦지 않습니다. 제 블로그도 body 끝나기 직전에 해석하도록 로드해 놨습니다.</p>
<h2>jQuery 준비 함수 선언</h2>
<p>로드된 jQuery 라이브러리를 이용하려면 jQuery() 또는 $() &nbsp;함수 안쪽에 jQuery 문법의 스크립트를 작성하면 됩니다. jQuery()와 $()는 같은 표현입니다. 달러 &#8216;$&#8217; 표시는 jQuery 객체를 의미합니다. jQeury 라이브러리가 로드되면 앞으로 무수히 많이 등장할 모든 달러 &#8216;$&#8217; 기호를 웹 브라우저는 무조건 jQuery 객체라고 해석할 것입니다. 웹 브라우저는 jQuery 또는 달러 &#8216;$&#8217; 기호를 만나면 &quot;제이쿼리구만. 이제부터 jQuery 라이브러리에 있는 규칙을 참고해서 뭔가를 선택하거나 실행할께.&quot; 라고 말할 것입니다. <u>아래 코드는 항상 jQuery 라이브러리보다 나중에 선언</u>합니다.&nbsp;jQuery 라이브러리가 먼저 해석이 되어야 jQuery 라이브러리를 이용할 수 있습니다.&nbsp;</p>
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot;&gt;<br />
$<u>(document).ready</u>(function(){ <br />
&nbsp; &nbsp; // 여기에 작성한 코드는 브라우저가 HTML을 해석을 마칠 때까지 기다렸다가 실행합니다.<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>이 코드는&nbsp;<u>(document).ready</u> 부분을 지워서&nbsp;다음과 같이 축약할 수 있습니다.</p>
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot;&gt;<br />
$(function(){&nbsp;<br />
&nbsp; &nbsp; //&nbsp;여기에 작성한 코드는 브라우저가 HTML을 해석을 마칠 때까지 기다렸다가 실행합니다.<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>그러나 다른 자바스크립트 라이브러리와 jQuery를 함께 사용할 우려가 있는 경우 아래와 같이 작성합니다. 또 다른 자바스크립트 라이브러리에서도 달러 &#8216;$&#8217; 기호를 객체로 사용하고 있어 충돌이 날 수 있기 때문입니다. 이렇게 jQuery.noConflict() 라고 시작 부분에 선언하고 jQuery(function(){ &#8230; }) 함수 괄호() 안에 &#8216;$&#8217;를 넣어 두면 jQuery(function($){ &#8230; }) 안쪽에서는 충돌 없이 안전하게 달러 &#8216;$&#8217; 기호를 사용할 수 있습니다.</p>
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot;&gt;<br />
jQuery.noConflict();<br />
jQuery(function($){&nbsp;<br />
&nbsp; &nbsp; //&nbsp;여기에 작성한 코드는 브라우저가 HTML을 해석을 마칠 때까지 기다렸다가 실행합니다.<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>웹 브라우저가 HTML 해석을 마칠 때까지 기다렸다가 스크립트를 실행하는 이유가 뭘까요? HTML을 해석하기 전에 스크립트가 실행되면 HTML 요소를 선택해서 뭔가를 실행해야 하는 스크립트는 제대로 실행이 되지 않습니다. 예를 들어 .help 요소를 감춤 상태로 두고 웹 페이지를 로드해야 하는 경우 브라우저가 아직 HTML을 해석하기 전이라면 스크립트는 .help 요소를 찾지 못해 오류를 내고 말 것입니다. 자바스크립트 코드를 어쩔 수 없이 문서 head에 넣어서 HTML보다 먼저 읽히도록 설정해야 하는 경우가 발생할 수 있으니 아예 항상 이렇게 작성하는것이 안전합니다.</p>
<h2>요소를 선택하고, 이벤트를 설정하고, 동작을 실행하기</h2>
<p>jQuery 사용법은 CSS와 유사합니다. 일단 HTML 객체를 선택하는 방법이 CSS 선택자 사용법과 유사해서 CSS를 잘 다루는 사람은 jQuery에 매우 빠르게 익숙해 질 수 있습니다. jQuery 문법은 대부분 &#8216;선택 &#8211; 실행&#8217; 또는 &#8216;선택 &#8211; 이벤트 받으면 &#8211; 실행&#8217; 순으로 작성합니다. button.red 요소를 클릭하면 웹 페이지의 배경색을 붉게 바꾸는 코드를 한번 작성해 보겠습니다. button.white 요소를 클릭하면 다시 흰색이 될 것입니다.</p>
<blockquote>
<p>&lt;button class=&quot;red&quot;&gt;Red&lt;/button&gt; <br />
&lt;button class=&quot;white&quot;&gt;White&lt;/button&gt;&nbsp;</p>
<p>&nbsp;&lt;script type=&quot;text/javascript&quot;&gt;<br />
$(function(){&nbsp;<br />
&nbsp; &nbsp; $(&#8216;button.red&#8217;).click(function(){&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; $(&#8216;body&#8217;).css(&#8216;background&#8217;,'red&#8217;);&nbsp;<br />
&nbsp; &nbsp; });<br />
&nbsp; &nbsp; $(&#8216;button.white&#8217;).click(function(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; $(&#8216;body&#8217;).css(&#8216;background&#8217;,'white&#8217;);<br />
&nbsp; &nbsp; });<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>HTML 요소를 선택할 때 $(&#8216;&#8230;&#8217;) 안쪽에 CSS 선택자를 넣습니다.&nbsp;$(&#8216;button.red&#8217;)를 선택했죠.&nbsp;그리고 마침표(.)를 이용하여 .click() 이벤트를 연결했고 .click() 이벤트가 발생했을 때 어떤 함수 (function(){ &#8230; }) 를 실행할지 적어줍니다. 함수 안에서는 다시&nbsp;$(&#8216;body&#8217;)를 선택하고 마침표(.)를 이용하여 .css() 함수를 연결합니다. .css() 함수 안에는 이렇게 (&#8216;property&#8217;,'value&#8217;) 속성과 값을 넣었구요. 아래 버튼을 이용해서 작성한 예제 코드가 웹 페이지를 어떻게 변화시키는지 확인해 보세요.</p>
<p><button class="red">Red</button> <button class="white">White</button></p>
<p><script>
$(function(){ 
    $('button.red').click(function(){
        $('body').css('background','red');
    });
    $('button.white').click(function(){
        $('body').css('background','white');
    });
});
</script></p>
<p>그러나 오늘의 학습 목표는 이게 아니었죠. 레이어를 토글하는게 목표입니다. 레이어를 토글하는 것은 이 예제보다 조금 더 복잡합니다. 사실 if 문이 필요해요. if (레이어가 닫혀있으면) {열기를 실행} else if (레이어가 열려있으면) {닫기를 실행} 그런데 첫날부터 이렇게 어려운걸 가르칠 리가 없잖아요. 다음을 보세요.</p>
<h2>레이어 토글하기</h2>
<p>일단 다음과 같은 HTML을 머리속에 그려 넣으세요.</p>
<p style="margin-left: 40px; ">&lt;p&gt;&lt;a href=&quot;<b>#first</b>&quot;&gt;First Anchor&lt;/a&gt;&lt;/p&gt;<br />
&lt;p&nbsp;id=&quot;<b>first</b>&quot;&gt;First Layer&lt;/p&gt;<br />
&lt;p&gt;&lt;a href=&quot;<b>#second</b>&quot;&gt;Second Anchor&lt;/a&gt;&lt;/p&gt;<br />
&lt;p&nbsp;id=&quot;<b>second</b>&quot;&gt;Second Layer&lt;/p&gt;</p>
<p>제 머리속에는 아래와 같은 그림이 그려졌습니다. DOM 구조, HTML 요소, href 값, id 값 이름을 머리속에 넣었습니다.</p>
<ul>
<li>p &gt;&nbsp;a[href=<b>#first</b>]</li>
<li>p<b>#first</b></li>
<li>p &gt;&nbsp;a[href=<b>#second</b>]</li>
<li>p<b>#second</b></li>
</ul>
<p><span class="Apple-style-span">스크립트를 작성하기 위한 시나리오를 떠올립니다. 일단 레이어 요소 #first, #second를 모두 찾아내어 숨깁니다. 그 다음 href 값이&nbsp;</span>#first, #second인<span class="Apple-style-span">&nbsp;요소를 찾습니다. 클릭하는 경우 자신의 href 속성 값을 변수에 할당하고 변수에 할당된 값을 id 값으로 지니고 있는 요소를 선택한 다음 .toggle() 함수를 실행합니다. 마지막에 return false 를 추가하여 .click() 이벤트를 취소합니다. 웹 페이지가 자동으로 URL까지 스크롤 하는 것을 방지하는 목적입니다. 다음과 같은 코드를 작성 했습니다.</span></p>
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot;&gt;<br />
$(function(){<br />
&nbsp; &nbsp; $(&#8216;<b>#first</b>, <b>#second</b>&#8216;).hide();<br />
&nbsp; &nbsp; $(&#8216;<b>a[href=#first], a[href=#second]</b>&#8216;).click(function(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; var <b>myHref</b> = <u>$(this).attr(&#8216;href&#8217;)</u>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; $(<b>myHref</b>).toggle();<br />
&nbsp; &nbsp; &nbsp; &nbsp; return false;<br />
&nbsp; &nbsp; });<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>사실 이 코드는 변수 var <b>myHref</b> =&nbsp;$(this).attr(&#8216;href&#8217;);&nbsp;를 사용하지 않음으로써 다음과 같이 더 단순하게 줄일 수 있습니다.</p>
<blockquote>
<p>&lt;script type=&quot;text/javascript&quot;&gt;<br />
$(function(){<br />
&nbsp; &nbsp; $(&#8216;<b>#first</b>,&nbsp;<b>#second</b>&#8216;).hide();<br />
&nbsp; &nbsp; $(&#8216;<b>a[href=#first], a[href=#second]</b>&#8216;).click(function(){<br />
&nbsp; &nbsp; &nbsp; &nbsp; $(<u>$(this).attr(&#8216;href&#8217;)</u>).toggle();<br />
&nbsp; &nbsp; &nbsp; &nbsp; return false;<br />
&nbsp; &nbsp; });<br />
});<br />
&lt;/script&gt;</p>
</blockquote>
<p>실행 결과는 다음과 같습니다. 링크를 클릭할 때 URL이 닫혀있으면 열리고 URL이 열려있으면 닫히는 동작입니다.</p>
<p><a href="#first">First Anchor</a></p>
<p id="first">First Layer</p>
<p><a href="#second">Second Anchor</a></p>
<p id="second">Second Layer</p>
<p><script type="text/javascript">
$(function(){ 
    $('#first, #second').hide();
	$('a[href=#first], a[href=#second]').click(function(){
		var myHref = $(this).attr('href');
		$(myHref).toggle();
		return false;
	});
});
</script></p>
<p>사용된 코드를 한 라인씩 설명하면 다음과 같습니다.</p>
<ul>
<li>$(&#8216;<b>#first</b>, <b>#second</b>&#8216;) &#8211; #first 요소와 #second 요소를 동시에 선택 합니다.</li>
<li>.hide() &#8211; 선택한 요소를 display:none 처리합니다.</li>
<li>$(&#8216;a[href=#first], a[href=#second]&#8216;) &#8211; href 속성 값이 #first, #second인 a 요소를 선택합니다.</li>
<li>.click() &#8211; 사용자가 클릭 이벤트를 발생시켰을 때 함수를 실행합니다.</li>
<li>var <b>myHref</b> = $(this).attr(&#8216;href&#8217;) &#8211; myHref 라는 변수를 만들고 변수에&nbsp;$(this).attr(&#8216;href&#8217;)&nbsp;값을 할당 했습니다. $(this)는 클릭된 a 요소입니다. 이어지는 .attr(&#8216;href&#8217;) 함수는 href 속성의 값을 구해옵니다. 만약 어딘가에서 .attr(&#8216;href&#8217;,'#five&#8217;) 이런 작성법을 본다면 이것은 href 속성에 #five라는 값을 셋팅하겠다는 뜻입니다. 그러나 값을 작성하지 않고 속성만 작성하는 경우에는 이미 셋팅되어 있는 값을 구해오라는 명령입니다. 다시한번 정리하면 이 코드는 클릭된 a 요소의 href 속성 값을 구해와서 myHref라는 변수에 담아라 입니다.</li>
<li>$(<b>myHref</b>).toggle() &#8211; myHref 변수에 저장된 값은 a 요소의 href 속성 값으로써 #first 아니면 #second 일 것입니다. 즉, 숨은 레이어 중에서 클릭된 a 요소의 목적지를 선택했습니다. 이어지는 .toggle() 함수는 선택한 요소에 대하여 display:none과 display:block 상태를 반복합니다. 선택한 요소가 닫혀 있으면 열고, 열려 있으면 닫히도록 동작합니다.</li>
<li>return false &#8211; .click() 함수가 실행되면 웹 브라우저는 URL까지 자동으로 스크롤을 하는데 이것을 원치 않는 경우 return false 를 반환하여 .click() 이벤트가 취소되었음을 브라우저에 알립니다. 단, 이미 실행된 동작은 취소가 되지 않기 때문에 레이어가 열리고 닫히는 동작은 실행이 취소되지 않습니다.</li>
</ul>
<p>CSS 선택자를 이용하여 DOM으로부터 HTML 요소를 선택하고, 이벤트 함수를 설정하고, 이벤트가 발생했을 때 실행할 동작을 정의하는 순서로 코드를 작성하는 경우가 대부분입니다. $(&#8216;&#8230;&#8217;)과 $(&#8230;)은 어떻게 다를까요? 괄호() 안에서는 홀따옴표 또는 쌍따옴표 모두 사용할 수 있는데요. 따옴표로 감싸는 경우 브라우저는 감싼 부분을 &#8216;string(문자열)&#8217;으로 해석합니다. 즉, HTML 요소 이름, 아이디 이름, 클래스 이름은 모두 따옴표를 사용해서 감싸줘야 합니다. 그러나 myHref와 같은 경우는 자바스크립트 변수이기 때문에 따옴표로 감싸면 안됩니다. 재미있는 것은 레이어를 토글할 때 .toggle() 함수만 사용할 수 있는게 아니라는 겁니다. 슬라이드 .slideToggle() 페이드 .fadeToggle() 함수를 사용하면 조금 더 미려한 동작이 가능합니다.</p>
<h2>참고</h2>
<ul>
<li>IBM에서 소개하는 &#8216;jQuery로 Ajax 개발을 단순화 하기&#8217;도 읽어보세요. -&nbsp;<a href="http://www.ibm.com/developerworks/kr/library/x-ajaxjquery.html">http://www.ibm.com/developerworks/kr/library/x-ajaxjquery.html</a></li>
<li>TAEYO.NET에서 소개하는 &#8216;jQuery 프로그래밍&#8217;도 읽어보세요. -&nbsp;<a href="http://www.taeyo.net/Columns/List.aspx?SEQ=29&amp;IDX=1">http://www.taeyo.net/Columns/List.aspx?SEQ=29&amp;IDX=1</a></li>
<li>제가 만든 jQuery UI 예제들도 참고해 보세요. -&nbsp;<a href="http://naradesign.net/xeui/">http://naradesign.net/xeui/</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2011/06/18/1536/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>42 CSS3 Selectors(+Meaning) &amp; Browser Support.</title>
		<link>http://naradesign.net/wp/2010/06/17/1343/</link>
		<comments>http://naradesign.net/wp/2010/06/17/1343/#comments</comments>
		<pubDate>Wed, 16 Jun 2010 18:39:26 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[웹 디자인]]></category>
		<category><![CDATA[웹 표준]]></category>
		<category><![CDATA[자바스크립트]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/?p=1343</guid>
		<description><![CDATA[CSS level 1~3까지의 모든 선택자와 그에 대한 해설 그리고 대중적인 브라우저들의 지원 여부를 정리하였습니다. CSS 선택자 문법을 익히면 jQuery를 익히는 것에도 무척 도움이 됩니다. jQuery가 HTML 요소를 선택하는 문법이 CSS가 HTML을 선택하는 문법과 거의 동일하니까요. jQuery를 사용하려면 스크립트가 DOM 구조의 HTML을 어떻게 선택하는지 알아야 하고 그것을 알고자 한다면 CSS 선택자 사용법을 익히는 것이 필수적이라고 할 [...]]]></description>
			<content:encoded><![CDATA[<p>CSS level 1~3까지의 모든 선택자와 그에 대한 해설 그리고 대중적인 브라우저들의 지원 여부를 정리하였습니다. CSS 선택자 문법을 익히면 jQuery를 익히는 것에도 무척 도움이 됩니다. jQuery가 HTML 요소를 선택하는 문법이 CSS가 HTML을 선택하는 문법과 거의 동일하니까요. jQuery를 사용하려면 스크립트가 DOM 구조의 HTML을 어떻게 선택하는지 알아야 하고 그것을 알고자 한다면 CSS 선택자 사용법을 익히는 것이 필수적이라고 할 수 있습니다.</p>
<p>제가 요즈음 싸부로 모시는 <a href="http://mygony.com/">행복한고니</a>의 jQuery 강의를 들을 기회가 있었는데 이런걸 알려 주더라구요. jQuery를 잘 쓰려면 먼저 세 가지 순서를 기억해야 하는데 그것은 바로 &#39;선택하고-실행하고-조정하라&#39;는 것이었습니다. 오늘 제 포스팅은 &#39;선택&#39;과 관련된 이야기 입니다. jQuery 코드는 아직 한 줄도 없지만 사실 저는 jQuery 강좌를 시작한 것과 다를 바 없습니다.</p>
<p>저 jQuery 잘하냐구요? 아니요. 저는 제가 이미 알고 있는 것들을 글로 옮기는 일에는 사실 흥미가 없습니다. 주로 모르는 것을 잘 알기 위해 글을 쓰는 편이죠. 얼마전 라디오를 듣는데 어떤 교수님께서 이런 고백을 하십니다. &quot;교수들은 사실 학생들을 가르치는 척 하면서 배운다&quot; 라구요. 이것은 교수님들만의 이야기는 아닌것 같아요.</p>
<p>참, 그리고 한 가지 더 추가 하자면 CSS는 낡은 브라우저(IE6)에서 선택자 사용을 지원하지 못하는 호환성 문제가 있지만 자바스크립트는 그렇지 않습니다. jQuery는 아래 표시된 모든 브라우저에서 똑같이 선택자 사용을 지원합니다. 이것 또한 jQuery의 장점 이라고 할 수 있겠네요. CSS를 이용해서 뭔가 선택하지 못하는 경우 jQuery를 이용하면 선택할 수 있으니까요.</p>
<p>가령 게시판을 제작할 때 짝수 행 <code>&lt;tr&gt;</code> 만을 선택하여 배경색을 지정하려는 경우 <code>tr:nth-child(even)</code> 이라는 CSS 선택자를 사용할 수 있지만 IE 6~8 브라우저는 아직 CSS 3 선택자를 지원하지 않기 때문에 표현이 불가능 합니다. 그러나 jQuery는 이렇게 &#39;선택+실행&#39; 할 수 있습니다.</p>
<p><code class="block">&lt;script type=&quot;text/javascript&quot; src=&quot;http://code.jquery.com/jquery-latest.js&quot;&gt;&lt;/script&gt; <br />
&lt;script type=&quot;text/javascript&quot;&gt; <br />
jQuery(function($){ <br />
&nbsp; <b>$(&#39;tr:nth-child(even)&#39;)</b>.css(&#39;background&#39;,&#39;red&#39;); <br />
}); <br />
&lt;/script&gt;</code></p>
<p><b>odd</b>는 홀수를 의미하고 <b>even</b>은 짝수를 의미하죠. 아직 자바스크립트 또는 jQuery를 배울만한 동기가 없으셨던 분들께는 새로운 동기부여가 되었으면 좋겠습니다. 아주 쉽다는 것을 깨닫고 한 번 사용하기 시작하면 걷잡을 수 없이 빠져드는 매력이 있답니다. 그러나 과유불급. 어느곳에 쓰고 어느곳에는 쓰지 말아야 할지 정확히 알고 쓰는것이 더 중요합니다. HTML/CSS 만으로도 충분히 가능한 일을 JS에게 완전히 의존하는 코드를 보면 저는 이렇게 이야기 한답니다. &quot;건방지게 어딜 나서? 겸손할 줄 알아야지. 넌 항상 HTML/CSS 다음이야.&quot; 라구요.</p>
<table border="1">
<caption style="overflow:hidden"><strong style="float: left;">42 CSS 3 Selectors</strong> <span style="float: right;"><strong>C</strong>:Chrome, <strong>S</strong>:Safari, <strong>F</strong>:Firefox, <strong>O</strong>:Opera, <strong>IE</strong>:Internet Explorer</span></caption>
<thead>
<tr>
<th scope="col">level</th>
<th scope="col">Selectors</th>
<th scope="col">C5</th>
<th scope="col">S4</th>
<th scope="col">F3.6</th>
<th scope="col">O10.5</th>
<th scope="col">IE8</th>
<th scope="col">IE7</th>
<th scope="col">IE6</th>
<th scope="col">Meaning</th>
</tr>
</thead>
<tbody>
<tr>
<th rowspan="20" scope="row">CSS 3</th>
<th scope="row">E[attr^=val]</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>&#39;attr&#39; 속성의 값이 &#39;val&#39;으로 시작하는 요소를 선택(val, value 모두 선택)</td>
</tr>
<tr>
<th scope="row">E[attr$=val]</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>&#39;attr&#39; 속성의 값이 &#39;val&#39;으로 끝나는 요소를 선택(val, eval 모두 선택)</td>
</tr>
<tr>
<th scope="row">E[attr*=val]</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>&#39;attr&#39; 속성의 값에 &#39;val&#39;이 포함되는 요소를 선택(val, value, eval 모두 선택)</td>
</tr>
<tr>
<th scope="row">E:root</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>문서의 최상위 요소(html)를 선택</td>
</tr>
<tr>
<th scope="row">E:nth-child(n)</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>앞으로부터 지정된 순서와 일치하는 요소가 E 라면 선택(E 아닌 요소의 순서가 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:nth-last-child(n)</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>뒤로부터 지정된 순서와 일치하는 요소가 E 라면 선택(E 아닌 요소의 순서가 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:nth-of-type(n)</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소 중 앞으로부터 순서가 일치하는 E 요소를 선택(E 요소의 순서만 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:nth-last-of-type(n)</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소 중 끝으로부터 순서가 일치하는 E 요소를 선택(E 요소의 순서만 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:last-child</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>마지막에 등장하는 요소가 E 라면 선택(E 아닌 요소의 순서가 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:first-of-type</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소 중 첫 번째 E를 선택(E 요소의 순서만 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:last-of-type</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소 중 마지막 E를 선택(E 요소의 순서만 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:only-child</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소가 유일한 자식이면 선택(E 아닌 요소가 하나라도 포함되면 선택 안함)</td>
</tr>
<tr>
<th scope="row">E:only-of-type</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소가 유일한 타입이면 선택(E 아닌 요소가 포함되어도 E 타입이 유일하면 선택)</td>
</tr>
<tr>
<th scope="row">E:empty</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>텍스트 및 공백을 포함하여 자식 요소가 없는 E를 선택</td>
</tr>
<tr>
<th scope="row">E:target</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E의 URI가 요청되면 선택(따라서 E는 ID가 지정되어 있어야 한다)</td>
</tr>
<tr>
<th scope="row">E:enabled</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>사용 가능한 폼 콘트롤(input, textarea, select, button) E를 선택</td>
</tr>
<tr>
<th scope="row">E:disabled</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>사용 불가능한 폼 콘트롤(input, textarea, select, button) E를 선택</td>
</tr>
<tr>
<th scope="row">E:checked</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>선택된 폼 콘트롤(input checked=&quot;checked&quot;)을 선택</td>
</tr>
<tr>
<th scope="row">E:not(s)</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td class="no">no</td>
<td>S가 아닌 E 요소를 선택</td>
</tr>
<tr>
<th scope="row">E~F</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>E 요소가 앞에 존재하면 F를 선택(E가 F보다 먼저 등장하지 않으면 선택 안함)</td>
</tr>
<tr>
<th rowspan="11" scope="row">CSS 2</th>
<th scope="row">*</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>모든 요소를 선택</td>
</tr>
<tr>
<th scope="row">E[attr]</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>&#39;attr&#39; 속성이 포함된 요소 E를 선택</td>
</tr>
<tr>
<th scope="row">E[attr=val]</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>&#39;attr&#39; 속성의 값이 정확하게 &#39;val&#39;과 일치하는 요소 E를 선택</td>
</tr>
<tr>
<th scope="row">E[attr~=val]</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>&#39;attr&#39; 속성의 값이 공백으로 분리된 &#39;val&#39;으로 끝나는 요소를 선택(val 선택, eval 선택 안함)</td>
</tr>
<tr>
<th scope="row">E[attr|=val]</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>&#39;attr&#39; 속성의 값이 &#39;val&#39; 또는 &#39;val-&#39; 으로 시작되는 요소 E를 선택</td>
</tr>
<tr>
<th scope="row">E:first-child</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>첫 번째 등장하는 요소가 E 라면 선택(E 아닌 요소의 순서가 계산에 포함됨)</td>
</tr>
<tr>
<th scope="row">E:lang(en)</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td>HTML lang 속성의 값이 &#39;en&#39;으로 지정된 요소를 선택</td>
</tr>
<tr>
<th scope="row">E:before</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소의 시작 지점에 생성된 요소를 선택</td>
</tr>
<tr>
<th scope="row">E:after</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소의 끝 지점에 생성된 요소를 선택</td>
</tr>
<tr>
<th scope="row">E&gt;F</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>E 요소의 자식인 F 요소를 선택</td>
</tr>
<tr>
<th scope="row">E+F</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>E 요소를 뒤따르는 F 요소를 선택(E와 F 사이에 다른 요소가 존재하면 선택 안함)</td>
</tr>
<tr>
<th rowspan="11" scope="row">CSS 1</th>
<th scope="row">E</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>E 요소를 선택</td>
</tr>
<tr>
<th scope="row">E:link</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>방문하지 않은 앵커 E를 선택</td>
</tr>
<tr>
<th scope="row">E:visited</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>방문한 앵커 E를 선택</td>
</tr>
<tr>
<th scope="row">E:hover</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>E 요소에 마우스가 올라가 있는 동안 E를 선택</td>
</tr>
<tr>
<th scope="row">E:active</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>E 요소에 마우스 클릭 또는 키보드 엔터가 눌린 동안 E를 선택</td>
</tr>
<tr>
<th scope="row">E:focus</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td class="no">no</td>
<td>E 요소에 포커스가 머물러 있는 동안 E를 선택</td>
</tr>
<tr>
<th scope="row">E:first-line</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>E 요소의 첫 번째 라인을 선택</td>
</tr>
<tr>
<th scope="row">E:first-letter</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td class="no">no</td>
<td>E 요소의 첫 번째 문자를 선택</td>
</tr>
<tr>
<th scope="row">.class</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>클래스 이름이 class로 지정된 요소 선택</td>
</tr>
<tr>
<th scope="row">#id</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>아이디 이름이 id로 지정된 요소 선택</td>
</tr>
<tr>
<th scope="row">E F</th>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>yes</td>
<td>E 요소의 자손인 F 요소를 선택</td>
</tr>
</tbody>
</table>
<p><script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script><script type="text/javascript">
jQuery(function($){
$('.no').css({'background':'red','color':'white'});
$('tbody th').css('white-space','nowrap');
});
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2010/06/17/1343/feed/</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>jQuery를 이용하여 FAQ 목록 만들기.</title>
		<link>http://naradesign.net/wp/2010/03/26/1265/</link>
		<comments>http://naradesign.net/wp/2010/03/26/1265/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 16:15:41 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[웹 기획]]></category>
		<category><![CDATA[웹 디자인]]></category>
		<category><![CDATA[웹 접근성]]></category>
		<category><![CDATA[웹 표준]]></category>
		<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[FAQ]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/2010/03/26/1265/</guid>
		<description><![CDATA[FAQ(Frequently Asked Question) 목록은 어떤 요소로 마크업 할 것인지가 가장 고민이 됩니다. 예를 들면 다음과 같은 다양한 마크업 방법이 있는데요. ul &#62; li &#62; (p+p) ul &#62; li &#62; (hx+p) ul &#62; li &#62; dl &#62; (dt+dd) dl &#62; (dt+dd) + (dt+dd) + (dt+dd) &#8230; dl(dt+dd) + dl(dt+dd) + dl(dt+dd) &#8230; 오늘 제가 선택한 방법은 [...]]]></description>
			<content:encoded><![CDATA[<p>FAQ(Frequently Asked Question) 목록은 어떤 요소로 마크업 할 것인지가 가장 고민이 됩니다. 예를 들면 다음과 같은 다양한 마크업 방법이 있는데요.</p>
<ul>
<li>ul &gt; li &gt; (p+p)</li>
<li>ul &gt; li &gt; (hx+p)</li>
<li>ul &gt; li &gt; dl &gt; (dt+dd)</li>
<li>dl &gt; (dt+dd) + (dt+dd) + (dt+dd) &#8230;</li>
<li>dl(dt+dd) + dl(dt+dd) + dl(dt+dd) &#8230;</li>
</ul>
<p>오늘 제가 선택한 방법은 첫 번째 방법 이었습니다. 이 방법이 정답이라고 단적으로 말하기는 어렵고 다른 방법이 틀렸다고 말하기도 어렵습니다. HTML 구조에 정답이 있는것은 아니니까요. 하지만 제가 첫 번째 마크업을 선택한 이유를 설명드려 보겠습니다. 솔직히 말씀 드리자면 이 선택에 대한 확신은 아직 없습니다.</p>
<ul style="list-style-type: decimal;">
<li>질문과 답변 목록은 &#8216;목록&#8217; 이기 때문에 일단 &#8216;ul, ol, dl&#8217; 요소 가운데 하나를 사용하는 것이 적합하다고 판단 했습니다.</li>
<li>&#8216;ol&#8217; 목록은 항목의 배치 순서에 의미가 있는 경우 사용하면 되는데 &#8216;질문/답변&#8217; 목록은 배치 순서를 바꿔도 의미가 달라지지 않는 비 순차 목록이라고 판단해서 제외 했습니다.</li>
<li>&#8216;ul&#8217; 목록은 항목의 배치 순서에 의미가 없는 경우 사용하면 되는데 &#8216;질문/답변&#8217; 목록은 배치 순서에 의미가 없다고 판단해서 사용 했습니다.</li>
<li>&#8216;dl&#8217; 목록은 정의 목록으로써 질문과 답변 형식에 사용해도 괜찮다고 판단 했지만 한 쌍의 &#8216;dt+dd&#8217; 요소를 한 번 더 감싸주는 마크업이 필요한 경우 CSS 스타일을 적용하는데 제한이 발생하기 때문에 제외 했습니다.</li>
<li>&#8216;dl+dl&#8217; 형식은 &#8216;dl&#8217; 요소를 &#8216;항목의 그룹핑&#8217; 아닌 단 하나의 &#8216;항목&#8217;에만 적용했기 때문에 의미에 맞지 않다고 판단해서 제외 했습니다.</li>
<li>&#8216;li &gt; dl &gt; (dt+dd)&#8217; 형식은 목록 안에 또 다른 목록을 포함시키는 형태로써 하나의 항목을 두 번이나 목록 요소로 중첩 마크업 하는 것이 남용이라고 판단해서 제외 했습니다.</li>
<li>&#8216;ul &gt; li &gt; (p+p)&#8217; 형식으로 마크업 하는 것은 &#8216;질문/답변&#8217;을 모두 각각의 문단으로 볼 수 있기 때문에 적합하다고 판단 했습니다. 그러나 &#8216;질문&#8217;과 &#8216;답변&#8217;을 동일한 요소 &#8216;p&#8217;로 마크업 했다는 점에서 여전히 뒷맛이 개운치가 않네요.</li>
<li>&#8216;li &gt; (hx+p)&#8217; 형식은 목록 안에 제목(hx) 요소가 들어가는 형태로써 의미상 가장 적합하다고 판단 했지만 목록 안에서 &#8216;hx&#8217; 요소를 사용하는 것이 &#8216;hx&#8217;를 남용하는 것은 아닌지 구조의 적절함에 확신이 서지 않아서 제외 했습니다. 그러나 만약 &#8216;li&gt;(p+p)&#8217; 구조를 선택하지 않았다면 이것을 선택했을 것입니다.</li>
<li>만약 한 쌍의 &#8216;(dt+dd)&#8217; 요소를 &#8216;dl&#8217; 요소로 직접 감싸는 대신 &#8216;di&#8217;(definition item)와 같이 한번 더 묶어주는 마크업 요소가 존재 했다면 저는 &#8216;dl&#8217; 요소를 선택했을 것입니다. 제가 이상적이라고 생각하는 마크업 구조는 &#8216;dl &gt; di &gt; (dt+dd)&#8217; 이런 구조 인데 &#8216;di&#8217; 요소는 실제로는 존재하지 않는 요소이므로 착오 없으시길 바랍니다.</li>
</ul>
<div style="display: block;" class="iframe"><iframe frameborder="0" width="100%" title="jQuery를 이용한 FAQ 목록 입니다. 이런 효과를 흔히 아코디언 효과(accordion effect)라고 부릅니다. 이 예제를 새 창으로 보기" src="http://naradesign.net/ouif/uio/list/faq/xhtml.html" style="display: block; height: 545px;"></iframe><span>jQuery를 이용한 FAQ 목록 입니다. 이런 효과를 흔히 아코디언 효과(accordion effect)라고 부릅니다. <a target="_blank" href="http://naradesign.net/ouif/uio/list/faq/xhtml.html">이 예제를 새 창으로 보기</a>&nbsp;| <a href="http://naradesign.net/ouif/">OUIF</a> 페이지에 더 많은 예제들이 있습니다.</span></div>
<h3 id="h1269531325137">a 요소에 유효한 URL 사용하기</h3>
<p>질문은 &#8216;a&#8217; 요소로 마크업 되어 있고 &#8216;href&#8217; 값으로는 유효한 &#8216;URL&#8217;(#a1, #a2, #a3 &#8230;)이 포함되어 있습니다. 유효하다는 것은 링크의 목적지가 존재하고 링크 주소를 따라가면 기대했던 자원이 있다는 것을 의미 합니다. 만약 누군가에게 특정 &#8216;질문/답변&#8217; 항목을 링크 주소를 통해 알려주어야 한다면 여러분은 마우스 우측 버튼을 눌러 &#8216;링크 주소 복사&#8217; 기능을 이용할 수 있을 것입니다. URL이 유효하지 않다면 이런 편의는 불가능한 일입니다. &#8216;href&#8217; 값으로 의미 없는 값 &#8216;#&#8217;을 넣는다면 클릭 또는 키보드 Enter를 내리 쳤을 때 키보드 포커스는 페이지 맨 처음으로 이동해 버리기 때문에 화면 낭독기 사용자(시각 장애인)는 처음부터 다시 탐색을 시도해야 합니다. 유효한 URL을 작성하는 것은 사용성과 접근성을 모두 높여주는 일로써&nbsp;되도록 모든 링크에는 유효한 URL 값을 포함해야 합니다.</p>
<h3 id="h1269531690656">관련글</h3>
<ul>
<li><a href="http://www.clearboth.org/wiki/doku.php?id=lecture:html:faq_semantic_markup">FAQ의 의미 있는 마크업은?</a>&nbsp;- 추지호</li>
<li><a target="_self" href="http://njpaiks.egloos.com/2407349">목록(ol ul dl)의 올바른 활용 문제</a> &#8211; 백남중</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2010/03/26/1265/feed/</wfw:commentRss>
		<slash:comments>46</slash:comments>
		</item>
		<item>
		<title>jQuery+CSS Tree Navigation.</title>
		<link>http://naradesign.net/wp/2010/03/15/1225/</link>
		<comments>http://naradesign.net/wp/2010/03/15/1225/#comments</comments>
		<pubDate>Mon, 15 Mar 2010 12:30:15 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[웹 기획]]></category>
		<category><![CDATA[웹 디자인]]></category>
		<category><![CDATA[웹 접근성]]></category>
		<category><![CDATA[웹 표준]]></category>
		<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tree Navigation]]></category>
		<category><![CDATA[Tree View]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/2010/03/15/1225/</guid>
		<description><![CDATA[jQuery를 이용한 Tree Navigation 예제는 어렵지 않게 찾을 수 있었는데요. 키보드만으로도 조작이 가능한 접근성 있는 예제는 찾기가 쉽지 않더라구요. 공개된 소스코드를 수정해서 사용할까 하다가 공부도 할 겸 해서 직접 만들어 봤습니다. 중첩 목록(ul&#62;li&#62;ul&#62;li) 구조로 마크업 했고 현재 페이지 활성 상태를 표시 하려면 해당 li 요소에 .active 클래스를 추가(서버측 스크립트로)해 주면 됩니다. 계층 구조가 무한대로 깊어지는 [...]]]></description>
			<content:encoded><![CDATA[<p>jQuery를 이용한 Tree Navigation 예제는 어렵지 않게 찾을 수 있었는데요. 키보드만으로도 조작이 가능한 접근성 있는 예제는 찾기가 쉽지 않더라구요. 공개된 소스코드를 수정해서 사용할까 하다가 공부도 할 겸 해서 직접 만들어 봤습니다.</p>
<p>중첩 목록(ul&gt;li&gt;ul&gt;li) 구조로 마크업 했고 현재 페이지 활성 상태를 표시 하려면 해당 li 요소에 .active 클래스를 추가(서버측 스크립트로)해 주면 됩니다. 계층 구조가 무한대로 깊어지는 상황도 처리가 가능 합니다. &#8216;+/-&#8217; 토글 버튼에 키보드가 접근해서 하위 목록 토글 인터렉션을 조작할 수 있습니다.</p>
<p><a target="_blank" href="http://naradesign.net/ouif/uio/navigation/vertical/tree/xhtml.html">예제를 새 창으로 보기</a></p>
<div class="iframe"><iframe frameborder="0" width="100%" style="display: block; height: 684px;" src="http://naradesign.net/ouif/uio/navigation/vertical/tree/xhtml.html" title="예제를 새 창으로 보기"></iframe></div>
<p style="padding: 1em; border: 1px dotted rgb(204, 204, 204); background: none repeat scroll 0% 0% rgb(248, 248, 248); text-align: center;">이 밖에 더 많은 예제들이 <a title="Open User Interface Framework" href="http://naradesign.net/ouif/">OUIF</a>&nbsp;|&nbsp;<a href="http://naradesign.net/xeui/">XEUI</a>&nbsp;페이지에 링크되어 있습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2010/03/15/1225/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>CSS Tab Navigation + List Item Navigation.</title>
		<link>http://naradesign.net/wp/2010/03/11/1216/</link>
		<comments>http://naradesign.net/wp/2010/03/11/1216/#comments</comments>
		<pubDate>Thu, 11 Mar 2010 12:54:56 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[웹 디자인]]></category>
		<category><![CDATA[웹 접근성]]></category>
		<category><![CDATA[웹 표준]]></category>
		<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[Tab Design]]></category>
		<category><![CDATA[웹접근성]]></category>
		<category><![CDATA[웹표준]]></category>
		<category><![CDATA[유니버설디자인]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/2010/03/11/1216/</guid>
		<description><![CDATA[HTML/CSS와 jQuery를 이용하여 비교적 단순하지만 상당히 빈번하게 사용되는 Tab Navigation을 마크업 했습니다. 선으로 처리된 탭, 면으로 처리된 탭, 최근 게시물을 보여주는 목록 아이템 형태의 탭 디자인 입니다.&#160; Lined Tab Navigation Lined Tab Navigation : 예제를 새 창으로 보기 Faced Tab Navigation Faced Tab Navigation : 예제를 새 창으로 보기 List Item Navigation List Item Navigation [...]]]></description>
			<content:encoded><![CDATA[<p>HTML/CSS와 jQuery를 이용하여 비교적 단순하지만 상당히 빈번하게 사용되는 Tab Navigation을 마크업 했습니다. 선으로 처리된 탭, 면으로 처리된 탭, 최근 게시물을 보여주는 목록 아이템 형태의 탭 디자인 입니다.&nbsp;</p>
<h3 id="h1268310897684">Lined Tab Navigation</h3>
<div style="display: block;" class="iframe"><iframe frameborder="0" width="100%" title="Lined Tab Navigation : 예제를 새 창으로 보기" src="http://naradesign.net/ouif/uio/navigation/horizontal/linedTab/xhtml.html" style="display: block; height: 114px;"></iframe><span><a target="_blank" href="http://naradesign.net/ouif/uio/navigation/horizontal/linedTab/xhtml.html">Lined Tab Navigation : 예제를 새 창으로 보기</a></span></div>
<h3 id="h1268311287656">Faced Tab Navigation</h3>
<div style="display: block;" class="iframe"><iframe frameborder="0" width="100%" title="Faced Tab Navigation : 예제를 새 창으로 보기" src="http://naradesign.net/ouif/uio/navigation/horizontal/facedTab/xhtml.html" style="display: block; height: 127px;"></iframe><span><a target="_blank" href="http://naradesign.net/ouif/uio/navigation/horizontal/facedTab/xhtml.html">Faced Tab Navigation : 예제를 새 창으로 보기</a></span></div>
<h3 id="h1268311652478">List Item Navigation</h3>
<div style="display: block;" class="iframe"><iframe frameborder="0" width="100%" title="List Item Navigation : 예제를 새 창으로 보기" src="http://naradesign.net/ouif/uio/navigation/horizontal/listTab/xhtml.html" style="display: block; height: 215px;"></iframe><span><a target="_blank" href="http://naradesign.net/ouif/uio/navigation/horizontal/listTab/xhtml.html">List Item Navigation : 예제를 새 창으로 보기</a></span></div>
<h3 id="h1268311837046">Tab Navigation 예제의 특징</h3>
<ul>
<li>중첩 목록(ul&gt;li&gt;ul&gt;li)을 이용한 탭 네비게이션 예제.</li>
<li>목록의 계층 구조가 논리적으로 마크업 되어 있다.</li>
<li>키보드만으로도 접근이 가능하고 키보드 접근 순서가 논리적으로 처리되어 있다.</li>
<li>jQuery 사용.</li>
</ul>
<p style="padding: 1em; border: 1px dotted rgb(204, 204, 204); background: none repeat scroll 0% 0% rgb(248, 248, 248); text-align: center;">이 밖에 더 많은 예제들이 <a title="Open User Interface Framework" href="http://naradesign.net/ouif/">OUIF</a>&nbsp;|&nbsp;<a href="http://naradesign.net/xeui/">XEUI</a>&nbsp;페이지에 링크되어 있습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2010/03/11/1216/feed/</wfw:commentRss>
		<slash:comments>62</slash:comments>
		</item>
		<item>
		<title>CSS Vertical Navigation Bar.</title>
		<link>http://naradesign.net/wp/2010/03/10/1212/</link>
		<comments>http://naradesign.net/wp/2010/03/10/1212/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 13:15:47 +0000</pubDate>
		<dc:creator>정찬명</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[웹 디자인]]></category>
		<category><![CDATA[웹 접근성]]></category>
		<category><![CDATA[웹 표준]]></category>
		<category><![CDATA[자바스크립트]]></category>
		<category><![CDATA[CSS Navigation Bar]]></category>
		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://naradesign.net/wp/2010/03/10/1212/</guid>
		<description><![CDATA[얼마 전 공유했던 &#8216;CSS Navigation Bar&#8216;는 &#8216;수평+서브메뉴 드롭다운&#8217; 네비게이션 이었는데요. 오늘 공유하는 것은 &#8216;수직+서브메뉴 드롭다운&#8217; 네비게이션 입니다. 수평 메뉴보다 수직 메뉴가 모든 면(HTML/CSS/JS)에서 코드가 더 간결하고 만들기도 쉽네요. 예제를 새 창에서 보기 특징 중첩 목록(ul&#62;li&#62;ul&#62;li) 구조로 마크업 했습니다. 키보드만으로도 조작이 가능하고 키보드의 접근 순서는 논리적으로 처리되어 있습니다. 서브메뉴 토글에 jQuery의 .slideDown() 및 .slideUp() 효과를 사용 [...]]]></description>
			<content:encoded><![CDATA[<p>얼마 전 공유했던 &#8216;<a target="_self" href="http://naradesign.net/wp/2010/02/11/1185/">CSS Navigation Bar</a>&#8216;는 <b>&#8216;수평+서브메뉴 드롭다운&#8217;</b> 네비게이션 이었는데요. 오늘 공유하는 것은 <b>&#8216;수직+서브메뉴 드롭다운&#8217;</b> 네비게이션 입니다. 수평 메뉴보다 수직 메뉴가 모든 면(HTML/CSS/JS)에서 코드가 더 간결하고 만들기도 쉽네요.</p>
<div class="iframe" style="display: block;"><iframe frameborder="0" width="100%" style="display: block; height: 331px;" src="http://naradesign.net/ouif/uio/navigation/vertical/bar/xhtml.html" title="예제를 새 창에서 보기"></iframe><span><a target="_blank" href="http://naradesign.net/ouif/uio/navigation/vertical/bar/xhtml.html">예제를 새 창에서 보기</a></span></div>
<h3 id="h1268225323246">특징</h3>
<ul>
<li>중첩 목록(ul&gt;li&gt;ul&gt;li) 구조로 마크업 했습니다.</li>
<li>키보드만으로도 조작이 가능하고 키보드의 접근 순서는 논리적으로 처리되어 있습니다.</li>
<li>서브메뉴 토글에 jQuery의 .slideDown() 및 .slideUp() 효과를 사용 했습니다.</li>
<li>이미지를 한 번 사용 했습니다.</li>
</ul>
<h3 id="h1268225579696">유의사항</h3>
<p>간혹 이런 수직 메뉴의 서브 메뉴 펼침 동작을 <b>onmouseover</b> 이벤트 헨들러로 처리하는 경우가 있는데요. 그런 경우 사용성이나 접근성이 정말 나빠집니다.&nbsp;</p>
<p>사용성이 나빠지는 이유는 아래쪽에 있는 메뉴를 선택하기 위하여 링크 위를 <b>onmouseover</b> 하는 순간 해당 링크의 서브 메뉴가 펼쳐지는데 이는 보통 원치 않는 동작이기 때문입니다.&nbsp;</p>
<p>접근성이 나빠지는 이유는 마우스와 동등하게 키보드가 접근할 수 있도록 <b>onmouseover</b> 헨들러와 <b>onfocus</b> 헨들러를 병행해서 작성하지 않는 경우 입니다. 이런 경우 키보드가 서브 메뉴를 펼칠 수 없기 때문에 키보드 사용자는 서브 메뉴에 접근할 수 없습니다. <b>onmouseover</b> 헨들러를 사용했다면 반드시 <b>onfocus</b> 헨들러를 병행 작성하여 동등한 기능을 처리할 수 있도록 해야 합니다.</p>
<p>따라서 수직 메뉴를 드롭다운 형태로 열고 닫는 오늘의 예제와 같은 경우&nbsp;<b>onmouseover</b> 이벤트 헨들러 사용은 절대적으로 피하는 것이 좋고 <b>onmouseover</b> 이벤트 헨들러 사용은 보편적인 다른 모든 경우에도 최소화 하는 것이 좋습니다.</p>
<p style="padding: 1em; border: 1px dotted rgb(204, 204, 204); background: none repeat scroll 0% 0% rgb(248, 248, 248); text-align: center;">이 밖에 더 많은 예제들이 <a title="Open User Interface Framework" href="http://naradesign.net/ouif/">OUIF</a>&nbsp;|&nbsp;<a href="http://naradesign.net/xeui/">XEUI</a>&nbsp;페이지에 링크되어 있습니다.</p>
]]></content:encoded>
			<wfw:commentRss>http://naradesign.net/wp/2010/03/10/1212/feed/</wfw:commentRss>
		<slash:comments>44</slash:comments>
		</item>
	</channel>
</rss>

