【问题标题】:jquery selector is not finding dynamically inserted inputjquery 选择器没有找到动态插入的输入
【发布时间】:2012-11-21 04:45:25
【问题描述】:

我有一个带有货币值输入字段的表单,它们的值在 keyup 事件上加在一起,并且总插入另一个输入字段。这工作正常。

<table id="itemsqty"><tr><th style="min-width: 4em;">Qty</th><th style="min-width: 10em;">Description</th><th style="width: 4em;">Price</th></tr>
<tr><td><select name="qty[]" id="qty0"><option selected="selected">1</option>    <option>2</option><option>3</option><option>4</option><option>5</option></select></td><td>    <input placeholder="Enter item name in here" type="text" name="item[]" id="item0" /></td>    <td><input class="itemprice" placeholder="Total price for this item" type="text"      name="itemprice[]" id="itemprice0" /></td></tr>
<tr><td><select name="qty[]" id="qty1"><option selected="selected">1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></td><td><input placeholder="Enter item name in here" type="text" name="item[]" id="item1" /></td><td><input class="itemprice" placeholder="Total price for this item" type="text"  name="itemprice[]" id="itemprice1" /></td></tr>
<tr><td><select name="qty[]" id="qty2"><option selected="selected">1</option>   <option>2</option><option>3</option><option>4</option><option>5</option></select></td><td>  <input placeholder="Enter item name in here" type="text" name="item[]" id="item2" /></td><td><input class="itemprice" placeholder="Total price for this item" type="text"  name="itemprice[]" id="itemprice2" /></td></tr>
<tr id="totalrow"><td><a href="javascript:;" id="addanotherlnk">Add another item</a></td><td style="text-align: right;padding-right: 7px;float: right;"><label for="gtotal" >Total:</label></td><td><input readonly type="text" name="gtotal" id="gtotal" value="£0.00" /></td></tr></table>

使用此脚本更新总输入字段(#gtotal)的值,并且工作正常:

$('.itemprice').live("keyup", function (event) {
    var t = 0;
    for (var ip=0; ip <3; ip++){
        a = $('#itemprice'+ip).val();
        a = a.replace("£","");
        //t = t + a;
        t = Number(t) + Number(a);
    }

    //then add all values
    $('#gtotal').val('');
    var formattedMoney = '£' + t.formatMoney(2,',','.');
    $('#gtotal').val(formattedMoney);
});

然后,用户可以使用触发此脚本的链接添加新字段:

$('#addanotherlnk').click(function(){
    //count number of items of same class
    var ic;
    ic = $('.itemprice').length;

    $('<tr><td><select name="qty[]" id="qty'+ic+'"><option selected="selected">1</option><option>2</option><option>3</option><option>4</option><option>5</option></select></td><td><input placeholder="Enter item name in here" type="text" name="item[]" id="item'+ic+'" /></td><td><input class="itemprice" placeholder="Total price for this item" type="text"  name="itemprice[]" id="itemprice'+ic+'" /></tr>').insertBefore('#totalrow');
});

这很好用,并为输入添加了一个唯一的 ID/但是,更新总数的脚本似乎无法识别这个新的输入字段。我知道这与这是一个动态添加的字段有关,因此我使用 jquery .live() 方法,但这并没有解决问题。

非常感谢所有帮助。

【问题讨论】:

    标签: jquery dynamic field


    【解决方案1】:

    您的 keyup 处理程序被编码为仅循环前 3 个元素 - 您已硬编码限制为 3:

    for (var ip=0; ip <3; ip++){
    

    相反,您应该使用“itemprice”类遍历所有元素:

    var t = 0;
    $('.itemprice').each(function() {
        t += Number( this.value.replace("£","") );
    }
    

    【讨论】:

    • 哦,是的。我忘记了那个 for 循环。我本来打算用 $('.itemprice').length; 替换 ip
    • 不客气。请注意,如果您有一组这样的元素可以通过它们的公共类进行处理,那么您根本不需要给它们一个 id 属性(当然它们仍然需要一个 name提交时)。
    【解决方案2】:

    您的问题是...您在 for 循环中对 3 进行了编码...因此它采用 3 输入的值,而动态添加的输入实际上并未添加到总数中...

    我建议你创建一个函数来进行总计算.....并在 keyup 函数中调用它

    试试这个:

    function sumItemprice()  // function to calculate the sum
    {
       var sum=0;
       $.each($('input.itemprice'),function(){ //select all ur input with the classname
         //add only if the value is number
          if(!isNaN($(this).val()) && $(this).val().length!=0)
          {
              sum += parseFloat($(this).val());  // DO YOUR STUFF HERE (REPLACE or sumthing..)
          }
       });
    
      $('#gtotal').val(sum);
    }
    

    和keyup功能

    $('.itemprice').bind("keyup",sumItemprice);
    

    注意:live() 已弃用,建议使用 on()。

    【讨论】:

    • “我建议你创建一个进行总计算的函数” - OP 已经有一个函数来进行计算,即传递给 @ 的匿名函数987654323@ - 创建一个单独的函数 使用匿名函数调用它是没有意义的。 .live() 已被弃用是正确的,但你为什么建议 .keyup() 只为当时存在的元素创建处理程序?
    • 是的......我同意......在这种情况下不需要创建一个单独的函数......你可以做我在keyup函数内的函数中所做的......但仍然没有创建函数的危害....函数可能会派上用场,如果 OP 在其他情况下也必须进行总计,而不是再次编写整个总结的事情...我更喜欢创建一个函数,所以我建议。 . :)
    • 当然。但是,如果使用另一个函数,则直接将其与.keyup(sumItemprice) 绑定,或者考虑到 OP 对委托处理程序的要求,$(document).on('click','.itemprice',sumItemprice); - 如果它唯一要做的事情就是调用另一个函数,则不需要仍然有匿名函数。跨度>
    猜你喜欢
    • 1970-01-01
    • 2012-05-02
    • 2012-01-21
    • 1970-01-01
    • 2016-08-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多