gpt4 book ai didi

javascript - 选中复选框并使用 ajax 提交表单时,送货地址与帐单地址相同

转载 作者:行者123 更新时间:2023-12-01 01:03:17 26 4
gpt4 key购买 nike

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

当我在单击复选框之前传递表单时,该表单未提交。选中该复选框时,将为两种表单发送准确的数据,但当用户取消选中该复选框时,帐单地址会发布 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

最佳答案

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

  • 如果未单击该复选框,则不会为这些按钮单击设置事件处理程序。因此,单击按钮不会执行任何 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();
// }
}

关于javascript - 选中复选框并使用 ajax 提交表单时,送货地址与帐单地址相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55863228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com