【问题标题】:Shipping address same as Billing Address when checkbox is checked and submit form using ajax选中复选框并使用 ajax 提交表单时,送货地址与帐单地址相同
【发布时间】:2019-04-27 03:01:46
【问题描述】:

我有两个地址表格。一个是计费,另一个是运输。当用户选中“运送到同一地址”复选框时,运送表单被隐藏。

当我在点击复选框之前通过表单时,表单没有提交。当复选框被选中时,两个表单都会发送准确的数据,但是当用户取消选中复选框时,帐单地址会发布 3 次。

我使用 jQuery 和 ajax 代码提交表单。

    $(document).ready(function(){

      $('.le-checkbox').click(function(){

        if(this.checked) {
          $("#deliveryadd").hide();
          $(".le-checkbox").attr("checked", "checked");
          $('#submit').click(function(){
            var address= $('#address').val();
            var city_id= $('#city_id').val();
            var user = {{Auth::user()->id}};
            console.log(address,city_id,user);
            console.log(address,city_id,user);
            billing(address,city_id,user);
            shipping(daddress,dcity_id,user);
          });
        } 
        else {
          $("#deliveryadd").show();
          $(".le-checkbox").removeAttr("checked");
          $('#submit').click(function(){
            var address= $('#address').val();
            var city_id= $('#city_id').val();
            var user = {{Auth::user()->id}};
            console.log(address,city_id,user);
            billing(address,city_id,user);
          });
          $('#deliverySubmit').click(function(){    
            var daddress= $('#de_address').val();
            var dcity_id= $('#de_city_id').val();
            var user = {{Auth::user()->id}};
            console.log(daddress,dcity_id,user);    
            shipping(daddress,dcity_id,user);
          });
        }

      });

      function billing(baddress,bcity,buser){
        $.ajaxSetup({
          headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          }
        });
        $.ajax({
          url: '{{url("/billing-address")}}',
          type: 'post',
          dataType: 'html',
          data: {
            address:baddress,
            city_id:bcity,
            user_id:buser
          },
          success: function(result){
            $('#billing').html(result);
          }
        }).fail(function(jqXHR, textStatus, error){
          console.log(jqXHR.responseText);
        });
      }

      function shipping(saddress,scity,suser){
        $.ajaxSetup({
          headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
          }
        });
        $.ajax({
          url: '{{url("/shipping-address")}}',
          type: 'post',
          dataType: 'html',
          data: {
            address:saddress,
            city_id:scity,
            user_id:suser
          },
          success: function(result){
            $('#shipping').html(result);
          }
        }).fail(function(jqXHR, textStatus, error){
          console.log(jqXHR.responseText);
        });
      }
    });

这是运输表格代码


        <h2 class="border h1">shipping address</h2>
        @if(App\Address::where('user_id',Auth::user()->id)->where('type','Delivery')->exists())
        <address class="bold" id="addr">
            @foreach ($collection = Auth::user()->address as $item)
            @if ($item->type == 'Delivery')
                {{$item->street}},<br>
                {{$item->city->name}},<br>
                {{$item->city->parent->name}}
                @endif    
            @endforeach
            </address>
        @else
    <div class="billing-address" id="deliveryadd">
                               <div class="row field-row">
                                <div class="col-xs-12">
                                    <label>address*</label>
                                    <input class="le-input" type="text" id="de_address" data-placeholder="Street address" name="de_address">
                                </div>
                            </div><!-- /.field-row -->

                            <div class="row field-row">
                                <div class="col-xs-12 col-sm-6">
                                    <label>City*</label>
                                    <select class="le-input">
                                        <option>Lahore</option>
                                    </select>
                                </div>
                                <div class="col-xs-12 col-sm-6">
                                    <label>&nbsp;</label>
                                    <select class="le-input" id="de_city_id">
                                    <option value="null">Select Town</option>
                                    @foreach ($collection = App\City::where('parent_id','!=', '0')->get() as $item)
                                    <option value="{{$item->id}}">{{$item->name}}</option>
                                    @endforeach
                                </select>
                                </div>
                            </div><!-- /.field-row -->

                            <button id="deliverySubmit" class="le-button big">Save</button>
        </div><!-- /#shipping-address -->
        <div class="row field-row">
                <div class="col-xs-12">
                    <input name="same" class="le-checkbox big" type="checkbox" />
                    <a class="simple-link bold" href="#">ship to Same address?</a>
                </div>
            </div><!-- /.field-row -->
            @endif

这是账单表单 HTML 代码

