【问题标题】:Can't seem to use element IDs generated dynamically似乎无法使用动态生成的元素 ID
【发布时间】:2017-12-19 03:50:15
【问题描述】:

我想创建一个分层薪酬计算器实用程序。

在我的 Javascript 文件中,我从文本输入字段中的名称列表中动态地将行和字段添加到使用 HTML 创建的表中。这些行由一个名称标签列、一个用于输入总收入的文本输入列和一个计算的薪酬输出列组成。

我希望它在我更改总收入列中的文本输入时自动更新计算的工资列。尽管我可以将元素 ID 跟踪到 calculatePay 函数,但我似乎无法使用或设置它们的属性。我觉得它们也不是独一无二的。有什么想法吗?

顺便说一句,您必须立即单击更新按钮才能运行 Javascript。

编辑 - 根据建议进行了一些更改。似乎仍然无法将变量传递给 calculatePay 函数,然后简单地将它们转过来并将它们吐回我表的 Pay 列中。

编辑 - 已解决。问题是关闭,起初我不明白,但这里是瘦的。为了隔离变量的范围,这样它们就不会在每次循环出现时都被重新编写,它们需要在每次循环迭代时重新创建的函数中声明(因为 Javascript 的作用域是函数而不是代码块)。注意事项 - 如果您只是在循环中间声明一个无名函数,这将不起作用。您必须将其返回给变量(即var buildElement = function(){Yada Yada}();)。另外,在函数后面加上()来执行。

Javascript

function buildTable(){
  var artists = document.getElementById("artlist").value;
  var names = artists.split(",");
  var len = names.length;
  var ptable = document.getElementById("payTable");
  var rowLength = ptable.rows.length;
  for (i=0 ; i < len; i++){
   var buildElement = function(){
     var row = ptable.insertRow(rowLength);
     var nameCell = row.insertCell(0);
     var grossCell = row.insertCell(1);
     var payCell = row.insertCell(2);
     var grossText = document.createElement("input");
     grossText.type = "type";
     grossText.name = "gtext[]";
     grossText.id = "gross" + names[i];
     payCell.id = "pay" + names[i];
     grossText.onchange = function(){calculatePay(payCell.id, grossText.id);};
     grossCell.appendChild(grossText);
     nameCell.innerHTML = names[i];
    }();
  }
}
function resetTable(){
     var ptable = document.getElementById("payTable");
     var rowLength = ptable.rows.length;
     if (rowLength>2){

     for (p=rowLength; p>2; p--){
      ptable.deleteRow(2);
}
}
  buildTable();
}
    function calculatePay(target, gross) {
document.getElementById(target).innerHTML = document.getElementById(gross).value;
        }

HTML

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title></title>
    <script src="./js/script.js"></script>
    <link rel="stylesheet" href="./css/style.css" />
  </head>
  <body>
    <div>
      <table id="payTable">
        <tr>
        <th colspan=3 class="hdr">
        Calculator
        </th>
        </tr>
        <tr>
        <th class="hdr">
        Name
        </th>
        <th class="hdr">
        Gross
        </th>
        <th class="hdr">
        Pay
        </th>
        </tr>
      </table>
    </div>

    <div>
      <table>
        <tr>
        <th colspan=3 class="hdr">
        SETTINGS
        </th>
        </tr>
        <tr>
        <th colspan=3 class="hdr">
        Breakpoints
        </th>
        </tr>
        <tr>
        <td>Break 1 at $
        <input type="text" name="break1"   id="break1" value="300"/>
        </td>
        <td>
        </td>
        <td>Break 2 at $
        <input type="text" name="break2" id="break2" value="900"/>
        </td>
        </tr>
        <tr>
        <th colspan=3 class="hdr">
        Percentage levels
        </th>
        </tr>
        <tr>
        <td>
        Below break 1:
        <input type="text" size="4" name="per1" id="per1" value="50"/>%
        </td>
        <td>
        Between breaks 1 and 2:
        <input type="text" size="4" name="per2" id="per2" value="60"/>%
        </td>
        <td>
        Over break 2:
        <input type="text" size="4" name="per3" id="per3" value="70"/>%
        </td>
        </tr>
        <tr>
        <td>
        Artists:
        <input type="text" name="artlist" id="artlist" value="Brian,Eric,Christie,Cynthia,Shawn"/>
        </td>
        <td>
        </td>
        <td class="hdr">
        <button onclick="resetTable()">Update</button>
        </td>
      </tr>

    </div>
  </body>
