【问题标题】:How to bind event for dynamically created elements in JQuery如何在 JQuery 中为动态创建的元素绑定事件
【发布时间】:2017-12-21 15:43:37
【问题描述】:

我已经使用 jquery 创建了一些动态元素,并在动态元素中使用 ajax 添加了一个下拉列表,问题是当我从下拉列表中选择一个选项时,接下来的 ajax 数据将覆盖所有其他动态元素数据。

现在我想在 jquery 中分别绑定每个动态元素数据。

  $(document).ready(function() {
  var html = $("#dsp > .row:first").first().html();
  var maxrows = 5;
  var x = 1;
  $("#addrow").click(function() {
    if (x <= maxrows) {
      $('#dsp').append(html);
      x++;
    }
  });

  $("#rmvrow").click(function() {
    $('#dsp').children().last().remove();
  });
  
    $('#dsp').on('change','.p_name',function(){
      var pid=$(this).val();
      var parent=$('#dsp');
      
      //alert(pid);
      $.ajax({
        url:"{{route('getinfo')}}",
        method:'post',
        data:{id:pid,'_token':"{{csrf_token()}}"},
        success:function(response) {  
            console.log(parent.find('.p_code').val(response.code));
  
        }
      });

    });
});


  
           <div id="dsp">
  <div class="row">
    <div class="col-md-2">
      <select name="p_name[]" class="form-control p_name">
      <option value="">-Select Product-</option>
      @foreach($products as $product)
      <option value="{{$product->product_id}}">{{$product->name}}</option>
      @endforeach
    </select>
    </div>
    <div class="col-md-2">
      <input type="text" name="p_code[]" class="form-control p_code">
    </div>
    <div class="col-md-2">
      <input type="text" name="unit_pctn[]" class="form-control unit_pctn" readonly="">
    </div>
    <div class="col-md-2">
      <input type="text" name="u_price[]" class="form-control u_price" readonly="">
    </div>
    <div class="col-md-1">
      <input type="text" name="ctn[]" class="form-control ctn">
    </div>
    <div class="col-md-1">
      <input type="text" name="pcs[]" class="form-control pcs">
    </div>
    <div class="col-md-2">
      <input type="text" name="t_amt[]" class="form-control t_amt">
    </div>

  </div><br>
</div>

