虽然每个值都是强制转换的,但jQuery Formula会发布'NaN'

时间:2011-08-14 00:59:55

标签: jquery

我有一个动态生成的表,每行产生如下内容:

 <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”。

3 个答案:

答案 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)。

像这样:http://jsfiddle.net/ambiguous/DBQL3/