티스토리 뷰
Q) 현재 주소값 중 ID 와 CATEGORY 값을 체크하여, 만약 두 값 모두 있을 경우 해당 메뉴만 굵게, ID 값만 있을 경우 ID 에 해당하는 메뉴들 모두 굵게, 없을 경우 메뉴 전체를 굵게 처리를 하려면?
테스트를 위한 설정은 아래와 같습니다.
주소 : /localhost/?id=A&category=1
메뉴 :
<a href="/localhost/?id=A&category=1">메뉴A-1</a>
<a href="/localhost/?id=A&category=2">메뉴A-2</a>
<a href="/localhost/?id=A&category=3">메뉴A-3</a>
<a href="/localhost/?id=B&category=1">메뉴B-1</a>
<a href="/localhost/?id=B&category=2">메뉴B-2</a>
A) 이 경우 메뉴 A-1 만 굵게 되어야 하고, category 값이 없다면 id=A 에 해당하는 메뉴 모두 굵게 처리 하는 경우입니다.
현재 주소의 값중 id, category 가 어떤게 있는지 모르고 해당 값이 있냐 없냐에 따라 또 처리가 달라지기 때문에 복잡해 보이는 것이죠. 이게 복잡해 보이긴 해도 사실 간단히 해보면 단순합니다.
해결은, ① 현재 주소 값을 체크해서 ID 와 CATEGORY 값을 찾고, ② 이를 다시 정규식으로 만들어 ③ 각 메뉴 주소를 체크하면 됩니다.
우선 현재 주소 중에서 필요한 값을 체크하는 루틴을 짜보도록 하죠.
URL 중에서 각 값을 찾는 것은 split() 을 써서 분석해도 되겠지만, 그러면 코드가 너무 길어지기에 정규식을 이용해서 찾습니다.
/(id|category)=[\w]+/i
이를 이용해서 ID 와 CATEGORY 값을 찾고, 이를 바탕으로 메뉴 주소 체크를 위한 정규식을 만드는 루틴입니다.
var url = location.href,// 현재 URL 정보 find = '*',// ID, CATEGORY 값이 없을 경우 모든 메뉴를 지칭하기 위해 vars; if ((vars = url.match(/(id|category)=[\w]+/gi))) { // 만들어진 정규식 예: /[\?&](id=A|category=1)/gi find = new RegExp('[\\?&]('+ vars.join('|') +')', 'gi'); }
나머지는 각 메뉴들의 주소를 체크하며 맞으면 굵게 처리하는 것만 남았습니다.
jQuery 를 안쓸 경우 for 를 이용해서 처리하면 됩니다. 이때 객체를 찾을 때는 부모 객체를 찾고 메뉴들을 <A> 테그 이름으로 찾으면 됩니다.
var menus = document.getElementById('menu_items').getElementsByTagName('A'); for (var n = 0, c = menus.length; n < c; n++) { bold = false; if (find === '*') bold = true;// ID, CATEGORY 값이 없을 경우 모든 메뉴를 굵게 else if ((temp = menus[n].href.match(find))) {// 각 메뉴의 주소(href) 값을 체크 // 현재 URL 에서 매칭된 ID, CATEGORY 갯수와 메뉴 주소에서 매칭된 값의 갯수가 같은지 확인 // CATEGORY 는 같은 값이 여러개일 수 있으므로, ID 값을 체크하기 위해 갯수를 확인합니다. if (temp.length === vars.length) bold = true; } if (bold === true) menus[n].style.fontWeight = 'bold'; }
jQuery 를 이용할때도 위 루틴은 같습니다.
$.each( $('#menu_item > A'), function(idx, el) { var bold = false; if (find === '*') bold = true; else if ((temp = el.href.match(find))) { if (temp.length === vars.length) bold = true; } if (bold === true) el.style.fontWeight = 'bold'; } );
코드:
function checkMenu() { var menus = document.getElementById('menu_item').getElementsByTagName('A'), url = location.href, find = '*', vars, temp; if ((vars = url.match(/(id|category)=[\w]+/gi))) { find = new RegExp('[\\?&]('+ vars.join('|') +')', 'gi'); } for (var n = 0, c = menus.length; n < c; n++) { bold = false; if (find === '*') bold = true; else if ((temp = menus[n].href.match(find))) { if (temp.length === vars.length) bold = true; } if (bold === true) menus[n].style.fontWeight = 'bold'; } return true; }
예제:
/?id=A/?id=A&category=2
/?id=B&category=1 등등...
'프로그래밍 > JavaScript' 카테고리의 다른 글
[JS] 정규식으로 URL 추출하기 v0.2 - URL 추출 및 분석/검사 (8) | 2010.03.12 |
---|---|
[JS] jQuery, 속성 셀렉터 표현식(Attribute Selector Expressions) (0) | 2010.02.12 |
[JS] 정규식으로 URL 추출하기 (0) | 2009.04.10 |
[JS] 메모리 누수 막기 팁! - Finally (1) | 2008.10.21 |
[JS] escape(), encodeURI(), encodeURIComponent() 차이 (0) | 2008.07.23 |
PNG를 사용하여 자바크스립트 소스 대폭 압축하기 (0) | 2008.07.05 |
[JS] IE 전용 DOM 확장 메소드 applyElement() 를 다른 브라우저에서도 사용하기 - 객체 바깥에 새로운 객체 추가 (0) | 2008.06.12 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- flash
- 팁
- 유틸리티
- 해킹
- 게임
- 이브 온라인
- Utilities
- 스크린샷
- 팁&정보
- 정규식
- 액션스크립트3
- ActionScript3.0
- 스타크래프트2
- 프로그래밍
- 세비지2
- It
- game
- 플래시
- 보안
- php
- 블레이드앤소울
- 정규표현식
- JavaScript
- 정보
- dust 514
- PCRE
- eve online
- as3
- 자바스크립트
- 보안정보
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함