复制设计HTML的表格行

时间:2018-09-15 14:12:58

标签: javascript html

我希望您单击“创建行”的那一刻,第2行与格式化规则重复:输入,选择..

除了第一列之外,我还希望每次都超过“计数”中的+1。

单击删除行后-我将删除除第1行以外的最后一行!

感谢助手!

这是代码:

<!DOCTYPE html>
<html>
<head>
<style>
table, td {
    border: 1px solid black;
}
</style>
</head>
<body>

<table id="myTable" class="table table-bordered table-hover" style="font-size: 12px; font-family: Arial;">
	  <thead>
		<tr>
		  <th style="text-align: right;">השתתפות / שוברים</th>
<th style="text-align: right;">סכ"ה ימים</th>
<th style="text-align: right;">עד תאריך</th>
<th style="text-align: right;">מתאריך</th>
		  <th style="text-align: right;">שם משפחה</th>
		  <th style="text-align: right;">שם פרטי</th>
		  <th style="text-align: right;">מ.א</th>
		  <th style="text-align: right;">number count</th>
		</tr>
	  </thead>
	  <tbody>
	
			<tr class="warning">
			  <td style="text-align: center;">
			  
			  <select style="font: 12px 'Fira Sans', sans-serif;width: 94px;margin: 0.4rem;text-align-last: right;">
  <option value="volvo">השתתפות</option>
  <option value="saab">שוברים</option>
  
  
</select>
  
			  
			  </td>
			  <td style="text-align: right;"><input type="number" id="fname2" name="firstname" style="font: 12px 'Fira Sans', sans-serif;width: 31px;margin: 0.4rem;text-align-last: center;"></td>
			  <td style="text-align: right;">
<fieldset>
    <div>
        <input type="date" name="trip" style="font: 12px 'Fira Sans', sans-serif;width: 113px;margin: 0.4rem;">
    </div>


</fieldset>
</td>
			  

<td style="text-align: right;">

<fieldset>
    <div>
        <input type="date" name="trip" style="font: 12px 'Fira Sans', sans-serif;width: 113px;margin: 0.4rem;">
    </div>


</fieldset>
</td><td style="text-align: right;">
<input type="text" id="fname2" name="firstname" style="font: 12px 'Fira Sans', sans-serif;width: 55px;margin: 0.4rem;text-align: right;">

</td>
<td style="text-align: right;">
<input type="text" id="fname2" name="firstname" style="font: 12px 'Fira Sans', sans-serif;width: 52px;margin: 0.4rem;text-align: right;">

</td><td id=check style="text-align: right;">
<input type="number" name="firstname" style="font: 12px 'Fira Sans', sans-serif;width: 64px;margin: 0.4rem;text-align-last: center;">
</td>
			  <td style="text-align: center;padding-top: 20px;">1
              </td>
			</tr>	
				  </tbody>
	</table>
<br><br>

<p id="demo" onclick="myCreateFunction()">Create row</p> <br>
<p id="demo" onclick="myDeleteFunction()">Delete row</p>


<script>
function myCreateFunction() {
    var table = document.getElementById("myTable");
    var row = table.insertRow(-1);
    var cell1 = row.insertCell(0);
    var cell2 = row.insertCell(0);
    var cell3 = row.insertCell(0);
    var cell4 = row.insertCell(0);  
    var cell5 = row.insertCell(0); 
    var cell6 = row.insertCell(0); 
    var cell7 = row.insertCell(0); 
    var cell8 = row.insertCell(0);
    cell1.innerHTML =  1;
    cell2.innerHTML = 2;
    cell3.innerHTML = 3;
    cell4.innerHTML = 4;
    cell5.innerHTML = 5;
    cell6.innerHTML = 6;
    cell7.innerHTML = 7;
    cell8.innerHTML = 8;
}

function myDeleteFunction() {
    document.getElementById("myTable").deleteRow(-1);
}


</script>

</body>
</html>

功能下降

2 个答案:

答案 0 :(得分:0)

一种快速简便的解决方案(虽然可能不是长期使用的最佳选择)是拥有一个名为“ depth”的全局变量,在let depth = 0处开始,然后每次添加一行{{1} },如果您仅删除一行depth++;,那么您将永远不会删除已经存在的起始行。

另一种方法,如果是用于较大的项目,则可能具有更大的可伸缩性,它是跟踪数组中的行数,每次添加一行时,删除时if(depth >= 0) arr.push(line);所在的行这不仅使您能够跟踪您所在的行,而且还可以推送有关该行的信息,这些信息可在以后的代码中用于扩展程序。

答案 1 :(得分:0)

您的代码中有一些问题。

  • 首先,HTML ID必须是唯一的。您正在使用多个相同的ID。
  • 某些输入字段具有相同的名称。不一定非要成为问题,但是,许多服务器端脚本语言(例如PHP)只会覆盖多种用法,而只暴露最后一种用法。如果您使用<input name="firstname[]">之类的名称,则PHP会形成数组。
  • HTML5中必须使用非空的<title>My Title</title>标签。

