我有一个动态生成的表,每行产生如下内容:
<tr name="0">
<td style="text-align:left;">January</td>
<td><input type="text" name="LIB1" value="0" class="oneInput row0" /></td>
<td><input type="text" name="RPI1" value="0" class="oneInput row0" /></td>
<td><input type="text" name="LMM1" value="0" class="oneInput row0" /></td>
<td><b><span class="screenOneTotal">0</span></b></td>
</tr>
当输入值时,我需要将每个输入的总数放在最后一列的行中。因此,我将此函数放在document.ready函数
中$(".oneInput").live('blur', function(){
var rowID = $(this).parent().parent().attr( 'name' );
var thisLIB = $("input[name=LIB + rowID]" ).val();
var thisRPI = $("input[name=RPI + rowID]").val();
var thisLMM = $("input[name=LMM + rowID]").val();
var rowTotal = parseFloat(thisLIB) + parseFloat(thisRPI) + parseFloat(thisLMM);
$(this).parent().parent().find( 'span.screenOneTotal').empty().html( parseFloat(rowTotal) );
});
尽管我明确地将每个值都转换为float,但插入最后一列的值是“NaN”。
答案 0 :(得分:3)
$("input[name=LIB + rowID]" ).val()
看起来不正确。
您的意思是$("input[name=LIB" + rowID + "]" ).val()
吗?
如果您的选择器失败,则.val()
为空,parseFloat
将为您提供NaN
。
答案 1 :(得分:2)
除Tomalak的答案外,属性选择器也应该用引号括起来。您的示例还显示行的名称属性为0
,但其子项为LIB1,LPT1和LMM1,因此它们需要位于name='1'
var thisLIB = $("input[name='LIB" + rowID+"']" ).val();
答案 2 :(得分:1)
我认为你过于复杂(并且同时使它们复杂化)。你过度复杂的是,你正在寻找三个具体的东西,当你可以抓住符合特定模式的所有东西并将它们视为一个群体时,单独对待它们。你的不足之处在于你没有考虑来自parseFloat
的失败条件和NaN的奇怪(直到你已经习惯了)。
我认为你最好在DOM上找到包含<tr>
并迭代该行中的所有.oneInput
元素,然后你可以使用一小块代码来将字符串值转换为合理的数字:
$(".oneInput").live('blur', function() {
var $row = $(this).closest('tr');
var rowTotal = 0;
$row.find('input.oneInput').each(function() {
var n = parseFloat(this.value);
if(!isNaN(n))
rowTotal += n;
});
// Do whatever you need to do with rowTotal
});
closest
调用将在DOM上找到包含<tr>
的内容,然后find
将获取该行中具有类的所有<input>
元素oneInput
,然后循环使用each
的人,使用parseFloat
直接从<input>
DOM元素中提取每个值,并将其添加到rowTotal
中的运行总计中如果parseFloat
找到了一个数字(而isNaN
就是你要检查的parseFloat
是否给了你一个NaN)。