</html>

【问题讨论】:

  • 提示:请使用段落。它使事情更容易阅读。
  • 能否发布您的 HTML,以便我可以测试上面的 sn-p。
  • 投票关闭 - 请参阅帮助:包含足够的代码以允许其他人重现该问题。如需帮助,请阅读如何创建最小、完整、有效的示例。没有一个可行的例子就做不了什么。
  • @MelanciaUK 请再看看。我做了一些修改。
  • 不要在问题帖子中保留您的解决方案...我建议您使用您获得的解决方案回答您自己的问题,以便其他人更容易看到它:)

标签: javascript html dynamic html-table parameter-passing


【解决方案1】:

问题是关闭,起初我不明白,但这里是瘦的。为了隔离变量的范围,这样它们就不会在每次循环出现时都被重写,它们需要在每次循环迭代时重新创建的函数中声明(因为 javascript 作用域是函数而不是代码块)。注意事项 - 如果您只是在循环中间声明一个无名函数,这将不起作用。您必须将其返回给变量(即“var buildElement = function(){Yada Yada}();”)。另外,在函数后面加上()来执行吧。

Javascript

function buildTable(){
  var artists = document.getElementById("artlist").value;
  var names = artists.split(",");
  var len = names.length;
  var ptable = document.getElementById("payTable");
  var rowLength = ptable.rows.length;
  for (i=0 ; i < len; i++){
   var buildElement = function(){
     var row = ptable.insertRow(rowLength);
     var nameCell = row.insertCell(0);
     var grossCell = row.insertCell(1);
     var payCell = row.insertCell(2);
     var grossText = document.createElement("input");
     grossText.type = "type";
     grossText.name = "gtext[]";
     grossText.id = "gross" + names[i];
     payCell.id = "pay" + names[i];
     grossText.onchange = function(){calculatePay(payCell.id, grossText.id);};
     grossCell.appendChild(grossText);
     nameCell.innerHTML = names[i];
    }();
  }
}
function resetTable(){
     var ptable = document.getElementById("payTable");
     var rowLength = ptable.rows.length;
     if (rowLength>2){

     for (p=rowLength; p>2; p--){
      ptable.deleteRow(2);
}
}
  buildTable();
}
    function calculatePay(target, gross) {
document.getElementById(target).innerHTML = document.getElementById(gross).value;
        }

HTML

  <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<html>
  <head>
    <title></title>
    <script src="./js/script.js"></script>
    <link rel="stylesheet" href="./css/style.css" />
  </head>
  <body>
    <div>
      <table id="payTable">
        <tr>
        <th colspan=3 class="hdr">
        Calculator
        </th>
        </tr>
        <tr>
        <th class="hdr">
        Name
        </th>
        <th class="hdr">
        Gross
        </th>
        <th class="hdr">
        Pay
        </th>
        </tr>
      </table>
    </div>

    <div>
      <table>
        <tr>
        <th colspan=3 class="hdr">
        SETTINGS
        </th>
        </tr>
        <tr>
        <th colspan=3 class="hdr">
        Breakpoints
        </th>
        </tr>
        <tr>
        <td>Break 1 at $
        <input type="text" name="break1"   id="break1" value="300"/>
        </td>
        <td>
        </td>
        <td>Break 2 at $
        <input type="text" name="break2" id="break2" value="900"/>
        </td>
        </tr>
        <tr>
        <th colspan=3 class="hdr">
        Percentage levels
        </th>
        </tr>
        <tr>
        <td>
        Below break 1:
        <input type="text" size="4" name="per1" id="per1" value="50"/>%
        </td>
        <td>
        Between breaks 1 and 2:
        <input type="text" size="4" name="per2" id="per2" value="60"/>%
        </td>
        <td>
        Over break 2:
        <input type="text" size="4" name="per3" id="per3" value="70"/>%
        </td>
        </tr>
        <tr>
        <td>
        Artists:
        <input type="text" name="artlist" id="artlist" value="Brian,Eric,Christie,Cynthia,Shawn"/>
        </td>
        <td>
        </td>
        <td class="hdr">
        <button onclick="resetTable()">Update</button>
        </td>
      </tr>

    </div>
  </body>
</html>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多