更多

  • 文档应声明用于编码的字符集。
  • 拥有一个<html>属性的lang标签总是一个好主意。
  • 避免内联样式。请改用样式表。
  • onclick这样的内联事件处理程序是过时的。而是应用事件侦听器。
  • 单元格中有语义上毫无意义的<div>元素。
  • 仅包含一个字段的
  • <fieldset>元素在语义上没有意义,尤其是当它们定义两个相关的日期时。在同一个单元格中包含两个日期的字段集可能很有​​意义。如果需要,请使用css轮廓或类似外观来获得视觉效果。

要获取另一行的副本,可以使用cloneNode方法。

行数可以用table.rows.length确定。您可以使用它来填充“数字计数”单元格。

如果由于某些原因确实需要ID,则每个文档必须具有唯一的ID。这意味着,即使在每行中也需要不同的ID。复制时,您必须以某种方式更改ID,例如附加行号。

我添加了一些演示<label>,只是为了说明如何更改必要的ID和标签的for属性,该属性连接到相应表单字段的ID。当然,带有标题的列中的标签没有任何意义,仅用于教学目的。

复制第一行可能是一个不好的选择,因为输入的值也将被复制。更常见的是复制最后输入的行。但是,还有另一种选择。您可以使用干净的模板。 <template>元素不是由浏览器呈现的,因此它们不是DOM的一部分。您可以通过content属性获得类似DOM的访问。

document.addEventListener('DOMContentLoaded', evt =>
{
  const
    minRowsPreserved = 2,
    byId             = document.getElementById.bind(document)
  ;

  function myCreateFunction()
  {
    let
      table    = byId("myTable"),
      rowCount = table.rows.length,
      row      = byId('tpl-row').content.firstElementChild.cloneNode(true)
    ;

    // In case you need IDs: Append the row number seperated by '-' to each ID since IDs must be unique.
    row.querySelectorAll('[id]').forEach(e => e.id += '-' + rowCount);
    // Similar for clickable labels depending on IDs, however, there is no shortcut for the `for` attribute.
    row.querySelectorAll('label[for]').forEach(e => e.setAttribute('for', e.getAttribute('for') + '-' + rowCount));
    // Content of the last cell becomes the row number.
    row.cells[row.cells.length-1].textContent = rowCount;
    // now we append the row to the table body after id-conflicts should be resolved
    table.tBodies[0].appendChild(row);
  }

  function myDeleteFunction() {
    let table = byId("myTable");
    if(minRowsPreserved < table.rows.length)
      table.deleteRow(-1);
  }

  byId('btn-create').addEventListener('click', myCreateFunction);
  byId('btn-delete').addEventListener('click', myDeleteFunction);

  // add a first row on start
  myCreateFunction();
})
#myTable
{
  font-size    : 12px;
  font-family  : Arial;
  border       : 1px solid black;
  text-align   : center;
  margin-bottom: 2em;
}

#myTable td
{
  border : 1px solid black;
  padding: 0.4rem;
}

#myTable th
{
  text-align: right;
}

#myTable input,
#myTable select
{
  font  : 12px 'Fira Sans', sans-serif;
}

#myTable input[type="text"]   { text-align     : right;  }
#myTable input[type="number"] { text-align-last: center; }
#myTable select               { text-align-last: right;  }

#myTable input[type="date"]   { width          : 113px;  }
.num1       input             { width          : 31px;   }
.first-name input             { width          : 55px;   }
.last-name  input             { width          : 52px;   }
<!DOCTYPE html>
<html lang="he">
<head>
  <meta charset="UTF-8">
  <title>dynamic table form</title>

<body>

  <form method="post">

    <table id="myTable" class="table table-bordered table-hover">

      <thead>
        <tr>
          <th>השתתפות / שוברים</th>
          <th>סכ"ה ימים</th>
          <th>עד תאריך</th>
          <th>מתאריך</th>
          <th>שם משפחה</th>
          <th>שם פרטי</th>
          <th>מ.א</th>
          <th>number count</th>
        </tr>
      </thead>

      <tbody>
      </tbody>

    </table>
  </form>

  <button id="btn-create">Create row</button>
  <button id="btn-delete">Delete row</button>

  <template id="tpl-row">
    <tr class="warning">
      <td class="car">
        <select id="car" name="car[]" style="width: 94px; text-align-last: right;">
          <option value="volvo">השתתפות</option>
          <option value="saab">שוברים</option>
        </select>
      </td>
      <td class="num1"      >  <input type="number" id="num1"       name="num1[]"      >  </td>
      <td class="trip-start">  <input type="date"   id="trip-start" name="tripstart[]" >  </td>
      <td class="trip-end"  >  <input type="date"   id="trip-end"   name="tripend[]"   >  </td>
      <td class="first-name">  <input type="text"   id="first-name" name="firstname[]" >  </td>
      <td class="last-name" >  <input type="text"   id="last-name"  name="lastname[]"  >  </td>
      <td class="check">
        <label for="num2">demo label:</label>
        <input type="number" id="num2" name="num2[]" style="width: 64px; text-align-last: center;">
      </td>
      <td></td>
    </tr>
  </template>