<html>
<head>
<title>Dynamic Table</title>
<style type="text/css">
.repeat {
}
.repeat-prototype {
display: none;
}
.repeat-item {
}
.repeat-item fieldset{
padding:3px;
margin:3px;
}
.repeat-index {
background: #BCD884;
}
.repeat-selector {
float: left;
}
.selector-prototype {
display: none;
}
.compact-repeat .repeat-item td{
padding:3px;
}
</style>
<script language="javascript">
function addRow(){
var target = document.getElementById("propotype-tt");
var prototype = target.cloneNode(true);
prototype.className="repeat-item";
var repeatElement = target.parentNode;
var repeatItems = repeatElement.childNodes;
var referenceNode = repeatItems[repeatItems.length -1];
repeatElement.insertBefore(prototype,referenceNode);
}
function setRepeatIndex(e) {
var target;
var parentElement;
if (window.event) {
// stop event propagation (for IE)
window.event.cancelBubble = true;
target = window.event.srcElement;
}
else {
e.cancelBubble = true;
target = e.target;
}
// lookup repeat item
while (target && ! _hasClass(target, "repeat-item")) {
target= target.parentNode;
}
// maybe the user clicked on a whitespace node between to items *or*
// on an already selected item, so there is no item to select
if ((!target) || _hasClass(target, "repeat-index")) {
return;
}
target.setAttribute("selected", "true");
var currentPosition= 0;
var repeatItems = target.parentNode.childNodes;
for (var index = 0; index < repeatItems.length; index++) {
if (repeatItems[index].nodeType == 1 && _hasClass(repeatItems[index], "repeat-item")) {
currentPosition++;
if (repeatItems[index].getAttribute("selected") == "true") {
repeatItems[index].removeAttribute("selected");
mytable_index = currentPosition;
}
_removeClass(repeatItems[index], "repeat-index")
}
}
_addClass(target,"repeat-index");
}
function _hasClass (element, clazz) {
if (!element || !element.className) {
return false;
}
// surround classes with spaces to guarantee non-ambigous lookups
if ((" " + element.className + " ").indexOf(" " + clazz + " ") == -1) {
return false;
}
return true;
}
function _addClass (element, clazz) {
if (!element || !element.className) {
return false;
}
// surround classes with spaces to guarantee non-ambigous lookups
if ((" " + element.className + " ").indexOf(" " + clazz + " ") == -1) {
element.className = element.className + " " + clazz;
return true;
}
return false;
}
function _removeClass (element, clazz) {
if (!element || !element.className) {
return false;
}
// surround classes with spaces to guarantee non-ambigous lookups
if ((" " + element.className + " ").indexOf(" " + clazz + " ") > -1) {
var classList = (" " + element.className + " ").replace(new RegExp(" " + clazz + " "), " ");
element.className = classList.slice(1, classList.length - 1);
return true;
}
return false;
}
/*
Move a table row down, rotating to the top
if it's the last row.
*/
function moveRowDown()
{
if(mytable_index==null){
return;
}
var prototype = document.getElementById("propotype-tt");
var repeatElement = prototype.parentNode;
var repeatItems = repeatElement.childNodes;
var fromElement;
var toElement;
var currentPosition=0;
for (var index = 0; index < repeatItems.length; index++) {
if (repeatItems[index].nodeType == 1 && _hasClass(repeatItems[index], "repeat-item")) {
currentPosition++;
if (currentPosition==mytable_index) {
fromElement = repeatItems[index];
toElement = repeatItems[index+2];
break;
}
}
}
var clonedElement = fromElement.cloneNode(true);
var tempElement = repeatElement.removeChild(fromElement);
repeatElement.insertBefore(clonedElement,toElement);
mytable_index++;
}
/*
Move a table row up, rotating to the bottom
if it's the first row.
*/
function moveRowUp()
{
if(mytable_index==null){
return;
}
var prototype = document.getElementById("propotype-tt");
var repeatElement = prototype.parentNode;
var repeatItems = repeatElement.childNodes;
var fromElement;
var toElement;
var currentPosition=0;
for (var index = 0; index < repeatItems.length; index++) {
if (repeatItems[index].nodeType == 1 && _hasClass(repeatItems[index], "repeat-item")) {
currentPosition++;
if (currentPosition==mytable_index) {
fromElement = repeatItems[index];
toElement = repeatItems[index-1];
break;
}
}
}
var clonedElement = fromElement.cloneNode(true);
var tempElement = repeatElement.removeChild(fromElement);
repeatElement.insertBefore(clonedElement,toElement);
mytable_index--;
}
</script>
</head>
<body>
<h1>Dynamic Table</h1>
<form method="get" action="req.jsp">
<input type="button" name="btnAdd" value="Add" onClick="javascript:addRow()">
<input type="button" name="btnDownn" value="Down" onClick="javascript:moveRowDown()">
<input type="button" name="btnUp" value="Up" onClick="javascript:moveRowUp()">
<input type="submit" name="btnSave" value="Save">
<table id="mytable">
<script>
document.getElementById('mytable').onclick = setRepeatIndex;
var mytable_index;
</script>
<tr>
<td>Name</td>
<td>Age</td>
<td>Address</td>
<td>Delete</td>
</tr>
<tr id="propotype-tt" class="repeat-prototype">
<td><input type="text" name="name"></td>
<td><input type="text" name="age"></td>
<td><input type="text" name="address"></td>
<td><input type="button" value="Remove" style="font-size: 10px"
onClick="
this.parentNode.parentNode.parentNode.removeChild(this.parentNode.parentNode);
"></td>
</tr>
</table>
</form>
</body>
</html>
注意:
用JavaScript實現對Table的操作的時候,使用insertBefore方法的時候需要注意一點。如果直接在對Table 對象用insertBefore(TRObject, referenceObject)時候是不能成功的,因為TR是在TBODY的子物件,不是TABLE的子物件。