我正在尝试遍历我的总计,以获得我的网络应用程序的总计。到目前为止,我正在使用的代码如下:
function calcAllFields() {
var name = parseFloat($('div [name = total[]]').text());
var totArray = $.makeArray(name);
var total = 0;
for (var i = 0; i < totArray.length; i++) {
total += totArray[i];
}
$("#target1").text(total);
}
不是添加整数,而是将某些内容作为字符串读取。说我要加200 + 50,而不是250我得到20050.谁能指出我做错了什么?谢谢!
答案 0 :(得分:6)
使用parseInt
确保您没有连接字符串。
E.g:
total += parseInt(totArray[i], 10);
答案 1 :(得分:2)
您可以cast to a number使用+
或Number()
:
(+"200") + (+"50") //-> 250
Number("200") + Number("50") //-> 250
total += +totArray[i];
就个人而言,我更喜欢在许多情况下使用+
而不是parseInt / parseFloat,因为只要字符串以数字开头,这些函数就会返回一个数字,例如1,000将解析为1. +“1,000”将返回NaN,这是更理想的IMO。您也不必担心基数,因为+“010”不会被视为八进制。
答案 2 :(得分:2)
div[name=total[]]
可能包含多个元素,因此可能会导致一些奇怪的行为。试试这个:
function calcAllFields() {
var total = 0;
$('div[name=total[]]').each(function() {
total += parseFloat($(this).text());
}
$("#target1").text(total);
}
答案 3 :(得分:1)
total+= parseInt(totArray[i]);
答案 4 :(得分:0)
我很惊讶你已经到了20050
。代码应该根本不起作用。
$('div [name = total[]]')
首先,这不是一个有效的选择器。您必须转义或引用属性选择器,否则其中的第一个]
将关闭选择器,留下无效的尾随秒]
。
它只是起作用,因为jQuery / Sizzle中的选择器解析中有一个怪癖(bug)。但是因为它是非标准的,(a)它可能在未来中断,并且(b)它不会利用现代浏览器中的快速原生querySelectorAll
。更好:
$('div [name="total[]"]')
然而,你需要jQuery 1.4,因为jQuery 1.3的属性选择器解析更加错误并打破了这种情况。
最好避免所有这些问题,只需为这些元素分配一个class
,然后再选择它。
$('div [name = total[]]').text()
div
中有name="total[]"
的元素是什么?我认为它们是某种形式控件,否则name
属性将无效。但text()
不是阅读表单控件的正确方法。它为您提供元素标签内的文本内容,而不是字段的当前值。
<input>
没有文字内容。 <textarea>
确实有文字内容,但不一定与字段的值相同。文本内容(如value
的{{1}}属性)是字段的默认值,而不是当前值。您应该使用<input>
来读取当前值。
val()
这没用。通过调用选择器包装器对象上的var totArray = $.makeArray(name);
,您已经丢弃了那里的多个元素,将它们转换为一个文本字符串。你不能从字符串中取回它们。所有text()
都会给你一个包含该单个字符串作为项目的数组。
您需要做的是分别依次读取每个输入的值,以便将它们一起添加。
makeArray
(根据Andy的回答,var total= 0;
$('div [name="total[]"]').each(function() {
total+= +$(this).val();
});
$("#target1").text(total);
将值字符串转换为整数。)