<h2 class="border h1">billing address</h2>
{{-- <a style="float: right;" href="javascript:;" id="edit">Edit</a> --}}
                @if(App\Address::where('user_id',Auth::user()->id)->where('type','Billing')->exists())
                <address class="bold" id="addr">
                    @foreach ($collection = Auth::user()->address as $item)
                    @if ($item->type == 'Billing')
                        {{$item->street}},<br>
                        {{$item->city->name}},<br>
                        {{$item->city->parent->name}}
                        @endif    
                    @endforeach
                    </address>
                @else
                    <div class="row field-row">
                        <div class="col-xs-12">
                            <label>address*</label>
                            <input class="le-input" type="text" id="address" data-placeholder="Street address">
                        </div>
                    </div><!-- /.field-row -->

                    <div class="row field-row">
                        <div class="col-xs-12 col-sm-6">
                            <label>City*</label>
                            <select class="le-input">
                                <option>Lahore</option>
                            </select>
                        </div>
                        <div class="col-xs-12 col-sm-6">
                            <label>&nbsp;</label>
                            <select class="le-input" id="city_id">
                            <option value="null">Select Town</option>
                            @foreach ($collection = App\City::where('parent_id','!=', '0')->get() as $item)
                            <option value="{{$item->id}}">{{$item->name}}</option>
                            @endforeach
                        </select>
                        </div>
                    </div><!-- /.field-row -->

                    <button id="submit" class="le-button big">Save</button>
                @endif

【问题讨论】:

  • 我对您的问题进行了临时编辑,以使其更加清晰。我希望我正确理解了你的意思。 (如果您还可以包含 HTML 标记,它可能会帮助人们提供有用的答案。)
  • 谢谢猫,我会用 HTML 代码更新

标签: javascript jquery ajax


【解决方案1】:

当单击复选框时,您的代码正在为单击提交按钮分配事件处理程序。这意味着:

  • 如果未单击复选框,则不会为这些按钮单击设置事件处理程序。因此,单击按钮不会执行任何 JS 提交操作 - 但它可能会执行正常的非 JS 表单提交;

  • 如果您单击复选框一次,例如勾选它,您将添加一个事件处理程序到您的#submit 按钮。如果您现在取消选中该复选框,您会将 另一个 事件处理程序添加到您的 #submit 按钮,并在您的 #deliverySubmit 按钮上添加一个!取消选中该复选框不会删除您之前添加的事件处理程序。因此,如果您单击#submit,两个处理程序都会触发。如果您多次勾选和取消勾选复选框,您只会不断堆积额外的事件处理程序,所有将在您最终单击按钮时运行。

这不是一个好方法。相反,您应该设置独立于用户交互的事件处理程序,并让代码根据复选框状态确定要做什么。

其他一些观察:

  • 要跟踪复选框的点击,您应该使用$('.le-checkbox').on('change', function() {,而不是click

  • 我不知道你为什么在勾选复选框时手动设置复选框状态(例如$(".le-checkbox").attr("checked", "checked");)?我不会那样做,它肯定会导致问题,实际上并没有做任何事情。

  • 在您的#submit 处理程序中勾选复选框时,您有shipping(daddress,dcity_id,user);,但未设置这些变量。如果勾选了复选框,那么运费 == 计费,所以我认为您的意思是 shipping(address, city_id, user);,对吧?

  • 我不确定为什么您的复选框文本是实际链接?这只会使事情复杂化 - just use a label,因此单击文本将正确切换复选框。

  • 您没有向我们展示您的#submit 按钮 HTML,所以我不知道 - 为什么您有 2 个按钮?一个还不够吗?

把所有这些放在一起,试试这样的事情:

$('#submit').click(function(){
    var $checkbox=$('.le-checkbox'),
        address= $('#address').val(),
        city_id= $('#city_id').val(),
        daddress= $('#de_address').val(),
        dcity_id= $('#de_city_id').val(),
        user = {{Auth::user()->id}};

    // Billing address is always sent, no matter the checkbox state
    billing(address, city_id, user);

    // Shipping address depends on checkbox state
    if ($checkbox.is(':checked') {
        shipping(address, city_id, user);
    } else {
        shipping(daddress, dcity_id, user);
    }
});


$('.le-checkbox').on('change', function(){
    $("#deliveryadd").toggle();
    // .toggle() is simpler than .show() and .hide()
    // if (this.checked) {
    //     $("#deliveryadd").hide();
    // } else {
    //     $("#deliveryadd").show();
    // }
}

【讨论】:

  • 我习惯于输入表单,这就是为什么我使用两个保存按钮 #submit 按钮保存帐单地址,如果未选中复选框,则使用 #deliverysubmit 按钮保存收货地址
  • 不是我更新帐单地址HTML代码你可以理解面糊并给我你的良好回应谢谢
  • 谢谢伙计,它对我有一点点改变
  • 太好了,很高兴它有帮助! :-) 我正在回滚您对我的代码所做的编辑。我了解您需要对其进行更改以供使用,这很好,我很高兴您能够使其正常工作。但是在 SO 上,我的答案应该代表 my answer,而不是您最终使用的最终结果。如果有错误当然请告诉我,我会修复它! :-)
  • 不是问题,我知道这是你的答案,永远是你的。感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 2021-04-05
  • 2022-01-21
相关资源
最近更新 更多