2010-01-29 152 views
3

我试着用下面的功能来查找表单字段的值,原因其循环是因为动态的形式变化,这意味着有可能是在外地的Javascript功能不能正常工作

的Java脚本函数的ID差距是

function totalProductPrice() { 
     var maxid = document.getElementById("field_id").value; 
     var i = 0; 
     var totalprice = 0; 

     while (i<=maxid) 
      { 
       totalprice += document.getElementById("QuoteItem" + i + "price").value; 
       i++; 
      } 

     document.getElementById("QuoteTotalcost").value = totalprice; 
    } 

,然后在输入字段中的一个,我有

onchange='totalProductPrice();' 

当我改变这个字段的值应该加起来的所有字段,然后我nsert成所谓QUoteTotalcost但是当我尝试它什么也不做的领域,在Firebug的控制台它输出

element.dispatchEvent is not a function 
[Break on this error] element.dispatchEvent(event); 
prototype.js (line 4619) 
document.getElementById("QuoteItem" + i + "price") is null 
[Break on this error] totalprice += document.getElementById("QuoteItem" + i + "price").value; 
+0

该ID似乎从萤火虫错误无效。你确定你有ID为“QuoteItem1price”,“QuoteItem2price”等元素。你是否检查区分大小写? – Anurag 2010-01-29 11:33:39

+0

是的,我检查了一遍又一遍,只是确保我不会疯狂.. ID会根据已创建和删除的内容而有所不同 - 即在某些情况下,第一个有效的将是QuoteItem4price,因此它应该能够跳过那些前3没有任何问题,我会想像 – kwhohasamullet 2010-01-29 11:37:59

回答

4

它确实是因为你想空对象上阅读的属性。你需要检查对象是否存在。

while (i <= maxid) { 
    var item = document.getElementById("QuoteItem" + i + "price"); 
    if (item != null) { 
    totalprice += parseFloat(item.value); 
    } 
} 

虽然这是一种有点粗略的总计方法。它通常最好使用类这样的事情:

<input type="text" class="quote-item-price"> 

有:

var items = document.getElementByTagName("input"); 
for (var i=0; i<items.length; i++) { 
    if (items[i].className == "quote-item-price") { 
    totalprice += parseFloat(items[i].value); 
    } 
} 

这样,你不必使用标识周围乱,以确保它们是独一无二的,等等。

编辑:你已经用jQuery标记了你的问题。使用jQuery它要简单得多。

var totalprice = 0; 
$("input.quote-item-price").each(function() { 
    totalprice += parseFloat($(this).val()); 
    // or 
    totalprice += parseFloat(this.value); 
}); 

编辑2:表单字段值是字符串。如果你使用+这是一个字符串连接。我已经修改了上面的内容来呼叫parseFloat()将任何值转换为数字。您可能需要使用toFixed()将其转换为固定的小数位数:

totalprice = totalprice.toFixed(2); 
+0

感谢它解决了错误和它现在被传递到总价格领域,但增加了价值观它只是将其附加到前一个,任何想法? – kwhohasamullet 2010-01-29 11:56:27

+0

谢谢你 - 对不起,我没有意识到来自PHP的差异,它适用于你,干杯:D – kwhohasamullet 2010-01-29 12:22:27