【问题讨论】:

    标签: javascript jquery html ajax


    【解决方案1】:

    继续为每一行提供动态 id 并使用它来添加侦听器。

    在每个添加行上调用一个函数

    function addrow(rownumber) {
        document.getElementById('dsp' + rownumber).addEventListener('click', function(event) {
            // do some action
        });
    }
    

    【讨论】:

    • 他已经在使用jQuery委托了,为什么要改成这种风格?
    • 不管是 Jquery 还是 javascript。他仍然可以通过两种方式动态添加侦听器。我只是给出了一种可能的解决方案。我猜他的问题是“如何为 JQuery 中动态创建的元素绑定事件”
    • 您是否阅读了问题并理解了他遇到的问题?您的答案如何解决他在执行 AJAX 调用时会在所有行中填写响应的问题?
    【解决方案2】:

    您用于委派事件绑定的代码很好。问题是您的第二个success 函数没有将响应放在当前行中,而是填写了所有.u_price 字段。将其更改为:

    parent.find(".u_price").val(response.client_price);
    

    当您添加新行时,它需要在自己的&lt;div class="row"&gt; 内,以便$(this).closest(".row") 选择正确的行。您目前只有一个class="row",它是包含所有行的#dsp DIV。每行都必须是#dsp 的子代。

    $(document).ready(function() {
      var html = $("#dsp > row:first").first().html();
      var maxrows = 5;
      var x = 1;
      $("#addrow").click(function() {
        if (x <= maxrows) {
          $('#dsp').append(html);
          x++;
        }
      });
    
      $("#rmvrow").click(function() {
        $('#dsp').children().last().remove();
      });
    });
    <div id="dsp">
      <div class="row">
        <div class="col-md-2">
          <select name="p_name[]" class="form-control p_name">
          <option value="">-Select Product-</option>
          @foreach($products as $product)
          <option value="{{$product->product_id}}">{{$product->name}}</option>
          @endforeach
        </select>
        </div>
        <div class="col-md-2">
          <input type="text" name="p_code[]" class="form-control p_code">
        </div>
        <div class="col-md-2">
          <input type="text" name="unit_pctn[]" class="form-control unit_pctn" readonly="">
        </div>
        <div class="col-md-2">
          <input type="text" name="u_price[]" class="form-control u_price" readonly="">
        </div>
        <div class="col-md-1">
          <input type="text" name="ctn[]" class="form-control ctn">
        </div>
        <div class="col-md-1">
          <input type="text" name="pcs[]" class="form-control pcs">
        </div>
        <div class="col-md-2">
          <input type="text" name="t_amt[]" class="form-control t_amt">
        </div>
    
      </div>
    </div>

    【讨论】:

    • 显示的是产品代码,但不能单独绑定pcode字段。
    • 我不确定您所说的“单独绑定 pcode 字段”是什么意思。
    • 它是否显示client_price?如果没有,您的 getprice API 有问题,它没有返回所需的信息。
    • 当我从下拉列表中选择产品名称时,它是通过 ajax 请求获取产品代码。问题是我无法单独分配产品代码,因为最后选择的产品代码会覆盖其他字段产品代码。请看这张图片:i.imgur.com/9DXq0T2.png
    • 我的回答只解决了产品价格的问题。看起来您已经为 .p_code.unit_pctn 正确地做这件事了。
    【解决方案3】:

    试试这种方式。以这种方式绑定数据并计算总数也可以。

        $(document).ready(function(){
        $('#dsp').on('change','.p_name',function(){
          var pid=$(this).val();
          var parent= $(this).closest('.row');
          //alert(pid);
          $.ajax({
            url:"{{route('getinfo')}}",
            method:'post',
            data:{id:pid,'_token':"{{csrf_token()}}"},
            success:function(response) {   
    
              //alert(response.code);
              parent.find('.p_code').val(response.code);
              parent.find('.unit_pctn').val(response.pcs_per_ctn);
            }
          });
    
            $.ajax({
            url:"{{route('getprice')}}",
            method:'post',
            data:{id:pid,'_token':"{{csrf_token()}}"},
            success:function(response) {
              //alert(response.code);
    
              parent.find('.u_price').val(response.client_price);
    
            }
          });
    
    
    
        });
    
        //calculation here
    
        $('#dsp').on('input','.ctn',function(){
             var cal=$(this).val();
             var gparent=$(this).closest('.row');
             var unitp=gparent.find('.u_price').val();
             var unitpctn=gparent.find('.unit_pctn').val();
             var pcs=gparent.find('.pcs').val();
            //alert(pcs);
            var total=(((parseInt(unitpctn)*parseInt(cal)) + parseInt(pcs))*parseInt(unitp));
    
               gparent.find('.t_amt').val(total);
    
               //grand total
               var gtotal=0;
               var gtotal=parseInt(gtotal)+parseInt(total)
               //alert(gtotal);
               $('#tot').val(gtotal);
    
    
        });
    
         $('#dsp').on('input','.pcs',function(){
             var pcs=$(this).val();
             var gparent=$(this).closest('.row');
             var unitp=gparent.find('.u_price').val();
             var unitpctn=gparent.find('.unit_pctn').val();
             var ctn=gparent.find('.ctn').val();
            //alert(pcs);
            var total=(((parseInt(unitpctn)*parseInt(ctn)) + parseInt(pcs))*parseInt(unitp));
    
               gparent.find('.t_amt').val(total);
    
               //grand total
    
               var gtotal=0;
               $('.t_amt').each(function(){ gtotal += parseFloat($(this).val()) || 0; $('#tot').val(gtotal); }); 
             });
    
      });
    

    【讨论】:

      猜你喜欢
      • 2013-07-07
      • 2020-09-29
      相关资源
      最近更新 更多