1. 동적으로 테이블에 행 추가하기
2. 동적으로 테이블에 행 삭제하기
3. 동적으로 엘리먼트에 이벤트 할당하기
4. 이벤트 핸들러에서 event.srcElement 를 통해서 원본 엘리먼트 가져오기등
* 업데이트 : 2009-07-08
TR 과 TD 추가시 TBODY 를 사용하지 말고 TABLE 의 메소드를 호출하여 구현하는 것이 더 좋다. 그렇게 하면, 코드도 깔끔해지면서 TBODY 를 사용하면서 나타나는 여러가지 문제를 사전에 예방할 수 있다.
아래 소스는 appendChild 를 따로 호출할 필요가 없다.
function AppendTrAndTd() { var newRow = tbl.insertRow(); var newTD = newRow.insertCell(); } |
아래 소스는 모두 insertRow 와 insertCell 로 변경해야 한다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title></title> </head> <script type="text/javascript" language="javascript"> function NewRow() { var tBody = tbl.getElementsByTagName("tbody")[0]; var row = MakeNewRow(); tBody.appendChild(row); } function InsertUpper() { InsertRow (event.srcElement, true); } function InsertLower() { InsertRow(event.srcElement, false); } function InsertRow(obj, ToUpper) { var TargetRow; TargetRow = obj.parentNode; while(TargetRow != null) { if( TargetRow.nodeName == "TR" ) { break; } TargetRow = TargetRow.parentNode; if(TargetRow == document) { TargetRow = null; break; } } if(TargetRow == null) return; var newRow = MakeNewRow(); var tBody = tbl.getElementsByTagName("tbody")[0]; if (ToUpper == true) { tBody.insertBefore(newRow, TargetRow); } else { TargetRow = TargetRow.nextSibling; if(TargetRow != null) { tBody.insertBefore(newRow, TargetRow); } else { tBody.appendChild(newRow); } } } function MakeNewRow() { // check box var newRow = document.createElement("tr"); var newTd = document.createElement("td"); var newInput = document.createElement("input"); newInput.setAttribute("type", "checkbox") newTd.appendChild(newInput); newRow.appendChild(newTd); // Description newTd = document.createElement("td"); var newTextArea = document.createElement("textarea"); newTextArea.setAttribute("cols", "50"); newTextArea.setAttribute("rows", "3"); newTd.appendChild(newTextArea); newRow.appendChild(newTd); // Expected Result newTd = document.createElement("td"); var newTextArea = document.createElement("textarea"); newTextArea.setAttribute("cols", "50"); newTextArea.setAttribute("rows", "3"); newTd.appendChild(newTextArea); newRow.appendChild(newTd); // buttons newTd = document.createElement("td"); newInput = document.createElement("input"); newInput.setAttribute("type", "button"); newInput.setAttribute("value", "△"); newInput.attachEvent("onclick", InsertUpper); newTd.appendChild(newInput); var newBr = document.createElement("br"); newTd.appendChild(newBr); newInput = document.createElement("input"); newInput.setAttribute("type", "button") newInput.setAttribute("value", "▽") newInput.attachEvent("onclick", InsertLower); newTd.appendChild(newInput); newRow.appendChild(newTd); return newRow; } function deleteCheckedRow() { var inputList = document.getElementsByTagName("input"); var tBody = tbl.getElementsByTagName("tbody")[0]; var checkItem; for(var i=inputList.length-1; i >= 0; i--) { checkItem = inputList.item(i); if( checkItem.checked == true) { var nodeParent = checkItem.parentNode.parentNode; if(nodeParent.nodeName == "TR") { tBody.removeChild(nodeParent); } } } } </script> <body> <!--<input type="button" value="Java : New Step" onclick="javascript:MakeNewRow()" /> <p></p> <input type="button" value="VBScript : New Step" onclick="vbscript:MakeNewRow()" /> <p></p>--> <input type="button" value="Delete checked items" onclick="javascript:deleteCheckedRow()" /> <input type="button" value="New Row" onclick="javascript:NewRow()" /> <p></p> <table id="tbl" border="1" > <tr> <th></th> <th>Description</th> <th>Expected Result</th> <th></th> </tr> <tr> <td><input type="checkbox" /></td> <td><textarea cols="50" rows="3"></textarea></td> <td><textarea cols="50" rows="3"></textarea></td> <td> <input type="button" value="△" onclick="javascript:InsertRow(this, true)" /><br /> <input type="button" value="▽" onclick="javascript:InsertRow(this, false)" /> </td> </tr> </table> </body> </html> |