使用jQuery .val()设置时在<input />中显示为NaN的数字

时间:2016-02-16 22:50:55

标签: javascript jquery

我正在尝试使用jQuery val()

设置输入字段的值
$('[name="paytype1"]').change(function(){
    var total = big_total();
    total = parseFloat(total);
    total = total.toFixed(2);
    console.log(total);
    if(isNaN(total)) {
        alert(total);   
    }
    $('[name="pay1amt"]').val(total);
})

浏览器中显示的所有内容都是NaN

正在运行console.log(total)会显示一个数字,例如61.00,没有触发警报。

big_total()函数正确返回数字(它根据其他输入字段中的数字计算)。

function big_total() {
    var big_total = 0;
    $('.total').each(function(i){
        big_total = big_total + parseFloat($(this).val());
    });
    big_total = big_total.toFixed(2)    
    return big_total;
}

在ajax调用之后,通过jQuery动态地将具有类total的输入添加到页面中。这是插入的html:

<div class="grid_12 alpha omega line-items">
    <div class="grid_1">CH02<input type="hidden" name="item_code[]" value="CH02">
        <input type="hidden" name="item_id[]" value="1458">
    </div>
    <div class="grid_3">
        DVA Regular consult
        <input type="hidden" name="item_desc[]" value="Subsequent consultation">
        <input type="hidden" name="type[]" value="Service">
    </div>
    <div class="grid_1">
        <input type="text" size="3" name="qty[]" value="1" class="qty" max-length="3">
    </div>
    <div class="grid_2">
        <input type="text" size="7" name="sub_total[]" value="61.00" class="sub-total">
    </div>
    <div class="grid_1">
        <select name="tax[]">
            <option value="$taxitems[ID]">0%</option>
            <option value="$taxitems[ID]">10%</option>
        </select>
    </div>
    <div class="grid_2">
        <input type="text" size="7" name="total[]" value="61.00" class="total" readonly="">
    </div>
    <div class="grid_1 omega">
        <div class="remove_stock_line"><img src="images/collapse.png"></div>
    </div>
</div>

这是触发功能的下拉列表:

<div class="grid_8 alpha omega">
    <div class="grid_3 alpha">
        <select name="paytype1" class="pay_type">
            <option default="" value="nill"></option>
            <option value="cash">cash</option>
            <option value="HICAPs">HICAPs</option>
            <option value="EFTPOS">EFTPOS</option>
            <option value="Visa">Visa</option>
            <option value="Mastercard">Mastercard</option>
            <option value="American Express">American Express</option>
            <option value="Other card">Other card</option>
            <option value="EFT">EFT</option>
            <option value="Cheque">Cheque</option>  
        </select>
    </div>
    <div class="grid_3 omega">
        <input type="text" size="10" name="pay1amt" value="" onclick="select();" class="pay_values">
    </div>              
</div>

思想?

2 个答案:

答案 0 :(得分:1)

这是有效的

function big_total() {
    var bg_total = 0;
    $('.total').each(function(i){
        bg_total = bg_total + parseFloat($(this).val());
    });
    big_total = bg_total.toFixed(2)    
    return bg_total;
}
$(document).ready(function(){
    $("[name='paytype1']").change(function(){
        var total = big_total();
        total = parseFloat(total);
        total = total.toFixed(2);
        console.log(total);
        if(isNaN(total)) {
            alert(total);   
        }
        $('input[name="pay1amt"]').val(total);
    });
});

<强>更新

big_total()函数中,$('.total')元素只是一个输出的类,其中一个是一个。为什么要使用$.each

$('.total').each(function(i){
    big_total = big_total + parseFloat($(this).val());
});
//you can just replace the use of .each above to this in the big_total function, except you have special reason for that
bg_total = bg_total + parseFloat(".total").val());
<input type="text" size="7" name="total[]" value="61.00" class="total" readonly="">

当你在问题And all that is being shown in the browser is NaN. Running console.log(total) shows a number, e.g. 61.00, and no alert is being triggered.

中说
  1. 仅当类.total的输入值以非数字开头时,才会显示NaN。只有当你期望if(isNaN(total)) {alert(total);}能够工作时才会这样。
  2. console.log(total)显示值61.00因为big_total()函数正确地返回了数字,但如果您已经处理了(it calculates from numbers in other input fields)
  3. ,这就是我不知道的

    除此之外,你的问题应该解决。

答案 1 :(得分:1)

此功能没有任何问题。但由于我们无法看到您的完整源代码,并且您尚未共享big_total函数,因此我们只能进行推测。根据我的个人经验,我只看到两种可能的情况。

  1. big_total()返回非数字值或具有前导非数字字符$4339,因为parseFloat()忽略除句点(。)之外的尾随非数字字符,例如:{{1}不会给你一个错误。但由于您没有在控制台或警报中看到任何错误,因此可以排除这种情况。
  2. 唯一的另一种解释是,代码的其他部分会覆盖此函数设置的值。
  3. 如果我是你,我会按照这些步骤进行调试 我会替换:
      83483a;lsdfad  
    用:
     var total = big_total()

    如果您在var total = 1234.56;中看到结果,则问题出在$('[name="pay1amt"]')。如果您仍然看到NaN,那么我会查看代码中的其他位置以查看值被覆盖的位置。

    这与问题无关,但非常重要。
    不要在函数big_total中使用变量名big_total。当从堆栈中存储和检索它们时,Javascript不区分函数和变量。括号指示解释器执行函数,而没有括号指示解释器将其作为变量引用(不执行它)。

    big_total()