【问题标题】:Javascript -- Why does one document.getElementById() work and not the other?Javascript——为什么一个 document.getElementById() 工作而不是另一个?
【发布时间】:2013-12-17 02:33:12
【问题描述】:

我正在创建一个交互式发票,我对编程非常陌生,但到目前为止一切都很好。我可以在各个网站上找到我最喜欢的东西,这是最好的。

在 HTML 中,我有各种表格,其中包含 40 个左右不同的输入字段,例如:

<tr>
<td><input type="text" id="idDescLine15" name="fDescLine15" size="50">  </td>
<td><input type="number" id="idQTY15" name="nQTY15" size="5">   </td>
<td><input type="number" id="idPrice15" name="nPrice15" size="5">   </td>
<td class="Checkbox"><input type="checkbox" id="idTax15" name="nTax1">  </td>
<td class="TotalCol"><p class="TotalLine" id="idTotalLine15">0.00</p>   </td>
</tr>

我有以下函数计算每行的总行数(数量 * 价格)。上面的 HTML 代码适用于第 15 行。所有其他设置都相同。

<script>
function Calculate()
{
    var vSTotalTax = 0;
    for (var i=1;i<16;i++)
    {
        var vbuildQTY = 'idQTY' + i;
        var vbuildPrice = 'idPrice' + i;
        var vbuildTotalLine = 'idTotalLine' + i;
        var vQTY=document.getElementById(vbuildQTY).value;
        var vPrice=document.getElementById(vbuildPrice).value;
        var vTotalLine = (vQTY * vPrice);
        document.getElementById(vbuildTotalLine).innerHTML = parseFloat(Math.round(vTotalLine * 100) / 100).toFixed(2);
        vSTotalTax = vSTotalTax + vTotalLine;
    }           
    document.getElementById(idSTotalTax).innerHTML = parseFloat(Math.round(vSTotalTax * 100) / 100).toFixed(2);
}
</script>

循环内的第一个“document.getElementById(vbuildTotalLine)”可以正常工作,并返回每一行的总数。

第二个“document.getElementById(idSTotalTax) 没有。它在 HTML 中的设置是一样的:

<tr>
<td><p class="TotalLabel">Sous-total taxable:</p></td>
<td class="TotalCol"><p class="TotalLine" id="idSTotalTax">0.00</p></td>
</tr>

当我单击“计算”按钮时,页面上显示第 238 行的 document.getElementById 为空或不是对象的错误。两者之间的唯一区别是它在不同表中的 HTML 位置。我尝试使用已经工作的“idTotalLine”字段之一,但我继续遇到同样的错误。

帮助。谢谢。

【问题讨论】:

  • 我相信你想传递 字符串 "idSTotalTax"。发生的情况是变量 idSTotalTax 已经引用了 ID 为 idSTotalTax 的元素,因此您将 DOM 元素作为参数传递给 getElementById,这将不起作用。
  • 您的 javascript 代码中的“idSTotalTax”是什么?
  • 我修改了 (idSTotalTax) 行以包含单引号并且它有效。谢谢。将您的评论作为答案,以便我接受。

标签: javascript html


【解决方案1】:

您已经拥有idSTotalTax DOM 元素。相反,您的意思是将其用作字符串,将其传递给getElementById。用引号括起来。否则,您会将 DOM 元素传递给 document.getElementById

document.getElementById("idSTotalTax").innerHTML

-- 感谢 Felix 和 Pointy 指出较早的问题。

【讨论】:

  • 有什么区别?请解释您的解决方案,不要只是发布代码。
  • 如果未定义idSTotalTax,代码将抛出ReferenceError
  • 没有。 idSTotalTax 只是未定义。它不会抛出错误。 document.getElementById(undefined) 的结果是 undefined。如果您输入了idSTotalTax.SomeProperty,那么您将收到关于idSTotalTax 不存在的错误。
  • 如果“idSTotalTax”真的是undefined,肯定会报错。但是,在这种情况下,它不是 undefined,因为它是元素的“id”,因此自动成为window 对象的属性。
  • 您假设 idSTotalTax 的值是 undefined,因为它没有在任何地方声明 (var idSTotalTax = ...)。但如果是这样的话,代码会抛出一个ReferenceError。请参阅:jsfiddle.net/gU2yb。我的意思是,idSTotalTax 已定义,但它没有所需的值。
【解决方案2】:

工作调用getElementById(vbuildTotalLine) 查找id变量的字符串值 vbuildTotalLine 的元素。在这种情况下,对于介于 1 和 15(含)之间的 N 的某个值,这将是“idTotalLineN”。您可以在 HTML 中看到没有带有 id="vbuildTotalLine" 的元素。

非工作调用getElementById(idSTotalTax) 类似地查找id变量的字符串值 idSTotalTax 的元素,但我在任何地方都看不到变量idSTotalTax你的代码。如果要查找 id 为文字字符串“idSTotalTax”的文档,则需要将该值 as 传递为字符串,而不是您甚至不声明或分配的变量的名称.你可以用这样的代码做到这一点:

getElementById('idSTotalTax')

或者,为了与第一部分保持一致,

var vbuildTotalTax = 'idSTotalTax';
...
getElementById(vbuildTotalTax);

【讨论】:

    【解决方案3】:

    这里有一个解决方案,女巫让你不用担心 id 的问题。

    var tr=document.getElementsByTagName('tr'),trl=tr.length,total=0;
    
    while(trl--){
     var td=tr[trl].getElementsByTagName('td'),
     v=td[1].firstChild.value*td[2].firstChild.value;
     td[4].firstChild.textContent=v.toFixed(2);
     total+=v;
    }
    totalBox=total.toFixed(2);
    

    注意:使用 firstChild,&lt;td&gt;&lt;input&gt; 之间不能有空格

    所以你可以写这样的东西:

    <tr>
    <td><input type="text" name="desc[]" size="50"></td>
    <td><input type="number" name="qty[]" size="5"></td>
    <td><input type="number" name="price[]" size="5"></td>
    <td class="Checkbox"><input type="checkbox" name="tax[]"></td>
    <td class="TotalCol"><p></p></td>
    </tr>
    

    如果您发布此表格

    你会得到一个这样的数组:

    $_POST={
     desc:[
       item1,//item1
       item2 //item2
      ]
     qty:[
       1,//item1
       2//item2
      ]
     price:[
       20,//item1
       25//item2
      ]
     tax:[
       true,//item1
       false//item2
      ]
    }
    

    您可以在表单本身上添加计算功能。

    所以:

    document.forms[0].addEventListener('keyup',calculate,false);
    

    示例

    http://jsfiddle.net/gwtmM/

    【讨论】:

      猜你喜欢
      • 2012-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多