본문 바로가기

Local Oriented/jQuery

jQuery Ajax, FAQ 를 웹에디터로 관리할때 아코디언 목록이 1건만 표시될 때의 처리 (방법론)


FAQ 를 구성할 때..
평소에는 제목만 보이다가, 제목을 클릭하면 상세 내용이 제목 밑으로 펼쳐지는 방식의 아코디온 FAQ 가 필요할 때가 있죠.
그런데, FAQ 내용을 웹에디터를 사용해서 관리한다면 간혹 곤란한 경우가 발생하기도 합니다.

수작업으로 만들어 낼 때는 FAQ 목록에 html 태그가 들어가지 않는데,
웹에디터를 사용해서 FAQ 를 관리하면 펼쳐지는 본문 내용 부분에 <HTML> 태그가 들러붙죠.
이때 FAQ 목록의 첫번째는 제대로 나오는데 그 다음부터 나오지 않을 수도 있어요.
FAQ 를 구성하는 구조를 어떻게 했느냐에 따라서 발생하기도 발생하지 않기도 하는 현상입니다만..
<div style="display:none">본문내용</div> 로 해 두었다가 클릭했을때 나오게 하거나,
<div style="display:none" id="..."></div> 를 두고
<textarea style="display:none">본문내용</textarea> 에 담았다가 div 에 표시되게 하는 방법이 먹히지 않을 때가 있어요.

어쨌든.. 이곳에서는 이런 경우의 해결 방법론을 설명합니다. 방법은 간단합니다. Ajax 를 이용하는 것이죠.
FAQ 목록을 만들 때는 제목과 순번, 조회수 등의 기본 내용만 주르륵 표시되게 하고,
제목을 클릭했을때 펼쳐질 수 있도록 블럭을 잡은 다음..
제목을 클릭하면 Ajax 로 본문 내용을 가져와서 숨겨졌던 블럭에 담아서 보이게 하는 것입니다.

Ajax 호출시 Cache 를 사용하거나 사용하지 않을 수도 있는데..
본문 내용이 동적으로 갱신되는 것이라면 No-Cache 로 가야 겠지요.
그런데, Cache 로 가더라도 서버에서 관련 내용을 가져오니까 네트워크 리소스를 사용하잖아요.
그래서 본문 내용이 표시되는 블럭에 html 요소가 있으면 Ajax 없이 보여주기만 하고,
본문 내용이 없을 때에만 Ajax 로 해당 본문 내용을 가져오게 하는 것도 좋은 방법입니다.

FAQ 목록이 펼쳐질 때 맨 위에 있는 항목은 본문이 펼쳐져 있으면 좋겠구요.
그런데, 특정 FAQ 항목이 기본으로 펼쳐지게 하는 방법도 고민해 봐야겠지요.


아래 자바스크립트는, 화면에서 목록 list1.jsp 와 view1.jsp 를 jQuery Ajax 로 호출하는 방식입니다.
document.ready 부분에 openUri 로 목록을 가져오면.. 전체 화면이 먼저 뜨고 목록이 나중에 뜨는 방식이 됩니다.
사람들의 요구는 FAQ에 있긴 하지만, FAQ 가 뜨는 동안 눈요기 거리도 필요해요. 잡스 스타일이고 스마트 기기 스타일.

 var f = document.form1; // 여러번 사용할 것을 전역으로 잡아 봤습니다. jQuery 남용 금지. ^^;; 여기선 사용 못했네요.
 $(document).ready(function(){
  openUri(); // 목록을 ajax 로 호출. 본 화면의 다른 부분들이 로딩된 이후에 목록을 가져와 표시
 });
 function openUri(){ openSimpleUri('idList1','list1.jsp','seq=','openFirst'); } // openSimpleUri 는 하단에 기술
 function openFirst(){ openFaqView(''); } // 특정 항목이 펼쳐지게 하려면, 본 화면 호출시 받은 파라미터를 이곳에 기술
 function openFaqView(seq){
  var s = $('#id'+seq).html();
  if(s=='') openSimpleUri('id'+seq,'view1.jsp','seq='+seq); // FAQ 본문을 이미 가져왔으면, 필요 이상의 Ajax 호출 자제
  showFaqView(seq);
 }
 function showFaqView(seq){
  $('.faqCont').hide(100); // 모두 닫기
  $('#faqCont'+seq).show(); // 특정 id 열기. 닫을때 Animation 이 들어갔기 때문에 열리는 부분에 넣을 필욘 없음
 }

 function openSimpleUri(id,uri){
  var args = openSimpleUri.arguments; // 추가 파라미터. args[0] id, args[1] uri, args[2] parameter, args[3] callback
  var param;  if(args[2]) param = args[2]; // 파라미터가 필요없으면 그냥 통과
  $.ajax({
   type: 'POST',
   url: uri,
   data: param,
   cache:false,
   success:function(resultText){
    //$('#'+id).html('').html(resultText); // 간혹 이런 코드가 필요할 수도 있어요. 이전 내용이 표시되는 걸 막는 거죠.
    //$('#'+id).hide().html(resultText); // 간혹 이런 코드가 필요할 수도 있어요. 이전 내용이 표시되는 걸 막는 거죠.
    $('#'+id).html(resultText);
    if(args[3]){ try{ eval(args[3]+ '()'); }catch(e){} } // callback 함수가 필요할 때 사용. 오류 예방용 try~catch 사용
   },
   error:function(){
   }
  });
 } /* openSimpleUri */