728x90
동적으로 테이블의 tr 생성 및 삭제
<input type="button" value=" 예제보기 " onclick="window.open('http://myhome.naver.com/comganet/source.htm');"> <input type="button" value=" 다운로드 " onclick="document.location.href='http://myhome.naver.com/comganet/test.zip';">

테이블을 동적으로 생성하고 삭제하는 방법은 여러가지가 있지만
전 아래의 예제에서 .createElement()란 메소드로 tr을 생성하고
td를 생성했습니다. 이유는 제일 빠른 Method이므로^^

빠른 Dynamic Script를 작성할려면 [DHTML 속도 향상을 위한 몇 가지 팁]을 참고하세요.

소스는 간단한데 말로 표현할려고 하니까 무척힘이 들군요. ㅡㅡ;;
속성에 대해서 자세히 알고 싶으면해당 속성을클릭하세요

추가 알고리즘

- 1 동적으로 tr과 td를 생성할 테이블을 지정한다.

이건 document.getElementById("지정할 Id"); 라고
해주면 지정해줄수 있습니다.

- 2 테이블의 첫번째 요소를 지정한다..

왜? tr을 추가할려면 시작하는 시작점이 있어야 하므로
아래 소스에서는 lo_table(Local Object Table)의 .childNodes[0]란 Collection을
이용하여 시작점을 잡았습니다.

childNodes Collection 을 간단히 설명하면 자식노드를 지정할때 사용합니다.
table의 자식노드(0)라고 선언하면 table의 제일 첫번째 요소를 알수 있겠죠?

- 3 현재 보고 있는 Document에 새로운 TR Element(구성요소)를 하나 생성.

lo_row = document.createElement("TR")
새로운 Element를 생성해서 lo_row란 변수에 집어넣습니다.

- 4 테이블의 첫번째 구성요소에(lo_tbody) 자식노드(lo_row)를 추가합니다.

즉 테이블에 createElement하여 생성한 TR을 lo_tbody에 추가 하는거죠
lo_tbody.appendChild(lo_row);

- 5 3번과 4번의 방법과 동일하게 td를 생성해서
lo_row(즉 생성한 TR에) appendChild하여 TD를 생성함


lo_cell.innerHTML innerHTML을 잘알죠? 해당객체에 HTML을 추가하는거 이건 따로
설명하지 않겠습니다.

그리고 Sever단에서 File Control(input type=file)을 처리하기 위해서 Unique한 이름을
주었습니다. lo_table.rows.length;를 이용하여 전체 로우수(즉 TR 개수)를 구하고 파일태그의
이름은 file_(TR갯수 + 1)하여 구분할수 있게 주었습니다.

그리고 form의 Elements중 hid_count란 Hidden Control에 전송할 파일 컨트롤 개수를
지정해주었습니다.
만약 php로 Server Script 를 작성한다면 아래와 유사한 형태가 되겠죠?

for($i=1; $i <= intval($hid_count); $i++)
{
if($_POST["file_$i"])
{
// 파일 업로드 처리
}
}

---------------------------------------------------------------------
삭제 알고리즘

삭제도 추가와 동일하게 삭제할 테이블을 지정합니다.
그리고 lo_table.deleteRow(li_row_index);

지정한 테이블에서 deleteRow하면 해당 Row(즉 TR)을 삭제할수 있습니다.
deleteRow를 사용할때는 삭제할 row의 인덱스 번호를 지정해주어야합니다.
만약 테이블에 TR이 세개있다면 rows.length는 3이 되겠죠?
그때 가장 마지막 tr을 삭제할려면 lo_table.deleteRow(3)하면 될까요?
땡~~~ 안됩니다. 인덱스는 0부터 시작하므로 전체 TR길이 -1 하여 마지막
TR을 삭제할수 있는 거죠

소스보면 IF문이 있는데 li_row_index가 0보다 크거가 같을때 즉 TR이
존재할때만 삭제를 시켜주어야 되겠죠..

휴~~~ 설명이 길었군요. 저도 정리하는 기분으로 상세히
적어보았습니다. 제가 글솜씨가 없어서 설명을 어렵게 한것같아 걱정이 되는군요.

제가 만든 소스 참고하시구요. MSDN도움말을 자세히 읽어보면 이해할수 있을꺼에요.

그럼이만

<script language="javascript">
/*
' ------------------------------------------------------------------
' Function    : f_add_file()
' Description : tr을 하나생성하고 첨부파일을 추가한다.
' Argument    :
' Return      :
' ------------------------------------------------------------------
*/
function f_add_file()
{
   var lo_table = document.getElementById("tbl_attach"); // 테이블지정
   var li_rows  = lo_table.rows.length; // 테이블 row 개수(Tr의 개수
   var lo_tbody = lo_table.childNodes[0]; // table의 첫번째 차일드 즉 tbody를 지정한다.
   var lo_row,lo_cell;

   lo_row = document.createElement("TR"); // Tr을 하나 생성한다.
   lo_tbody.appendChild(lo_row); // tbody에 자식노드를 하나 추가한다.
   lo_cell = document.createElement("TD"); // Td를 생성한다.
   lo_row.appendChild(lo_cell); // Tr에 td를 하나 추가한다.
   lo_cell.innerHTML = "<input type=\"file\" name=\"file_" + (li_rows+1) + "\">"; // 고유이름지정
   
   // 몇개의 폼을 전송하는지 카운트를 넣어준다.
   frm_upload.hid_count.value = li_rows+1;
}

/*
' ------------------------------------------------------------------
' Function    : f_add_file()
' Description : 테이블의 row를 삭제한다. tr이 하나도 존재하지 않으면
'               삭제하지 않는다.
' Argument    :
' Return      :
' ------------------------------------------------------------------
*/
function f_del_file()
{
   var lo_table = document.getElementById("tbl_attach"); // 테이블지정
   var li_rows  = lo_table.rows.length; // 테이블 row 개수(Tr의 개수)
   var li_row_index = li_rows -1; // 테이블 row 즉 Tr의 고유 인덱스를 지정함

   // tr이 하나도 없을때는 삭제하지 않는다.
   if(li_row_index >= 0)
   {
      lo_table.deleteRow(li_row_index);
   }  
}
</script>

<form name="frm_upload" method="post" enctype="multipart/form-data">
<input type="hidden" name="hid_count">
<table>
   <tr>
      <td valign="top">
         <!-- 추가 삭제버튼 -->
         <img src="btn_add.gif" align="absmiddle" border="0" style="cursor:hand;" onclick="f_del_file();">
         <img src="btn_del.gif" align="absmiddle" border="0" style="cursor:hand;" onclick="f_add_file();">
      </td>
      <td valign="top">
         <!-- 첨부파일 추가공간 -->
         <table id="tbl_attach">
         </table>
      </td>
   </tr>
</table>
</form>
728x90

'Information' 카테고리의 다른 글

세로식 배열 테이블 메뉴  (0) 2007.03.04
접근할 수 있는 객체를 확인하는 스크립트  (0) 2007.03.03
iframe 자동 크기지정  (1) 2007.03.03

+ Recent posts